From 7fa1b177718d87c4463601e83be8a3732229225f Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 17 May 2018 17:12:03 +0200 Subject: [PATCH 01/60] Some initial work on RPC and client --- Cargo.lock | 91 +++++++++++---------- substrate/client/src/backend.rs | 19 +++-- substrate/client/src/blockchain.rs | 28 ++++--- substrate/client/src/lib.rs | 1 + substrate/rpc-servers/Cargo.toml | 8 +- substrate/rpc/Cargo.toml | 6 +- substrate/rpc/src/chain/mod.rs | 6 +- substrate/runtime/primitives/src/generic.rs | 15 ++++ substrate/state-machine/src/lib.rs | 4 - 9 files changed, 105 insertions(+), 73 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 976b1ea5ee5d2..23b91932fa367 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -348,7 +348,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -454,7 +454,7 @@ dependencies = [ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -657,14 +657,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "globset" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -753,7 +753,7 @@ dependencies = [ "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.11.25 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-retry 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -801,7 +801,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "jsonrpc-core" version = "8.0.2" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" dependencies = [ "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -813,11 +813,11 @@ dependencies = [ [[package]] name = "jsonrpc-http-server" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" dependencies = [ "hyper 0.11.25 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", - "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -826,19 +826,19 @@ dependencies = [ [[package]] name = "jsonrpc-macros" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" dependencies = [ - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", - "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-pubsub" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" dependencies = [ - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -846,11 +846,11 @@ dependencies = [ [[package]] name = "jsonrpc-server-utils" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" dependencies = [ "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "globset 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", + "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -859,11 +859,11 @@ dependencies = [ [[package]] name = "jsonrpc-ws-server" version = "8.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", - "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -930,7 +930,7 @@ dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.4.5 (git+https://github.com/paritytech/rust-rocksdb)", ] @@ -1263,7 +1263,7 @@ dependencies = [ "polkadot-runtime 0.1.0", "polkadot-service 0.1.0", "polkadot-transaction-pool 0.1.0", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 0.1.0", "substrate-codec 0.1.0", "substrate-executor 0.1.0", @@ -1573,20 +1573,23 @@ dependencies = [ [[package]] name = "regex" -version = "0.2.5" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.4.2" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "relay" @@ -2017,9 +2020,9 @@ version = "0.1.0" dependencies = [ "assert_matches 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", - "jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", - "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 0.1.0", @@ -2034,10 +2037,10 @@ dependencies = [ name = "substrate-rpc-servers" version = "0.1.0" dependencies = [ - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", - "jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", - "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", - "jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-rpc 0.1.0", ] @@ -2493,6 +2496,11 @@ dependencies = [ "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ucd-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "uint" version = "0.1.2" @@ -2771,7 +2779,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05" -"checksum globset 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1e96ab92362c06811385ae9a34d2698e8a1160745e0c78fbb434a44c8de3fabc" +"checksum globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "142754da2c9b3722affd909f9e27f2a6700a7a303f362971e0a74c652005a43d" "checksum hashdb 0.1.1 (git+https://github.com/paritytech/parity.git)" = "" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "459d3cf58137bb02ad4adeef5036377ff59f066dbb82517b7192e3a5462a2abc" @@ -2787,12 +2795,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)" = "2134e210e2a024b5684f90e1556d5f71a1ce7f8b12e9ac9924c67fb36f63b336" "checksum itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4833d6978da405305126af4ac88569b5d71ff758581ce5a987dbfa3755f694fc" "checksum itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c" -"checksum jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)" = "" -"checksum jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" -"checksum jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" -"checksum jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" -"checksum jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" -"checksum jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git)" = "" +"checksum jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" +"checksum jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" +"checksum jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" +"checksum jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" +"checksum jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" +"checksum jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" "checksum keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" @@ -2846,8 +2854,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" "checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "744554e01ccbd98fff8c457c3b092cd67af62a555a43bfe97ae8a0451f7799fa" -"checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" +"checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384" +"checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" "checksum relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1576e382688d7e9deecea24417e350d3062d97e32e45d70b1cde65994ff1489a" "checksum remove_dir_all 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b5d2f806b0fcdabd98acd380dc8daef485e22bcb7cddc811d1337967f2528cf5" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" @@ -2904,6 +2912,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum triehash 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9291c7f0fae44858b5e087dd462afb382354120003778f1695b44aab98c7abd7" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" +"checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" "checksum uint 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53a4340c35703f926ec365c6797bb4a7a10bb6b9affe29ca385c9d804401f5e3" "checksum uint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6477b2716357758c176c36719023e1f9726974d762150e4fc0a9c8c75488c343" diff --git a/substrate/client/src/backend.rs b/substrate/client/src/backend.rs index dad95dc0fdbee..ab04dee544161 100644 --- a/substrate/client/src/backend.rs +++ b/substrate/client/src/backend.rs @@ -18,18 +18,21 @@ use state_machine::backend::Backend as StateBackend; use error; -use primitives::block::{self, Id as BlockId}; -use primitives; +use primitives::bft::Justification; +use runtime_primitives::traits::Block as BlockT; +use runtime_primitives::generic::BlockId; /// Block insertion operation. Keeps hold if the inserted block state and data. pub trait BlockImportOperation { /// Associated state backend type. type State: StateBackend; + /// The type of block that the blockchain has. + type Block: BlockT; /// Returns pending state. fn state(&self) -> error::Result<&Self::State>; /// Append block data to the transaction. - fn set_block_data(&mut self, header: block::Header, body: Option, justification: Option, is_new_best: bool) -> error::Result<()>; + fn set_block_data(&mut self, header: Self::Block::Header, body: Option>, justification: Option, is_new_best: bool) -> error::Result<()>; /// Inject storage data into the database. fn update_storage(&mut self, update: ::Transaction) -> error::Result<()>; /// Inject storage data into the database replacing any existing data. @@ -46,19 +49,21 @@ pub trait BlockImportOperation { /// is alive, the state for `P` should not be pruned. pub trait Backend { /// Associated block insertion operation type. - type BlockImportOperation: BlockImportOperation; + type BlockImportOperation: BlockImportOperation; /// Associated blockchain backend type. - type Blockchain: ::blockchain::Backend; + type Blockchain: ::blockchain::Backend; /// Associated state backend type. type State: StateBackend; + /// The type of block this back-end is managing a chain of. + type Block: BlockT; /// Begin a new block insertion transaction with given parent block id. /// When constructing the genesis, this is called with all-zero hash. - fn begin_operation(&self, block: BlockId) -> error::Result; + fn begin_operation(&self, block: BlockId) -> error::Result; /// Commit block insertion. fn commit_operation(&self, transaction: Self::BlockImportOperation) -> error::Result<()>; /// Returns reference to blockchain backend. fn blockchain(&self) -> &Self::Blockchain; /// Returns state backend with post-state of given block. - fn state_at(&self, block: BlockId) -> error::Result; + fn state_at(&self, block: BlockId) -> error::Result; } diff --git a/substrate/client/src/blockchain.rs b/substrate/client/src/blockchain.rs index 69a7a2a18a422..28f812465446e 100644 --- a/substrate/client/src/blockchain.rs +++ b/substrate/client/src/blockchain.rs @@ -16,24 +16,28 @@ //! Polkadot blockchain trait -use primitives::block::{self, Id as BlockId}; -use primitives; +use runtime_primitives::traits::Block as BlockT; +use runtime_primitives::generic::BlockId; +use primitives::bft::Justification; + use error::Result; /// Blockchain database backend. Does not perform any validation. pub trait Backend: Send + Sync { + type Block: BlockT; + /// Get block header. Returns `None` if block is not found. - fn header(&self, id: BlockId) -> Result>; + fn header(&self, id: BlockId) -> Result>; /// Get block body. Returns `None` if block is not found. - fn body(&self, id: BlockId) -> Result>; + fn body(&self, id: BlockId) -> Result>>; /// Get block justification. Returns `None` if justification does not exist. - fn justification(&self, id: BlockId) -> Result>; + fn justification(&self, id: BlockId) -> Result>; /// Get blockchain info. - fn info(&self) -> Result; + fn info(&self) -> Result>; /// Get block status. - fn status(&self, id: BlockId) -> Result; + fn status(&self, id: BlockId) -> Result; /// Get block hash by number. Returns `None` if the header is not in the chain. - fn hash(&self, number: block::Number) -> Result>; + fn hash(&self, number: Self::Block::Header::Number) -> Result>; } /// Block import outcome @@ -50,13 +54,13 @@ pub enum ImportResult { /// Blockchain info #[derive(Debug)] -pub struct Info { +pub struct Info { /// Best block hash. - pub best_hash: block::HeaderHash, + pub best_hash: Hash, /// Best block number. - pub best_number: block::Number, + pub best_number: Number, /// Genesis block hash. - pub genesis_hash: block::HeaderHash, + pub genesis_hash: HeaderHash, } /// Block status. diff --git a/substrate/client/src/lib.rs b/substrate/client/src/lib.rs index 7ef6b65d94314..6d13f7e988761 100644 --- a/substrate/client/src/lib.rs +++ b/substrate/client/src/lib.rs @@ -23,6 +23,7 @@ extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; extern crate substrate_runtime_io as runtime_io; extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_state_machine as state_machine; #[cfg(test)] extern crate substrate_keyring as keyring; #[cfg(test)] extern crate substrate_test_client as test_client; diff --git a/substrate/rpc-servers/Cargo.toml b/substrate/rpc-servers/Cargo.toml index 54ab77601116a..5f82e47a1b8af 100644 --- a/substrate/rpc-servers/Cargo.toml +++ b/substrate/rpc-servers/Cargo.toml @@ -4,9 +4,9 @@ version = "0.1.0" authors = ["Parity Technologies "] [dependencies] -jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git" } -jsonrpc-http-server = { git = "https://github.com/paritytech/jsonrpc.git" } -jsonrpc-pubsub = { git = "https://github.com/paritytech/jsonrpc.git" } -jsonrpc-ws-server = { git = "https://github.com/paritytech/jsonrpc.git" } +jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } +jsonrpc-http-server = { git = "https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } +jsonrpc-pubsub = { git = "https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } +jsonrpc-ws-server = { git = "https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } log = "0.3" substrate-rpc = { path = "../rpc", version = "0.1" } diff --git a/substrate/rpc/Cargo.toml b/substrate/rpc/Cargo.toml index d2e2547f4c331..b10c595b868ce 100644 --- a/substrate/rpc/Cargo.toml +++ b/substrate/rpc/Cargo.toml @@ -5,9 +5,9 @@ authors = ["Parity Technologies "] [dependencies] error-chain = "0.11" -jsonrpc-core = { git="https://github.com/paritytech/jsonrpc.git" } -jsonrpc-macros = { git="https://github.com/paritytech/jsonrpc.git" } -jsonrpc-pubsub = { git="https://github.com/paritytech/jsonrpc.git" } +jsonrpc-core = { git="https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } +jsonrpc-macros = { git="https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } +jsonrpc-pubsub = { git="https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } log = "0.3" parking_lot = "0.4" substrate-client = { path = "../client" } diff --git a/substrate/rpc/src/chain/mod.rs b/substrate/rpc/src/chain/mod.rs index c5c179837c3ed..61b6cfaff67e8 100644 --- a/substrate/rpc/src/chain/mod.rs +++ b/substrate/rpc/src/chain/mod.rs @@ -40,10 +40,11 @@ build_rpc_trait! { /// Polkadot blockchain API pub trait ChainApi { type Metadata; + ASSOCIATED type Header; /// Get header of a relay chain block. #[rpc(name = "chain_getHeader")] - fn header(&self, block::HeaderHash) -> Result>; + fn header(&self, block::HeaderHash) -> Result>; /// Get hash of the head. #[rpc(name = "chain_getHead")] @@ -52,7 +53,7 @@ build_rpc_trait! { #[pubsub(name = "chain_newHead")] { /// Hello subscription #[rpc(name = "subscribe_newHead")] - fn subscribe_new_head(&self, Self::Metadata, pubsub::Subscriber); + fn subscribe_new_head(&self, Self::Metadata, pubsub::Subscriber); /// Unsubscribe from hello subscription. #[rpc(name = "unsubscribe_newHead")] @@ -85,6 +86,7 @@ impl ChainApi for Chain where client::error::Error: From<<::State as state_machine::backend::Backend>::Error>, { type Metadata = ::metadata::Metadata; + type Header = block::Header; fn header(&self, hash: block::HeaderHash) -> Result> { self.client.header(&block::Id::Hash(hash)).chain_err(|| "Blockchain error") diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 6ad839028530d..b1438a3fa267b 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -353,6 +353,21 @@ impl traits::Header for Header where + Number: Block::Header::Number, + Hash: Block::Header::Hash, +{ + /// Identify by block header hash. + Hash(Hash), + /// Identify by block number. + Number(Number), +} + /// Abstraction over a substrate block. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] diff --git a/substrate/state-machine/src/lib.rs b/substrate/state-machine/src/lib.rs index c8aa4900980ed..750b56a8565ac 100644 --- a/substrate/state-machine/src/lib.rs +++ b/substrate/state-machine/src/lib.rs @@ -18,13 +18,9 @@ #![warn(missing_docs)] -extern crate substrate_primitives as primitives; - #[cfg_attr(test, macro_use)] extern crate hex_literal; - extern crate triehash; - extern crate byteorder; use std::collections::HashMap; From a43c5e736616d1229534eed0559cb2764f32dc80 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 17 May 2018 17:30:20 +0200 Subject: [PATCH 02/60] Rephrase as params --- substrate/client/src/backend.rs | 12 ++++-------- substrate/client/src/blockchain.rs | 24 +++++++++++------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/substrate/client/src/backend.rs b/substrate/client/src/backend.rs index ab04dee544161..0c85827697377 100644 --- a/substrate/client/src/backend.rs +++ b/substrate/client/src/backend.rs @@ -23,11 +23,9 @@ use runtime_primitives::traits::Block as BlockT; use runtime_primitives::generic::BlockId; /// Block insertion operation. Keeps hold if the inserted block state and data. -pub trait BlockImportOperation { +pub trait BlockImportOperation { /// Associated state backend type. type State: StateBackend; - /// The type of block that the blockchain has. - type Block: BlockT; /// Returns pending state. fn state(&self) -> error::Result<&Self::State>; @@ -47,15 +45,13 @@ pub trait BlockImportOperation { /// /// The same applies for live `BlockImportOperation`s: while an import operation building on a parent `P` /// is alive, the state for `P` should not be pruned. -pub trait Backend { +pub trait Backend { /// Associated block insertion operation type. - type BlockImportOperation: BlockImportOperation; + type BlockImportOperation: BlockImportOperation; /// Associated blockchain backend type. - type Blockchain: ::blockchain::Backend; + type Blockchain: ::blockchain::Backend; /// Associated state backend type. type State: StateBackend; - /// The type of block this back-end is managing a chain of. - type Block: BlockT; /// Begin a new block insertion transaction with given parent block id. /// When constructing the genesis, this is called with all-zero hash. diff --git a/substrate/client/src/blockchain.rs b/substrate/client/src/blockchain.rs index 28f812465446e..b36171c93f7b7 100644 --- a/substrate/client/src/blockchain.rs +++ b/substrate/client/src/blockchain.rs @@ -23,21 +23,19 @@ use primitives::bft::Justification; use error::Result; /// Blockchain database backend. Does not perform any validation. -pub trait Backend: Send + Sync { - type Block: BlockT; - +pub trait Backend: Send + Sync { /// Get block header. Returns `None` if block is not found. - fn header(&self, id: BlockId) -> Result>; + fn header(&self, id: BlockId) -> Result>; /// Get block body. Returns `None` if block is not found. - fn body(&self, id: BlockId) -> Result>>; + fn body(&self, id: BlockId) -> Result>>; /// Get block justification. Returns `None` if justification does not exist. - fn justification(&self, id: BlockId) -> Result>; + fn justification(&self, id: BlockId) -> Result>; /// Get blockchain info. - fn info(&self) -> Result>; + fn info(&self) -> Result>; /// Get block status. - fn status(&self, id: BlockId) -> Result; + fn status(&self, id: BlockId) -> Result; /// Get block hash by number. Returns `None` if the header is not in the chain. - fn hash(&self, number: Self::Block::Header::Number) -> Result>; + fn hash(&self, number: Block::Header::Number) -> Result>; } /// Block import outcome @@ -54,13 +52,13 @@ pub enum ImportResult { /// Blockchain info #[derive(Debug)] -pub struct Info { +pub struct Info { /// Best block hash. - pub best_hash: Hash, + pub best_hash: Block::Header::Hash, /// Best block number. - pub best_number: Number, + pub best_number: Block::Header::Number, /// Genesis block hash. - pub genesis_hash: HeaderHash, + pub genesis_hash: Block::Header::Hash, } /// Block status. From 5348d4e449ef15266dce48cc9cf6d034e95d61c9 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 18 May 2018 16:00:59 +0200 Subject: [PATCH 03/60] More work on traitifying substrate. --- substrate/client/src/backend.rs | 6 +- substrate/client/src/block_builder.rs | 58 ++++++------ substrate/client/src/error.rs | 4 +- substrate/client/src/genesis.rs | 27 +++--- substrate/runtime-io/src/lib.rs | 34 ------- substrate/runtime-io/with_std.rs | 19 +++- substrate/runtime-io/without_std.rs | 21 ++++ substrate/runtime/primitives/src/generic.rs | 27 ++---- substrate/runtime/primitives/src/traits.rs | 100 ++++++++++++++++++-- 9 files changed, 188 insertions(+), 108 deletions(-) diff --git a/substrate/client/src/backend.rs b/substrate/client/src/backend.rs index 0c85827697377..b3fd450567fb2 100644 --- a/substrate/client/src/backend.rs +++ b/substrate/client/src/backend.rs @@ -30,7 +30,7 @@ pub trait BlockImportOperation { /// Returns pending state. fn state(&self) -> error::Result<&Self::State>; /// Append block data to the transaction. - fn set_block_data(&mut self, header: Self::Block::Header, body: Option>, justification: Option, is_new_best: bool) -> error::Result<()>; + fn set_block_data(&mut self, header: Block::Header, body: Option>, justification: Option, is_new_best: bool) -> error::Result<()>; /// Inject storage data into the database. fn update_storage(&mut self, update: ::Transaction) -> error::Result<()>; /// Inject storage data into the database replacing any existing data. @@ -55,11 +55,11 @@ pub trait Backend { /// Begin a new block insertion transaction with given parent block id. /// When constructing the genesis, this is called with all-zero hash. - fn begin_operation(&self, block: BlockId) -> error::Result; + fn begin_operation(&self, block: BlockId) -> error::Result; /// Commit block insertion. fn commit_operation(&self, transaction: Self::BlockImportOperation) -> error::Result<()>; /// Returns reference to blockchain backend. fn blockchain(&self) -> &Self::Blockchain; /// Returns state backend with post-state of given block. - fn state_at(&self, block: BlockId) -> error::Result; + fn state_at(&self, block: BlockId) -> error::Result; } diff --git a/substrate/client/src/block_builder.rs b/substrate/client/src/block_builder.rs index 5190a01634677..10743df9c2204 100644 --- a/substrate/client/src/block_builder.rs +++ b/substrate/client/src/block_builder.rs @@ -19,72 +19,74 @@ use std::vec::Vec; use codec::{Joiner, Slicable}; use state_machine::{self, CodeExecutor}; -use primitives::{Header, Block}; -use primitives::block::{Id as BlockId, Extrinsic}; +use runtime_primitives::traits::{Header as HeaderT, Hashing as HashingT, Block as BlockT}; +use runtime_primitives::generic::BlockId; use {backend, error, Client}; use triehash::ordered_trie_root; -/// Utility for building new (valid) blocks from a stream of transactions. -pub struct BlockBuilder where - B: backend::Backend, +/// Utility for building new (valid) blocks from a stream of extrinsics. +pub struct BlockBuilder where + B: backend::Backend, E: CodeExecutor + Clone, - error::Error: From<<::State as state_machine::backend::Backend>::Error>, + Block: BlockT, + Hashing: HashingT, + error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { header: Header, - transactions: Vec, + extrinsics: Vec, executor: E, state: B::State, changes: state_machine::OverlayedChanges, + // will probably need PhantomData here... } -impl BlockBuilder where - B: backend::Backend, +impl BlockBuilder where + B: backend::Backend, E: CodeExecutor + Clone, - error::Error: From<<::State as state_machine::backend::Backend>::Error>, + Block: BlockT, + Hashing: HashingT, + error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { /// Create a new instance of builder from the given client, building on the latest block. - pub fn new(client: &Client) -> error::Result { - client.info().and_then(|i| Self::at_block(&BlockId::Hash(i.chain.best_hash), client)) + pub fn new(client: &Client) -> error::Result { + client.info().and_then(|i| Self::at_block(&BlockId::Hash(i.chain.best_hash), client)) } /// Create a new instance of builder from the given client using a particular block's ID to /// build upon. - pub fn at_block(block_id: &BlockId, client: &Client) -> error::Result { + pub fn at_block(block_id: &BlockId, client: &Client) -> error::Result { Ok(BlockBuilder { header: Header { - number: client.block_number_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(*block_id))? + 1, - parent_hash: client.block_hash_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(*block_id))?, + number: client.block_number_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(Box::new(block_id.clone())))? + 1, + parent_hash: client.block_hash_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(Box::new(block_id.clone())))?, state_root: Default::default(), extrinsics_root: Default::default(), digest: Default::default(), }, - transactions: Default::default(), + extrinsics: Default::default(), executor: client.clone_executor(), state: client.state_at(block_id)?, changes: Default::default(), }) } - /// Push a transaction onto the block's list of transactions. This will ensure the transaction + /// Push a transaction onto the block's list of extrinsics. This will ensure the transaction /// can be validly executed (by executing it); if it is invalid, it'll be returned along with /// the error. Otherwise, it will return a mutable reference to self (in order to chain). - pub fn push(&mut self, tx: Extrinsic) -> error::Result<()> { + pub fn push(&mut self, xt: Block::Extrinsic) -> error::Result<()> { let (output, _) = state_machine::execute(&self.state, &mut self.changes, &self.executor, "execute_transaction", - &vec![].and(&self.header).and(&tx))?; - self.header = Header::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); - self.transactions.push(tx); + &vec![].and(&self.header).and(&xt))?; + self.header = Block::Header::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); + self.extrinsics.push(xt); Ok(()) } - /// Consume the builder to return a valid `Block` containing all pushed transactions. + /// Consume the builder to return a valid `Block` containing all pushed extrinsics. pub fn bake(mut self) -> error::Result { - self.header.extrinsics_root = ordered_trie_root(self.transactions.iter().map(Slicable::encode)).0.into(); + self.header.extrinsics_root = Hashing::ordered_trie_root(self.extrinsics.iter().map(Slicable::encode)); let (output, _) = state_machine::execute(&self.state, &mut self.changes, &self.executor, "finalise_block", &self.header.encode())?; - self.header = Header::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); - Ok(Block { - header: self.header, - transactions: self.transactions, - }) + self.header = Block::Header::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); + Ok(Block::new(self.header, self.extrinsics)) } } diff --git a/substrate/client/src/error.rs b/substrate/client/src/error.rs index 6b34ac6eb6a07..9a12a51ccb8a6 100644 --- a/substrate/client/src/error.rs +++ b/substrate/client/src/error.rs @@ -29,7 +29,7 @@ error_chain! { } /// Unknown block. - UnknownBlock(h: ::primitives::block::Id) { + UnknownBlock(h: Box) { description("unknown block"), display("UnknownBlock: {}", h), } @@ -77,7 +77,7 @@ error_chain! { } /// Bad justification for header. - BadJustification(h: ::primitives::block::Id) { + BadJustification(h: Box) { description("bad justification for header"), display("bad justification for header: {}", h), } diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index c72f6addf7292..63c47d9c64ef2 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -17,23 +17,24 @@ //! Tool for creating the genesis block. use std::collections::HashMap; -use primitives::{Block, Header}; +use primitives::traits::{Block as BlockT, Hashing as HashingT, Zero}; use triehash::trie_root; /// Create a genesis block, given the initial storage. -pub fn construct_genesis_block(storage: &HashMap, Vec>) -> Block { +pub fn construct_genesis_block(storage: &HashMap, Vec>) -> Block { + // TODO gav don't use `trie_root`! let state_root = trie_root(storage.clone().into_iter()).0.into(); - let header = Header { - parent_hash: Default::default(), - number: 0, - state_root, - extrinsics_root: trie_root(vec![].into_iter()).0.into(), - digest: Default::default(), - }; - Block { - header, - transactions: vec![], - } + let extrinsics_root = trie_root(vec![].into_iter()).0.into(); + Block::new( + Block::Header::new( + Zero::zero(), + extrinsics_root, + state_root, + Default::default(), + Default::default() + ), + Default::default() + ) } #[cfg(test)] diff --git a/substrate/runtime-io/src/lib.rs b/substrate/runtime-io/src/lib.rs index a2eb13dafd552..5a165c62e5848 100644 --- a/substrate/runtime-io/src/lib.rs +++ b/substrate/runtime-io/src/lib.rs @@ -29,37 +29,3 @@ include!("../with_std.rs"); #[cfg(not(feature = "std"))] include!("../without_std.rs"); - -/// Abstraction around hashing -pub trait Hashing { - /// The hash type produced. - type Output; - - /// Produce the hash of some byte-slice. - fn hash(s: &[u8]) -> Self::Output; - /// Produce the hash of some codec-encodable value. - fn hash_of(s: &S) -> Self::Output { - codec::Slicable::using_encoded(s, Self::hash) - } - /// Produce the patricia-trie root of a mapping from indices to byte slices. - fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output; - - /// Acquire the global storage root. - fn storage_root() -> Self::Output; -} - -/// Blake2-256 Hashing implementation. -pub struct BlakeTwo256; - -impl Hashing for BlakeTwo256 { - type Output = primitives::H256; - fn hash(s: &[u8]) -> Self::Output { - blake2_256(s).into() - } - fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output { - enumerated_trie_root(items).into() - } - fn storage_root() -> Self::Output { - storage_root().into() - } -} diff --git a/substrate/runtime-io/with_std.rs b/substrate/runtime-io/with_std.rs index 5fda5181b06ac..69a7a3665949f 100644 --- a/substrate/runtime-io/with_std.rs +++ b/substrate/runtime-io/with_std.rs @@ -82,11 +82,28 @@ pub fn storage_root() -> [u8; 32] { ).unwrap_or([0u8; 32]) } -/// "Commit" all existing operations and get the resultant storage root. +/// A trie root formed from the enumerated items. pub fn enumerated_trie_root(serialised_values: &[&[u8]]) -> [u8; 32] { triehash::ordered_trie_root(serialised_values.iter().map(|s| s.to_vec())).0 } +/// A trie root formed from the iterated items. +pub fn trie_root< + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, +>(input: I) -> [u8; 32] { + triehash::trie_root(input).0 +} + +/// A trie root formed from the enumerated items. +pub fn ordered_trie_root< + I: IntoIterator, + A: AsRef<[u8]> +>(input: I) -> [u8; 32] { + triehash::ordered_trie_root(input).0 +} + /// Verify a ed25519 signature. pub fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { ed25519::verify(sig, msg, pubkey) diff --git a/substrate/runtime-io/without_std.rs b/substrate/runtime-io/without_std.rs index 5a20fa9af7c4c..b261d651cbf58 100644 --- a/substrate/runtime-io/without_std.rs +++ b/substrate/runtime-io/without_std.rs @@ -136,6 +136,27 @@ pub fn enumerated_trie_root(values: &[&[u8]]) -> [u8; 32] { result } +/// A trie root formed from the iterated items. +pub fn trie_root< + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, +>(input: I) -> [u8; 32] { + unimplemented!() + // TODO Maybe implement (though probably easier/cleaner to have blake2 be the only thing + // implemneted natively and compile the trie logic as wasm). +} + +/// A trie root formed from the enumerated items. +pub fn ordered_trie_root< + I: IntoIterator, + A: AsRef<[u8]> +>(input: I) -> [u8; 32] { + unimplemented!() + // TODO Maybe implement (though probably easier/cleaner to have blake2 be the only thing + // implemneted natively and compile the trie logic as wasm). +} + /// The current relay chain identifier. pub fn chain_id() -> u64 { unsafe { diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index b1438a3fa267b..194cdd8a92fcb 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -16,29 +16,13 @@ //! Generic implementations of Extrinsic/Header/Block. -#[cfg(feature = "std")] use serde::Serialize; +#[cfg(feature = "std")] use std::fmt; use rstd::prelude::*; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; -use traits; +use traits::{self, Member}; use rstd::ops; -#[cfg(feature = "std")] -use std::fmt::{self, Debug}; - -#[cfg(feature = "std")] -pub trait MaybeSerializeDebug: Serialize + Debug {} -#[cfg(feature = "std")] -impl MaybeSerializeDebug for T {} - -#[cfg(not(feature = "std"))] -pub trait MaybeSerializeDebug {} -#[cfg(not(feature = "std"))] -impl MaybeSerializeDebug for T {} - -pub trait Member: MaybeSerializeDebug + Eq + PartialEq + Clone {} -impl Member for T {} - /// A vetted and verified extrinsic from the external world. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Debug))] @@ -368,6 +352,13 @@ pub enum BlockId where Number(Number), } +#[cfg(feature = "std")] +impl fmt::Display for Id { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + format!("{:?}", self) + } +} + /// Abstraction over a substrate block. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index bcd5707f1fd83..52e5f6ae0bd37 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -18,7 +18,9 @@ use rstd::prelude::*; use rstd; -#[cfg(not(feature = "std"))] use runtime_io; +use runtime_io; +#[cfg(feature = "std")] use std::fmt::Debug; +#[cfg(feature = "std")] use serde::Serialize; use substrate_primitives; use codec::Slicable; pub use integer_sqrt::IntegerSquareRoot; @@ -147,10 +149,86 @@ impl Executable for (A, B) { } } +/// Abstraction around hashing +pub trait Hashing { + /// The hash type produced. + type Output; + + /// Produce the hash of some byte-slice. + fn hash(s: &[u8]) -> Self::Output; + + /// Produce the hash of some codec-encodable value. + fn hash_of(s: &S) -> Self::Output { + codec::Slicable::using_encoded(s, Self::hash) + } + + /// Produce the patricia-trie root of a mapping from indices to byte slices. + fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output; + + /// Iterator-based version of `enumerated_trie_root`. + fn ordered_trie_root< + I: IntoIterator, + A: AsRef<[u8]> + >(input: I) -> Self::Output; + + /// The Patricia tree root of the given mapping as an iterator. + fn trie_root< + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]> + >(input: I) -> Self::Output; + + /// Acquire the global storage root. + fn storage_root() -> Self::Output; +} + +/// Blake2-256 Hashing implementation. +pub struct BlakeTwo256; + +impl Hashing for BlakeTwo256 { + type Output = primitives::H256; + fn hash(s: &[u8]) -> Self::Output { + runtime_io::blake2_256(s).into() + } + fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output { + runtime_io::enumerated_trie_root(items).into() + } + fn trie_root< + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]> + >(input: I) -> Self::Output { + runtime_io::trie_root(items).into() + } + fn ordered_trie_root< + I: IntoIterator, + A: AsRef<[u8]> + >(input: I) -> Self::Output { + runtime_io::ordered_trie_root(items).into() + } + fn storage_root() -> Self::Output { + runtime_io::storage_root().into() + } +} + + +#[cfg(feature = "std")] +pub trait MaybeSerializeDebug: Serialize + Debug {} +#[cfg(feature = "std")] +impl MaybeSerializeDebug for T {} + +#[cfg(not(feature = "std"))] +pub trait MaybeSerializeDebug {} +#[cfg(not(feature = "std"))] +impl MaybeSerializeDebug for T {} + +pub trait Member: Sized + MaybeSerializeDebug + Eq + PartialEq + Clone {} +impl Member for T {} + /// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are /// each `Slicable`. pub trait Digest { - type Item: Sized; + type Item: Member; fn push(&mut self, item: Self::Item); } @@ -167,9 +245,9 @@ impl Digest for substrate_primitives::Digest { /// /// You can also create a `new` one from those fields. pub trait Header: Sized + Slicable { - type Number: Sized; - type Hash: Sized; - type Digest: Sized; + type Number: Member + SimpleArithmetic; + type Hash: Member + Default + SimpleBitOps; + type Digest: Member + Default; fn number(&self) -> &Self::Number; fn extrinsics_root(&self) -> &Self::Hash; fn state_root(&self) -> &Self::Hash; @@ -215,11 +293,12 @@ impl Header for substrate_primitives::Header { /// /// You can get an iterator over each of the `extrinsics` and retrieve the `header`. pub trait Block { - type Extrinsic: Sized; + type Extrinsic: Member + Slicable; type Header: Header; fn header(&self) -> &Self::Header; fn extrinsics(&self) -> &[Self::Extrinsic]; fn deconstruct(self) -> (Self::Header, Vec); + fn new(header: Self::Header, extrinsics: Vec) -> Self; } impl Block for substrate_primitives::Block { @@ -234,12 +313,15 @@ impl Block for substrate_primitives::Block { fn deconstruct(self) -> (Self::Header, Vec) { (self.header, self.transactions) } + fn new(header: Self::Header, extrinsics: Vec) -> Self { + substrate_primitives::Block { header, transactions: extrinsics } + } } /// A "checkable" piece of information, used by the standard Substrate Executive in order to /// check the validity of a piece of extrinsic information, usually by verifying the signature. pub trait Checkable: Sized { - type Checked: Sized; + type Checked: Member; fn check(self) -> Result; } @@ -250,8 +332,8 @@ pub trait Checkable: Sized { /// Also provides information on to whom this information is attributable and an index that allows /// each piece of attributable information to be disambiguated. pub trait Applyable { - type AccountId; - type Index; + type AccountId: Member; + type Index: Member + SimpleArithmetic; fn index(&self) -> &Self::Index; fn sender(&self) -> &Self::AccountId; fn apply(self); From 0679ac60c842e306bb8152241ccdb9bc45332072 Mon Sep 17 00:00:00 2001 From: Gav Date: Wed, 23 May 2018 17:08:46 +0100 Subject: [PATCH 04/60] Traitify in_mem.rs --- polkadot/service/src/lib.rs | 76 ++++-------- substrate/client/src/genesis.rs | 12 +- substrate/client/src/in_mem.rs | 128 +++++++++++--------- substrate/runtime/primitives/src/generic.rs | 2 +- substrate/runtime/primitives/src/traits.rs | 4 +- 5 files changed, 101 insertions(+), 121 deletions(-) diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs index bcb454260e933..0115209e3bebb 100644 --- a/polkadot/service/src/lib.rs +++ b/polkadot/service/src/lib.rs @@ -28,16 +28,14 @@ extern crate polkadot_api; extern crate polkadot_consensus as consensus; extern crate polkadot_transaction_pool as transaction_pool; extern crate polkadot_keystore as keystore; -extern crate substrate_client as client; extern crate substrate_runtime_io as runtime_io; extern crate substrate_primitives as primitives; extern crate substrate_network as network; extern crate substrate_codec as codec; -extern crate substrate_client_db as client_db; extern crate substrate_executor; -extern crate exit_future; extern crate tokio_core; +extern crate substrate_client as client; #[macro_use] extern crate error_chain; @@ -65,13 +63,13 @@ use polkadot_api::PolkadotApi; use polkadot_runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, SessionConfig, StakingConfig, BuildExternalities}; use client::{genesis, BlockchainEvents}; +use client::in_mem::Backend as InMemory; use network::ManageNetwork; -use exit_future::Signal; pub use self::error::{ErrorKind, Error}; pub use config::{Configuration, Role, ChainSpec}; -type Client = client::Client>; +type Client = client::Client>; /// Polkadot service. pub struct Service { @@ -79,7 +77,6 @@ pub struct Service { client: Arc, network: Arc, transaction_pool: Arc>, - signal: Option, _consensus: Option, } @@ -260,10 +257,6 @@ fn local_testnet_config() -> ChainConfig { impl Service { /// Creates and register protocol with the network service pub fn new(mut config: Configuration) -> Result { - use std::sync::Barrier; - - let (signal, exit) = ::exit_future::signal(); - // Create client let executor = polkadot_executor::Executor::new(); let mut storage = Default::default(); @@ -291,12 +284,7 @@ impl Service { (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) }; - let db_settings = client_db::DatabaseSettings { - cache_size: None, - path: config.database_path.into(), - }; - - let client = Arc::new(client_db::new_client(db_settings, executor, prepare_genesis)?); + let client = Arc::new(client::new_in_mem(executor, prepare_genesis)?); let best_header = client.best_block_header()?; info!("Starting Polkadot. Best block is #{}", best_header.number); let transaction_pool = Arc::new(Mutex::new(TransactionPool::new(config.transaction_pool))); @@ -312,39 +300,7 @@ impl Service { chain: client.clone(), transaction_pool: transaction_pool_adapter, }; - let network = network::Service::new(network_params)?; - let barrier = ::std::sync::Arc::new(Barrier::new(2)); - - let thread = { - let client = client.clone(); - let network = network.clone(); - let txpool = transaction_pool.clone(); - - let thread_barrier = barrier.clone(); - thread::spawn(move || { - network.start_network(); - - thread_barrier.wait(); - let mut core = Core::new().expect("tokio::Core could not be created"); - let events = client.import_notification_stream().for_each(move |notification| { - network.on_block_imported(notification.hash, ¬ification.header); - prune_imported(&*client, &*txpool, notification.hash); - - Ok(()) - }); - - core.handle().spawn(events); - if let Err(e) = core.run(exit) { - debug!("Polkadot service event loop shutdown with {:?}", e); - } - debug!("Polkadot service shutdown"); - }) - }; - - // wait for the network to start up before starting the consensus - // service. - barrier.wait(); // Spin consensus service if configured let consensus_service = if config.roles & Role::VALIDATOR == Role::VALIDATOR { @@ -356,12 +312,28 @@ impl Service { None }; + let thread_client = client.clone(); + let thread_network = network.clone(); + let thread_txpool = transaction_pool.clone(); + let thread = thread::spawn(move || { + thread_network.start_network(); + let mut core = Core::new().expect("tokio::Core could not be created"); + let events = thread_client.import_notification_stream().for_each(|notification| { + thread_network.on_block_imported(notification.hash, ¬ification.header); + prune_imported(&*thread_client, &*thread_txpool, notification.hash); + + Ok(()) + }); + if let Err(e) = core.run(events) { + debug!("Polkadot service event loop shutdown with {:?}", e); + } + debug!("Polkadot service shutdown"); + }); Ok(Service { thread: Some(thread), client: client, network: network, transaction_pool: transaction_pool, - signal: Some(signal), _consensus: consensus_service, }) } @@ -401,12 +373,8 @@ pub fn prune_imported(client: &Client, pool: &Mutex, hash: Head impl Drop for Service { fn drop(&mut self) { + self.client.stop_notifications(); self.network.stop_network(); - - if let Some(signal) = self.signal.take() { - signal.fire(); - } - if let Some(thread) = self.thread.take() { thread.join().expect("The service thread has panicked"); } diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index 63c47d9c64ef2..6da804ea529da 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -18,13 +18,17 @@ use std::collections::HashMap; use primitives::traits::{Block as BlockT, Hashing as HashingT, Zero}; -use triehash::trie_root; /// Create a genesis block, given the initial storage. -pub fn construct_genesis_block(storage: &HashMap, Vec>) -> Block { +pub fn construct_genesis_block< + Block: BlockT, + Hashing: HashingT +( + storage: &HashMap, Vec> +) -> Block { // TODO gav don't use `trie_root`! - let state_root = trie_root(storage.clone().into_iter()).0.into(); - let extrinsics_root = trie_root(vec![].into_iter()).0.into(); + let state_root = Hashing::trie_root(storage.clone().into_iter()); + let extrinsics_root = Hashing::trie_root(vec![].into_iter()); Block::new( Block::Header::new( Zero::zero(), diff --git a/substrate/client/src/in_mem.rs b/substrate/client/src/in_mem.rs index 138b6f27a24f8..96b72fbab97ed 100644 --- a/substrate/client/src/in_mem.rs +++ b/substrate/client/src/in_mem.rs @@ -17,82 +17,83 @@ //! In memory client backend use std::collections::HashMap; +use std::marker::PhantomData; use parking_lot::RwLock; use error; use backend; -use runtime_support::Hashable; +use codec::Slicable; use primitives; -use primitives::block::{self, Id as BlockId, HeaderHash}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing as HashingT, Zero}; use blockchain::{self, BlockStatus}; use state_machine::backend::{Backend as StateBackend, InMemory}; -fn header_hash(header: &block::Header) -> block::HeaderHash { - header.blake2_256().into() -} - -struct PendingBlock { +struct PendingBlock { block: Block, is_best: bool, } #[derive(PartialEq, Eq, Clone)] -struct Block { - header: block::Header, +struct Block { + header: Block::Header, justification: Option, - body: Option, + body: Option>, } #[derive(Clone)] -struct BlockchainStorage { - blocks: HashMap, - hashes: HashMap, - best_hash: HeaderHash, - best_number: block::Number, - genesis_hash: HeaderHash, +struct BlockchainStorage { + blocks: HashMap, + hashes: HashMap, + best_hash: Block::Header::Hash, + best_number: Block::Header::Number, + genesis_hash: Block::Header::Hash, } /// In-memory blockchain. Supports concurrent reads. -pub struct Blockchain { - storage: RwLock, +pub struct Blockchain { + storage: RwLock>, } -impl Clone for Blockchain { - fn clone(&self) -> Blockchain { +impl Clone for Blockchain { + fn clone(&self) -> Self { Blockchain { storage: RwLock::new(self.storage.read().clone()), } } } -impl Blockchain { - fn id(&self, id: BlockId) -> Option { +impl Blockchain { + fn id(&self, id: BlockId) -> Option { match id { BlockId::Hash(h) => Some(h), BlockId::Number(n) => self.storage.read().hashes.get(&n).cloned(), } } - fn new() -> Blockchain { + fn new() -> Self { Blockchain { storage: RwLock::new( BlockchainStorage { blocks: HashMap::new(), hashes: HashMap::new(), - best_hash: HeaderHash::default(), - best_number: 0, - genesis_hash: HeaderHash::default(), + best_hash: Default::default(), + best_number: Zero::zero(), + genesis_hash: Default::default(), }) } } - fn insert(&self, hash: HeaderHash, header: block::Header, justification: Option, body: Option, is_new_best: bool) { + fn insert( + &self, + hash: Block::Header::Hash, + header: Block::Header, + justification: Option, + body: Option>, + is_new_best: bool + ) { let number = header.number; let mut storage = self.storage.write(); - storage.blocks.insert(hash, Block { - header: header, - body: body, - justification: justification, - }); + storage.blocks.insert(hash, Block::new(header, body, justification)); storage.hashes.insert(number, hash); if is_new_best { storage.best_hash = hash; @@ -104,12 +105,12 @@ impl Blockchain { } /// Compare this blockchain with another in-mem blockchain - pub fn equals_to(&self, other: &Blockchain) -> bool { + pub fn equals_to(&self, other: &Self) -> bool { self.canon_equals_to(other) && self.storage.read().blocks == other.storage.read().blocks } /// Compare canonical chain to other canonical chain. - pub fn canon_equals_to(&self, other: &Blockchain) -> bool { + pub fn canon_equals_to(&self, other: &Self) -> bool { let this = self.storage.read(); let other = other.storage.read(); this.hashes == other.hashes @@ -119,20 +120,20 @@ impl Blockchain { } } -impl blockchain::Backend for Blockchain { - fn header(&self, id: BlockId) -> error::Result> { +impl blockchain::Backend for Blockchain { + fn header(&self, id: BlockId) -> error::Result> { Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).map(|b| b.header.clone()))) } - fn body(&self, id: BlockId) -> error::Result> { + fn body(&self, id: BlockId) -> error::Result>> { Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).and_then(|b| b.body.clone()))) } - fn justification(&self, id: BlockId) -> error::Result> { + fn justification(&self, id: BlockId) -> error::Result> { Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).and_then(|b| b.justification.clone()))) } - fn info(&self) -> error::Result { + fn info(&self) -> error::Result> { let storage = self.storage.read(); Ok(blockchain::Info { best_hash: storage.best_hash, @@ -148,33 +149,35 @@ impl blockchain::Backend for Blockchain { } } - fn hash(&self, number: block::Number) -> error::Result> { + fn hash(&self, number: Block::Header::Number) -> error::Result> { Ok(self.id(BlockId::Number(number))) } } /// In-memory operation. -pub struct BlockImportOperation { - pending_block: Option, +pub struct BlockImportOperation { + pending_block: Option>, old_state: InMemory, new_state: Option, } -impl backend::BlockImportOperation for BlockImportOperation { +impl backend::BlockImportOperation for BlockImportOperation { type State = InMemory; fn state(&self) -> error::Result<&Self::State> { Ok(&self.old_state) } - fn set_block_data(&mut self, header: block::Header, body: Option, justification: Option, is_new_best: bool) -> error::Result<()> { + fn set_block_data( + &mut self, + header: Block::Header, + body: Option>, + justification: Option, + is_new_best: bool + ) -> error::Result<()> { assert!(self.pending_block.is_none(), "Only one block per operation is allowed"); self.pending_block = Some(PendingBlock { - block: Block { - header: header, - body: body, - justification: justification, - }, + block: Block::new(header, body, justification), is_best: is_new_best, }); Ok(()) @@ -192,27 +195,32 @@ impl backend::BlockImportOperation for BlockImportOperation { } /// In-memory backend. Keeps all states and blocks in memory. Useful for testing. -pub struct Backend { - states: RwLock>, - blockchain: Blockchain, +pub struct Backend { + states: RwLock>, + blockchain: Blockchain, + dummy: PhantomData, } -impl Backend { +impl Backend { /// Create a new instance of in-mem backend. pub fn new() -> Backend { Backend { states: RwLock::new(HashMap::new()), blockchain: Blockchain::new(), + dummy: PhantomData::new(), } } } -impl backend::Backend for Backend { - type BlockImportOperation = BlockImportOperation; - type Blockchain = Blockchain; +impl< + Block: BlockT, + Hashing: HashingT + Hash +> Backend backend::Backend for Backend { + type BlockImportOperation = BlockImportOperation; + type Blockchain = Blockchain; type State = InMemory; - fn begin_operation(&self, block: BlockId) -> error::Result { + fn begin_operation(&self, block: BlockId) -> error::Result { let state = match block { BlockId::Hash(h) if h.is_zero() => Self::State::default(), _ => self.state_at(block)?, @@ -227,7 +235,7 @@ impl backend::Backend for Backend { fn commit_operation(&self, operation: Self::BlockImportOperation) -> error::Result<()> { if let Some(pending_block) = operation.pending_block { - let hash = header_hash(&pending_block.block.header); + let hash = Hashing::hash_of(&pending_block.block.header); let old_state = &operation.old_state; self.states.write().insert(hash, operation.new_state.unwrap_or_else(|| old_state.clone())); self.blockchain.insert(hash, pending_block.block.header, pending_block.block.justification, pending_block.block.body, pending_block.is_best); @@ -235,14 +243,14 @@ impl backend::Backend for Backend { Ok(()) } - fn blockchain(&self) -> &Blockchain { + fn blockchain(&self) -> &Self::Blockchain { &self.blockchain } fn state_at(&self, block: BlockId) -> error::Result { match self.blockchain.id(block).and_then(|id| self.states.read().get(&id).cloned()) { Some(state) => Ok(state), - None => Err(error::ErrorKind::UnknownBlock(block).into()), + None => Err(error::ErrorKind::UnknownBlock(Box::new(block)).into()), } } } diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 194cdd8a92fcb..6af062b812ea7 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -355,7 +355,7 @@ pub enum BlockId where #[cfg(feature = "std")] impl fmt::Display for Id { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - format!("{:?}", self) + write!(f, "{:?}", self) } } diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 52e5f6ae0bd37..91a1a9c649556 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -124,12 +124,12 @@ impl SimpleArithmetic for T {} pub trait SimpleBitOps: - Sized + + Sized + Zero + rstd::ops::BitOr + rstd::ops::BitAnd {} impl + rstd::ops::BitAnd > SimpleBitOps for T {} From 8b9b4acd7b9d3bd2d13daa48a756ff33e5b6c245 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 24 May 2018 13:52:29 +0100 Subject: [PATCH 05/60] traitify client.rs --- substrate/client/src/client.rs | 130 +++++++++++---------- substrate/client/src/lib.rs | 2 +- substrate/runtime/primitives/src/traits.rs | 6 +- 3 files changed, 73 insertions(+), 65 deletions(-) diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 30ae5a261134a..8958599eae2b6 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -18,10 +18,11 @@ use futures::sync::mpsc; use parking_lot::Mutex; -use primitives::{self, block, AuthorityId}; -use primitives::block::Id as BlockId; +use std::marker::PhantomData; +use primitives::{self, AuthorityId}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::{Block as BlockT, Hashing as HashingT, Zero}; use primitives::storage::{StorageKey, StorageData}; -use runtime_support::Hashable; use codec::{KeyedVec, Slicable}; use state_machine::{self, Ext, OverlayedChanges, Backend as StateBackend, CodeExecutor}; @@ -29,38 +30,36 @@ use backend::{self, BlockImportOperation}; use blockchain::{self, Info as ChainInfo, Backend as ChainBackend}; use {error, in_mem, block_builder, runtime_io, bft}; -/// Type that implements `futures::Stream` of block import events. -pub type BlockchainEventStream = mpsc::UnboundedReceiver; - /// Polkadot Client -pub struct Client { +pub struct Client { backend: B, executor: E, - import_notification_sinks: Mutex>>, + import_notification_sinks: Mutex>>>, + dummy: PhantomData, } /// A source of blockchain evenets. -pub trait BlockchainEvents { +pub trait BlockchainEvents { /// Get block import event stream. - fn import_notification_stream(&self) -> BlockchainEventStream; + fn import_notification_stream(&self) -> mpsc::UnboundedReceiver>; } /// Chain head information. -pub trait ChainHead { +pub trait ChainHead { /// Get best block header. - fn best_block_header(&self) -> Result; + fn best_block_header(&self) -> Result; } /// Client info // TODO: split queue info from chain info and amalgamate into single struct. #[derive(Debug)] -pub struct ClientInfo { +pub struct ClientInfo { /// Best block hash. - pub chain: ChainInfo, + pub chain: ChainInfo, /// Best block number in the queue. - pub best_queued_number: Option, + pub best_queued_number: Option, /// Best queued block hash. - pub best_queued_hash: Option, + pub best_queued_hash: Option, } /// Information regarding the result of a call. @@ -118,44 +117,44 @@ pub enum BlockOrigin { /// Summary of an imported block #[derive(Clone, Debug)] -pub struct BlockImportNotification { +pub struct BlockImportNotification { /// Imported block header hash. - pub hash: block::HeaderHash, + pub hash: Block::Header::Hash, /// Imported block origin. pub origin: BlockOrigin, /// Imported block header. - pub header: block::Header, + pub header: Block::Header, /// Is this the new best block. pub is_new_best: bool, } /// A header paired with a justification which has already been checked. #[derive(Debug, PartialEq, Eq, Clone)] -pub struct JustifiedHeader { - header: block::Header, +pub struct JustifiedHeader { + header: Block::Header, justification: bft::Justification, } -impl JustifiedHeader { +impl JustifiedHeader { /// Deconstruct the justified header into parts. - pub fn into_inner(self) -> (block::Header, bft::Justification) { + pub fn into_inner(self) -> (Block::Header, bft::Justification) { (self.header, self.justification) } } /// Create an instance of in-memory client. -pub fn new_in_mem( +pub fn new_in_mem( executor: E, build_genesis: F -) -> error::Result> +) -> error::Result> where E: CodeExecutor, - F: FnOnce() -> (block::Header, Vec<(Vec, Vec)>) + F: FnOnce() -> (Block::Header, Vec<(Vec, Vec)>) { Client::new(in_mem::Backend::new(), executor, build_genesis) } -impl Client where +impl Client where B: backend::Backend, E: CodeExecutor, error::Error: From<<::State as StateBackend>::Error>, @@ -167,12 +166,12 @@ impl Client where build_genesis: F ) -> error::Result where - F: FnOnce() -> (block::Header, Vec<(Vec, Vec)>) + F: FnOnce() -> (Block::Header, Vec<(Vec, Vec)>) { - if backend.blockchain().header(BlockId::Number(0))?.is_none() { + if backend.blockchain().header(BlockId::Number(Zero::zero()))?.is_none() { trace!("Empty database, writing genesis block"); let (genesis_header, genesis_store) = build_genesis(); - let mut op = backend.begin_operation(BlockId::Hash(block::HeaderHash::default()))?; + let mut op = backend.begin_operation(BlockId::Hash(Default::default()))?; op.reset_storage(genesis_store.into_iter())?; op.set_block_data(genesis_header, Some(vec![]), None, true)?; backend.commit_operation(op)?; @@ -181,11 +180,12 @@ impl Client where backend, executor, import_notification_sinks: Mutex::new(Vec::new()), + dummy: Default::default(), }) } /// Get a reference to the state at a given block. - pub fn state_at(&self, block: &BlockId) -> error::Result { + pub fn state_at(&self, block: &BlockId) -> error::Result { self.backend.state_at(*block) } @@ -195,7 +195,7 @@ impl Client where } /// Return single storage entry of contract under given address in state in a block of given hash. - pub fn storage(&self, id: &BlockId, key: &StorageKey) -> error::Result { + pub fn storage(&self, id: &BlockId, key: &StorageKey) -> error::Result { Ok(StorageData(self.state_at(id)? .storage(&key.0)? .ok_or_else(|| error::ErrorKind::NoValueForKey(key.0.clone()))? @@ -203,7 +203,7 @@ impl Client where } /// Get the code at a given block. - pub fn code_at(&self, id: &BlockId) -> error::Result> { + pub fn code_at(&self, id: &BlockId) -> error::Result> { self.storage(id, &StorageKey(b":code".to_vec())).map(|data| data.0) } @@ -213,7 +213,7 @@ impl Client where } /// Get the current set of authorities from storage. - pub fn authorities_at(&self, id: &BlockId) -> error::Result> { + pub fn authorities_at(&self, id: &BlockId) -> error::Result> { let state = self.state_at(id)?; (0..u32::decode(&mut state.storage(b":auth:len")?.ok_or(error::ErrorKind::AuthLenEmpty)?.as_slice()).ok_or(error::ErrorKind::AuthLenInvalid)?) .map(|i| state.storage(&i.to_keyed_vec(b":auth:")) @@ -227,7 +227,7 @@ impl Client where /// Execute a call to a contract on top of state in a block of given hash. /// /// No changes are made. - pub fn call(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result { + pub fn call(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result { let mut changes = OverlayedChanges::default(); let (return_data, _) = state_machine::execute( &self.state_at(id)?, @@ -249,7 +249,7 @@ impl Client where /// Set up the native execution environment to call into a native runtime code. pub fn using_environment_at T, T>( &self, - id: &BlockId, + id: &BlockId, overlay: &mut OverlayedChanges, f: F ) -> error::Result { @@ -257,24 +257,24 @@ impl Client where } /// Create a new block, built on the head of the chain. - pub fn new_block(&self) -> error::Result> where E: Clone { + pub fn new_block(&self) -> error::Result> where E: Clone { block_builder::BlockBuilder::new(self) } /// Create a new block, built on top of `parent`. - pub fn new_block_at(&self, parent: &BlockId) -> error::Result> where E: Clone { + pub fn new_block_at(&self, parent: &BlockId) -> error::Result> where E: Clone { block_builder::BlockBuilder::at_block(parent, &self) } /// Check a header's justification. pub fn check_justification( &self, - header: block::Header, + header: Block::Header, justification: bft::UncheckedJustification, ) -> error::Result { let authorities = self.authorities_at(&BlockId::Hash(header.parent_hash))?; let just = bft::check_justification(&authorities[..], header.parent_hash, justification) - .map_err(|_| error::ErrorKind::BadJustification(BlockId::Hash(header.blake2_256().into())))?; + .map_err(|_| error::ErrorKind::BadJustification(Box::new(BlockId::Hash(Hashing::hash_of(header)))))?; Ok(JustifiedHeader { header, justification: just, @@ -286,7 +286,7 @@ impl Client where &self, origin: BlockOrigin, header: JustifiedHeader, - body: Option, + body: Option>, ) -> error::Result { // TODO: import lock // TODO: import justification. @@ -304,18 +304,18 @@ impl Client where &mut overlay, &self.executor, "execute_block", - &block::Block { header: header.clone(), transactions: body.clone().unwrap_or_default().clone() }.encode() + &Block::new(header.clone(), body.clone().unwrap_or_default()).encode() )?; let is_new_best = header.number == self.backend.blockchain().info()?.best_number + 1; - let hash: block::HeaderHash = header.blake2_256().into(); + let hash = Hashing::hash_of(header); trace!("Imported {}, (#{}), best={}, origin={:?}", hash, header.number, is_new_best, origin); transaction.set_block_data(header.clone(), body, Some(justification.uncheck().into()), is_new_best)?; transaction.update_storage(storage_update)?; self.backend.commit_operation(transaction)?; if origin == BlockOrigin::NetworkBroadcast || origin == BlockOrigin::Own || origin == BlockOrigin::ConsensusBroadcast { - let notification = BlockImportNotification { + let notification = BlockImportNotification:: { hash: hash, origin: origin, header: header, @@ -328,7 +328,7 @@ impl Client where } /// Get blockchain info. - pub fn info(&self) -> error::Result { + pub fn info(&self) -> error::Result> { let info = self.backend.blockchain().info().map_err(|e| error::Error::from_blockchain(Box::new(e)))?; Ok(ClientInfo { chain: info, @@ -338,7 +338,7 @@ impl Client where } /// Get block status. - pub fn block_status(&self, id: &BlockId) -> error::Result { + pub fn block_status(&self, id: &BlockId) -> error::Result { // TODO: more efficient implementation match self.backend.blockchain().header(*id).map_err(|e| error::Error::from_blockchain(Box::new(e)))?.is_some() { true => Ok(BlockStatus::InChain), @@ -347,12 +347,12 @@ impl Client where } /// Get block hash by number. - pub fn block_hash(&self, block_number: block::Number) -> error::Result> { + pub fn block_hash(&self, block_number: Block::Header::Number) -> error::Result> { self.backend.blockchain().hash(block_number) } /// Convert an arbitrary block ID into a block hash. - pub fn block_hash_from_id(&self, id: &BlockId) -> error::Result> { + pub fn block_hash_from_id(&self, id: &BlockId) -> error::Result> { match *id { BlockId::Hash(h) => Ok(Some(h)), BlockId::Number(n) => self.block_hash(n), @@ -360,7 +360,7 @@ impl Client where } /// Convert an arbitrary block ID into a block hash. - pub fn block_number_from_id(&self, id: &BlockId) -> error::Result> { + pub fn block_number_from_id(&self, id: &BlockId) -> error::Result> { match *id { BlockId::Hash(_) => Ok(self.header(id)?.map(|h| h.number)), BlockId::Number(n) => Ok(Some(n)), @@ -368,34 +368,36 @@ impl Client where } /// Get block header by id. - pub fn header(&self, id: &BlockId) -> error::Result> { + pub fn header(&self, id: &BlockId) -> error::Result> { self.backend.blockchain().header(*id) } /// Get block body by id. - pub fn body(&self, id: &BlockId) -> error::Result> { + pub fn body(&self, id: &BlockId) -> error::Result>> { self.backend.blockchain().body(*id) } /// Get block justification set by id. - pub fn justification(&self, id: &BlockId) -> error::Result> { + pub fn justification(&self, id: &BlockId) -> error::Result> { self.backend.blockchain().justification(*id) } /// Get best block header. - pub fn best_block_header(&self) -> error::Result { + pub fn best_block_header(&self) -> error::Result { let info = self.backend.blockchain().info().map_err(|e| error::Error::from_blockchain(Box::new(e)))?; Ok(self.header(&BlockId::Hash(info.best_hash))?.expect("Best block header must always exist")) } } -impl bft::BlockImport for Client +impl bft::BlockImport for Client where B: backend::Backend, E: state_machine::CodeExecutor, + Block: BlockT, + Hashing: HashingT, error::Error: From<::Error> { - fn import_block(&self, block: block::Block, justification: bft::Justification) { + fn import_block(&self, block: Block, justification: bft::Justification) { let justified_header = JustifiedHeader { header: block.header, justification, @@ -405,38 +407,44 @@ impl bft::BlockImport for Client } } -impl bft::Authorities for Client +impl bft::Authorities for Client where B: backend::Backend, E: state_machine::CodeExecutor, + Block: BlockT, + Hashing: HashingT, error::Error: From<::Error> { - fn authorities(&self, at: &BlockId) -> Result, bft::Error> { + fn authorities(&self, at: &BlockId) -> Result, bft::Error> { self.authorities_at(at).map_err(|_| bft::ErrorKind::StateUnavailable(*at).into()) } } -impl BlockchainEvents for Client +impl BlockchainEvents for Client where B: backend::Backend, E: state_machine::CodeExecutor, + Block: BlockT, + Hashing: HashingT, error::Error: From<::Error> { /// Get block import event stream. - fn import_notification_stream(&self) -> BlockchainEventStream { + fn import_notification_stream(&self) -> mpsc::UnboundedReceiver { let (sink, stream) = mpsc::unbounded(); self.import_notification_sinks.lock().push(sink); stream } } -impl ChainHead for Client +impl ChainHead for Client where B: backend::Backend, E: state_machine::CodeExecutor, + Block: BlockT, + Hashing: HashingT, error::Error: From<::Error> { - fn best_block_header(&self) -> error::Result { + fn best_block_header(&self) -> error::Result { Client::best_block_header(self) } } diff --git a/substrate/client/src/lib.rs b/substrate/client/src/lib.rs index 6d13f7e988761..4ec5e5c84f5c1 100644 --- a/substrate/client/src/lib.rs +++ b/substrate/client/src/lib.rs @@ -48,7 +48,7 @@ mod client; pub use client::{ new_in_mem, - BlockStatus, BlockOrigin, BlockchainEventStream, BlockchainEvents, + BlockStatus, BlockOrigin, BlockchainEvents, Client, ClientInfo, CallResult, ChainHead, ImportResult, }; diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 91a1a9c649556..8dbe4e6e1e8e3 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -129,7 +129,7 @@ pub trait SimpleBitOps: rstd::ops::BitAnd {} impl + rstd::ops::BitAnd > SimpleBitOps for T {} @@ -213,9 +213,9 @@ impl Hashing for BlakeTwo256 { #[cfg(feature = "std")] -pub trait MaybeSerializeDebug: Serialize + Debug {} +pub trait MaybeSerializeDebug: Serialize + Debug + Display {} #[cfg(feature = "std")] -impl MaybeSerializeDebug for T {} +impl MaybeSerializeDebug for T {} #[cfg(not(feature = "std"))] pub trait MaybeSerializeDebug {} From 047b294dbed5c20baf381505434cb5ac469b45be Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 24 May 2018 15:38:12 +0100 Subject: [PATCH 06/60] Make new primitives (mainly traits) build again. --- Cargo.lock | 85 ++++-------- substrate/client/Cargo.toml | 1 + substrate/client/src/block_builder.rs | 2 +- substrate/client/src/genesis.rs | 4 +- substrate/client/src/in_mem.rs | 6 +- substrate/runtime-io/Cargo.toml | 2 +- substrate/runtime/primitives/src/generic.rs | 135 ++++++++++---------- substrate/runtime/primitives/src/testing.rs | 16 ++- substrate/runtime/primitives/src/traits.rs | 66 +++++++--- 9 files changed, 160 insertions(+), 157 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 23b91932fa367..0b0337d80d7cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -88,16 +88,6 @@ dependencies = [ "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "bigint" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "bitflags" version = "1.0.1" @@ -230,7 +220,7 @@ dependencies = [ "substrate-runtime-io 0.1.0", "substrate-state-machine 0.1.0", "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -251,7 +241,7 @@ dependencies = [ "substrate-runtime-support 0.1.0", "substrate-runtime-system 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -326,14 +316,6 @@ name = "either" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "elastic-array" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "elastic-array" version = "0.10.0" @@ -397,18 +379,6 @@ dependencies = [ "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ethcore-bigint" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ethcore-bytes" version = "0.1.0" @@ -882,11 +852,11 @@ dependencies = [ [[package]] name = "keccak-hash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1205,14 +1175,6 @@ dependencies = [ "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "plain_hasher" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "polkadot" version = "0.1.0" @@ -1275,7 +1237,7 @@ dependencies = [ "substrate-state-machine 0.1.0", "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1328,7 +1290,7 @@ dependencies = [ "substrate-runtime-io 0.1.0", "substrate-runtime-support 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1633,13 +1595,12 @@ dependencies = [ [[package]] name = "rlp" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1889,10 +1850,11 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", "substrate-state-machine 0.1.0", "substrate-test-client 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1940,7 +1902,7 @@ dependencies = [ "substrate-runtime-io 0.1.0", "substrate-serializer 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2130,7 +2092,7 @@ dependencies = [ "substrate-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2267,7 +2229,7 @@ dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2480,12 +2442,13 @@ dependencies = [ [[package]] name = "triehash" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2730,7 +2693,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum backtrace 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbbf59b1c43eefa8c3ede390fcc36820b4999f7914104015be25025e0d62af2" "checksum backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "44585761d6161b0f57afc49482ab6bd067e4edef48c12a152c237eb0203f7661" "checksum base64 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "229d032f1a99302697f10b27167ae6d03d49d032e6a8e2550e8d3fc13356d2b4" -"checksum bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5442186ef6560f30f1ee4b9c1e4c87a35a6879d3644550cc248ec2b955eb5fcd" "checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" @@ -2750,13 +2712,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum edit-distance 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3bd26878c3d921f89797a4e1a1711919f999a9f6946bb6f5a4ffda126d297b7e" "checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" "checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" -"checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" "checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" "checksum eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)" = "" "checksum ethbloom 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f240172b976e2421fa5485e45cd45287bbdb56d742aa3a1d77005c49071a8518" "checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" -"checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" "checksum ethcore-bytes 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethcore-crypto 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethcore-io 1.12.0 (git+https://github.com/paritytech/parity.git)" = "" @@ -2802,7 +2762,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" "checksum jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" "checksum keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" -"checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" +"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" @@ -2840,7 +2800,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum patricia-trie 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum plain_hasher 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" -"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995" "checksum pretty_assertions 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28ea5118e2f41bfbc974b28d88c07621befd1fa5d6ec23549be96302a1a59dd2" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" @@ -2860,7 +2819,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum remove_dir_all 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b5d2f806b0fcdabd98acd380dc8daef485e22bcb7cddc811d1337967f2528cf5" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" "checksum rlp 0.2.1 (git+https://github.com/paritytech/parity.git)" = "" -"checksum rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "babe6fce20c0ca9b1582998734c4569082d0ad08e43772a1c6c40aef4f106ef9" +"checksum rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "89db7f8dfdd5eb7ab3ac3ece7a07fd273a680b4b224cb231181280e8996f9f0b" "checksum rocksdb 0.4.5 (git+https://github.com/paritytech/rust-rocksdb)" = "" "checksum rocksdb-sys 0.3.0 (git+https://github.com/paritytech/rust-rocksdb)" = "" "checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" @@ -2910,7 +2869,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6131e780037787ff1b3f8aad9da83bca02438b72277850dd6ad0d455e0e20efc" "checksum transaction-pool 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23303835df389f9c34ad45cacf392304193f974faaf48c30a4ece2b03da0ed57" "checksum triehash 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" -"checksum triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9291c7f0fae44858b5e087dd462afb382354120003778f1695b44aab98c7abd7" +"checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" diff --git a/substrate/client/Cargo.toml b/substrate/client/Cargo.toml index 0438a9afaca90..7455c51942165 100644 --- a/substrate/client/Cargo.toml +++ b/substrate/client/Cargo.toml @@ -17,6 +17,7 @@ substrate-executor = { path = "../executor" } substrate-primitives = { path = "../primitives" } substrate-runtime-io = { path = "../runtime-io" } substrate-runtime-support = { path = "../runtime-support" } +substrate-runtime-primitives = { path = "../runtime/primitives" } substrate-state-machine = { path = "../state-machine" } substrate-keyring = { path = "../../substrate/keyring" } diff --git a/substrate/client/src/block_builder.rs b/substrate/client/src/block_builder.rs index 10743df9c2204..f48729814fb33 100644 --- a/substrate/client/src/block_builder.rs +++ b/substrate/client/src/block_builder.rs @@ -49,7 +49,7 @@ impl BlockBuilder where { /// Create a new instance of builder from the given client, building on the latest block. pub fn new(client: &Client) -> error::Result { - client.info().and_then(|i| Self::at_block(&BlockId::Hash(i.chain.best_hash), client)) + client.info().and_then(|i| Self::at_block(&BlockId::::Hash(i.chain.best_hash), client)) } /// Create a new instance of builder from the given client using a particular block's ID to diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index 6da804ea529da..72d54b96ebc6b 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -22,8 +22,8 @@ use primitives::traits::{Block as BlockT, Hashing as HashingT, Zero}; /// Create a genesis block, given the initial storage. pub fn construct_genesis_block< Block: BlockT, - Hashing: HashingT -( + Hashing: HashingT, +> ( storage: &HashMap, Vec> ) -> Block { // TODO gav don't use `trie_root`! diff --git a/substrate/client/src/in_mem.rs b/substrate/client/src/in_mem.rs index 96b72fbab97ed..b1507322647f5 100644 --- a/substrate/client/src/in_mem.rs +++ b/substrate/client/src/in_mem.rs @@ -155,13 +155,13 @@ impl blockchain::Backend for Blockchain { } /// In-memory operation. -pub struct BlockImportOperation { +pub struct BlockImportOperation { pending_block: Option>, old_state: InMemory, new_state: Option, } -impl backend::BlockImportOperation for BlockImportOperation { +impl backend::BlockImportOperation for BlockImportOperation { type State = InMemory; fn state(&self) -> error::Result<&Self::State> { @@ -215,7 +215,7 @@ impl Backend { impl< Block: BlockT, Hashing: HashingT + Hash -> Backend backend::Backend for Backend { +> Backend for backend::Backend { type BlockImportOperation = BlockImportOperation; type Blockchain = Blockchain; type State = InMemory; diff --git a/substrate/runtime-io/Cargo.toml b/substrate/runtime-io/Cargo.toml index ef82206aad981..b46f9909c2018 100644 --- a/substrate/runtime-io/Cargo.toml +++ b/substrate/runtime-io/Cargo.toml @@ -13,7 +13,7 @@ environmental = { path = "../environmental", optional = true } substrate-state-machine = { path = "../state-machine", optional = true } substrate-primitives = { path = "../primitives", default_features = false } substrate-codec = { path = "../codec", default_features = false } -triehash = { version = "0.1", optional = true } +triehash = { version = "0.1.2", optional = true } ed25519 = { path = "../ed25519", optional = true } [features] diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 6af062b812ea7..7f2342d3d77f0 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -20,15 +20,15 @@ use rstd::prelude::*; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; -use traits::{self, Member}; +use traits::{self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, Block as BlockT, Header as HeaderT}; use rstd::ops; /// A vetted and verified extrinsic from the external world. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct Extrinsic where - AccountId: Member, - Index: Member, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, { /// Who signed it (note this is not a signature). @@ -40,8 +40,8 @@ pub struct Extrinsic where } impl Slicable for Extrinsic where - AccountId: Member + Slicable, - Index: Member + Slicable, + AccountId: Member + Slicable + MaybeDisplay, + Index: Member + Slicable + MaybeDisplay + SimpleArithmetic, Call: Member + Slicable { fn decode(input: &mut I) -> Option { @@ -67,8 +67,8 @@ impl Slicable for Extrinsic wher #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize))] pub struct UncheckedExtrinsic where - AccountId: Member, - Index: Member, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member, // TODO: should be Option { @@ -79,8 +79,8 @@ pub struct UncheckedExtrinsic where } impl UncheckedExtrinsic where - AccountId: Member + Default, - Index: Member, + AccountId: Member + Default + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member + Default, { @@ -92,10 +92,11 @@ impl UncheckedExtrinsic Slicable for UncheckedExtrinsic where - AccountId: Member + Slicable, - Index: Member + Slicable, - Call: Member + Slicable, - Signature: Member + Slicable + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, + Call: Member, + Signature: Member + Slicable, + Extrinsic: Slicable, { fn decode(input: &mut I) -> Option { // This is a little more complicated than usual since the binary format must be compatible @@ -117,9 +118,11 @@ impl Slicable for UncheckedExtrinsic. we'll make room for it here, then overwrite once we know the length. v.extend(&[0u8; 4]); - self.extrinsic.signed.using_encoded(|s| v.extend(s)); +/* self.extrinsic.signed.using_encoded(|s| v.extend(s)); self.extrinsic.index.using_encoded(|s| v.extend(s)); - self.extrinsic.function.using_encoded(|s| v.extend(s)); + self.extrinsic.function.using_encoded(|s| v.extend(s));*/ + self.extrinsic.using_encoded(|s| v.extend(s)); + self.signature.using_encoded(|s| v.extend(s)); let length = (v.len() - 4) as u32; @@ -131,8 +134,8 @@ impl Slicable for UncheckedExtrinsic fmt::Debug for UncheckedExtrinsic where - AccountId: Member, - Index: Member, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member, { @@ -142,11 +145,11 @@ impl fmt::Debug for UncheckedExtrinsic traits::Checkable for UncheckedExtrinsic where - AccountId: Member + Default, - Index: Member, + AccountId: Member + Default + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, - Signature: Member + Default + traits::Verify, - Extrinsic: Slicable + Signature: Member + Default + traits::Verify + Slicable, + Extrinsic: Slicable, { type Checked = CheckedExtrinsic; @@ -167,19 +170,19 @@ impl traits::Checkable for UncheckedExtrinsic /// A type-safe indicator that a extrinsic has been checked. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct CheckedExtrinsic (UncheckedExtrinsic) where - AccountId: Member, - Index: Member, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member; impl CheckedExtrinsic where - AccountId: Member, - Index: Member, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member { @@ -202,8 +205,8 @@ where impl ops::Deref for CheckedExtrinsic where - AccountId: Member, - Index: Member, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member { @@ -217,8 +220,8 @@ where impl traits::Applyable for CheckedExtrinsic where - AccountId: Member, - Index: Member, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member + AuxDispatchable, Signature: Member { @@ -241,11 +244,11 @@ where #[derive(Default, PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] -pub struct Digest { +pub struct Digest { pub logs: Vec, } impl Slicable for Digest where - Item: Member + Slicable + Item: Member + Default + Slicable { fn decode(input: &mut I) -> Option { Some(Digest { logs: Slicable::decode(input)? }) @@ -255,7 +258,7 @@ impl Slicable for Digest where } } impl traits::Digest for Digest where - Item: Member + Slicable + Item: Member + Default + Slicable { type Item = Item; fn push(&mut self, item: Self::Item) { @@ -269,9 +272,9 @@ impl traits::Digest for Digest where #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Header where - Number: Member, - Hash: Member, - DigestItem: Member, + Number: Member + MaybeDisplay + SimpleArithmetic, + Hash: Default + Member + MaybeDisplay + SimpleBitOps, + DigestItem: Member + Default, { /// The parent hash. pub parent_hash: Hash, @@ -286,9 +289,9 @@ pub struct Header where } impl Slicable for Header where - Number: Member + Slicable, - Hash: Member + Slicable, - DigestItem: Member + Slicable, + Number: Member + Slicable + MaybeDisplay + SimpleArithmetic, + Hash: Default + Member + Slicable + MaybeDisplay + SimpleBitOps, + DigestItem: Member + Default + Slicable, { fn decode(input: &mut I) -> Option { Some(Header { @@ -311,9 +314,9 @@ impl Slicable for Header whe } } impl traits::Header for Header where - Number: Member + Slicable, - Hash: Member + Slicable, - DigestItem: Member + Slicable, + Number: Member + Slicable + MaybeDisplay + SimpleArithmetic, + Hash: Default + Member + Slicable + MaybeDisplay + SimpleBitOps, + DigestItem: Member + Default + Slicable, { type Number = Number; type Hash = Hash; @@ -342,18 +345,15 @@ impl traits::Header for Header where - Number: Block::Header::Number, - Hash: Block::Header::Hash, -{ +pub enum BlockId where { /// Identify by block header hash. - Hash(Hash), + Hash(<::Header as HeaderT>::Hash), /// Identify by block number. - Number(Number), + Number(<::Header as HeaderT>::Number), } #[cfg(feature = "std")] -impl fmt::Display for Id { +impl fmt::Display for BlockId { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { write!(f, "{:?}", self) } @@ -365,11 +365,11 @@ impl fmt::Display for Id { #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Block where - Number: Member, - Hash: Member, - DigestItem: Member, - AccountId: Member, - Index: Member, + Number: Member + MaybeDisplay + SimpleArithmetic, + Hash: Default + Member + MaybeDisplay + SimpleBitOps, + DigestItem: Member + Default, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member { @@ -382,11 +382,11 @@ pub struct Block wh impl Slicable for Block where - Number: Member, - Hash: Member, - DigestItem: Member, - AccountId: Member, - Index: Member, + Number: Member + MaybeDisplay + SimpleArithmetic, + Hash: Default + Member + MaybeDisplay + SimpleBitOps, + DigestItem: Member + Default, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member, Header: Slicable, @@ -409,13 +409,15 @@ where impl traits::Block for Block where - Number: Member + Slicable, - Hash: Member + Slicable, - DigestItem: Member + Slicable, - AccountId: Member, - Index: Member, + Number: Member + MaybeDisplay + SimpleArithmetic, + Hash: Default + Member + MaybeDisplay + SimpleBitOps, + DigestItem: Member + Default, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, - Signature: Member + Signature: Member, + Header: traits::Header, + UncheckedExtrinsic: Slicable, { type Extrinsic = UncheckedExtrinsic; type Header = Header; @@ -428,4 +430,7 @@ where fn deconstruct(self) -> (Self::Header, Vec) { (self.header, self.extrinsics) } + fn new(header: Self::Header, extrinsics: Vec) -> Self { + Block { header, extrinsics } + } } diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index 7300d8d1765b5..e8fe549ecf31d 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -17,6 +17,7 @@ //! Testing utilities. use serde; +use std::fmt::Debug; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; use substrate_primitives::H256; @@ -95,11 +96,11 @@ impl traits::Header for Header { } #[derive(PartialEq, Eq, Clone, Serialize, Debug)] -pub struct Block { +pub struct Block { pub header: Header, pub extrinsics: Vec, } -impl Slicable for Block { +impl Slicable for Block { fn decode(input: &mut I) -> Option { Some(Block { header: Slicable::decode(input)?, @@ -113,7 +114,7 @@ impl Slicable for Block { v } } -impl traits::Block for Block { +impl traits::Block for Block { type Extrinsic = Xt; type Header = Header; fn header(&self) -> &Self::Header { @@ -125,11 +126,14 @@ impl traits::Block for Block { fn deconstruct(self) -> (Self::Header, Vec) { (self.header, self.extrinsics) } + fn new(header: Self::Header, extrinsics: Vec) -> Self { + Block { header, extrinsics } + } } #[derive(PartialEq, Eq, Clone, Serialize, Debug)] pub struct TestXt(pub (u64, u64, Call)); -impl Slicable for TestXt { +impl Slicable for TestXt { fn decode(input: &mut I) -> Option { Some(TestXt(Slicable::decode(input)?)) } @@ -137,11 +141,11 @@ impl Slicable for T self.0.encode() } } -impl Checkable for TestXt { +impl Checkable for TestXt { type Checked = Self; fn check(self) -> Result { Ok(self) } } -impl + Slicable + Sized + serde::Serialize> Applyable for TestXt { +impl + Slicable + Sized + serde::Serialize + Clone + Eq + Debug> Applyable for TestXt { type AccountId = u64; type Index = u64; fn sender(&self) -> &u64 { &(self.0).0 } diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 8dbe4e6e1e8e3..3d84ea23afa43 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -19,7 +19,7 @@ use rstd::prelude::*; use rstd; use runtime_io; -#[cfg(feature = "std")] use std::fmt::Debug; +#[cfg(feature = "std")] use std::fmt::{Debug, Display}; #[cfg(feature = "std")] use serde::Serialize; use substrate_primitives; use codec::Slicable; @@ -123,13 +123,37 @@ impl + Ord > SimpleArithmetic for T {} +/// Trait for things that can be clear (have no bits set). For numeric types, essentially the same +/// as `Zero`. +pub trait Clear { + /// True iff no bits are set. + fn is_clear(&self) -> bool; + + /// Return the value of Self that is clear. + fn clear() -> Self; +} + +impl Clear for T { + fn is_clear(&self) -> bool { *self == Self::clear() } + fn clear() -> Self { Default::default() } +} + +/*impl Clear for T { + fn is_clear(&self) -> bool { self.is_zero() } + fn clear() -> Self { Self::zero() } +} + +impl Clear for substrate_primitives::H256 { + fn clear() -> Self { substrate_primitives::H256::new() } +}*/ + pub trait SimpleBitOps: - Sized + Zero + + Sized + Clear + rstd::ops::BitOr + rstd::ops::BitAnd {} impl + rstd::ops::BitAnd > SimpleBitOps for T {} @@ -158,8 +182,8 @@ pub trait Hashing { fn hash(s: &[u8]) -> Self::Output; /// Produce the hash of some codec-encodable value. - fn hash_of(s: &S) -> Self::Output { - codec::Slicable::using_encoded(s, Self::hash) + fn hash_of(s: &S) -> Self::Output { + Slicable::using_encoded(s, Self::hash) } /// Produce the patricia-trie root of a mapping from indices to byte slices. @@ -186,7 +210,7 @@ pub trait Hashing { pub struct BlakeTwo256; impl Hashing for BlakeTwo256 { - type Output = primitives::H256; + type Output = substrate_primitives::H256; fn hash(s: &[u8]) -> Self::Output { runtime_io::blake2_256(s).into() } @@ -198,13 +222,13 @@ impl Hashing for BlakeTwo256 { A: AsRef<[u8]> + Ord, B: AsRef<[u8]> >(input: I) -> Self::Output { - runtime_io::trie_root(items).into() + runtime_io::trie_root(input).into() } fn ordered_trie_root< I: IntoIterator, A: AsRef<[u8]> >(input: I) -> Self::Output { - runtime_io::ordered_trie_root(items).into() + runtime_io::ordered_trie_root(input).into() } fn storage_root() -> Self::Output { runtime_io::storage_root().into() @@ -213,15 +237,25 @@ impl Hashing for BlakeTwo256 { #[cfg(feature = "std")] -pub trait MaybeSerializeDebug: Serialize + Debug + Display {} +pub trait MaybeSerializeDebug: Serialize + Debug {} #[cfg(feature = "std")] -impl MaybeSerializeDebug for T {} +impl MaybeSerializeDebug for T {} #[cfg(not(feature = "std"))] pub trait MaybeSerializeDebug {} #[cfg(not(feature = "std"))] impl MaybeSerializeDebug for T {} +#[cfg(feature = "std")] +pub trait MaybeDisplay: Display {} +#[cfg(feature = "std")] +impl MaybeDisplay for T {} + +#[cfg(not(feature = "std"))] +pub trait MaybeDisplay {} +#[cfg(not(feature = "std"))] +impl MaybeDisplay for T {} + pub trait Member: Sized + MaybeSerializeDebug + Eq + PartialEq + Clone {} impl Member for T {} @@ -244,9 +278,9 @@ impl Digest for substrate_primitives::Digest { /// `parent_hash`, as well as a `digest` and a block `number`. /// /// You can also create a `new` one from those fields. -pub trait Header: Sized + Slicable { - type Number: Member + SimpleArithmetic; - type Hash: Member + Default + SimpleBitOps; +pub trait Header: Sized + Slicable + MaybeSerializeDebug { + type Number: Member + MaybeDisplay + SimpleArithmetic; + type Hash: Member + MaybeDisplay + Default + SimpleBitOps; type Digest: Member + Default; fn number(&self) -> &Self::Number; fn extrinsics_root(&self) -> &Self::Hash; @@ -292,7 +326,7 @@ impl Header for substrate_primitives::Header { /// `Extrinsic` piece of information as well as a `Header`. /// /// You can get an iterator over each of the `extrinsics` and retrieve the `header`. -pub trait Block { +pub trait Block: Sized + Slicable + MaybeSerializeDebug { type Extrinsic: Member + Slicable; type Header: Header; fn header(&self) -> &Self::Header; @@ -332,8 +366,8 @@ pub trait Checkable: Sized { /// Also provides information on to whom this information is attributable and an index that allows /// each piece of attributable information to be disambiguated. pub trait Applyable { - type AccountId: Member; - type Index: Member + SimpleArithmetic; + type AccountId: Member + MaybeDisplay; + type Index: Member + MaybeDisplay + SimpleArithmetic; fn index(&self) -> &Self::Index; fn sender(&self) -> &Self::AccountId; fn apply(self); From f94f63e26b2ae5800a9b2600eac9fc75b8e7ac93 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 24 May 2018 16:38:44 +0100 Subject: [PATCH 07/60] Many (superficial) build fixes throughout. --- substrate/client/src/block_builder.rs | 35 +++++++-------- substrate/client/src/blockchain.rs | 14 +++--- substrate/client/src/client.rs | 64 +++++++++++++-------------- substrate/client/src/error.rs | 6 +-- substrate/client/src/genesis.rs | 6 +-- substrate/client/src/in_mem.rs | 64 +++++++++++++-------------- 6 files changed, 94 insertions(+), 95 deletions(-) diff --git a/substrate/client/src/block_builder.rs b/substrate/client/src/block_builder.rs index f48729814fb33..cc5961aa29cd3 100644 --- a/substrate/client/src/block_builder.rs +++ b/substrate/client/src/block_builder.rs @@ -22,18 +22,17 @@ use state_machine::{self, CodeExecutor}; use runtime_primitives::traits::{Header as HeaderT, Hashing as HashingT, Block as BlockT}; use runtime_primitives::generic::BlockId; use {backend, error, Client}; -use triehash::ordered_trie_root; /// Utility for building new (valid) blocks from a stream of extrinsics. pub struct BlockBuilder where B: backend::Backend, E: CodeExecutor + Clone, Block: BlockT, - Hashing: HashingT, + Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { - header: Header, - extrinsics: Vec, + header: ::Header, + extrinsics: Vec<::Extrinsic>, executor: E, state: B::State, changes: state_machine::OverlayedChanges, @@ -44,25 +43,25 @@ impl BlockBuilder where B: backend::Backend, E: CodeExecutor + Clone, Block: BlockT, - Hashing: HashingT, + Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { /// Create a new instance of builder from the given client, building on the latest block. - pub fn new(client: &Client) -> error::Result { + pub fn new(client: &Client) -> error::Result { client.info().and_then(|i| Self::at_block(&BlockId::::Hash(i.chain.best_hash), client)) } /// Create a new instance of builder from the given client using a particular block's ID to /// build upon. - pub fn at_block(block_id: &BlockId, client: &Client) -> error::Result { + pub fn at_block(block_id: &BlockId, client: &Client) -> error::Result { Ok(BlockBuilder { - header: Header { - number: client.block_number_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(Box::new(block_id.clone())))? + 1, - parent_hash: client.block_hash_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(Box::new(block_id.clone())))?, - state_root: Default::default(), - extrinsics_root: Default::default(), - digest: Default::default(), - }, + header: <::Header as HeaderT>::new( + client.block_number_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(Box::new(block_id.clone())))? + 1, + Default::default(), + Default::default(), + client.block_hash_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(Box::new(block_id.clone())))?, + Default::default() + ), extrinsics: Default::default(), executor: client.clone_executor(), state: client.state_at(block_id)?, @@ -73,10 +72,10 @@ impl BlockBuilder where /// Push a transaction onto the block's list of extrinsics. This will ensure the transaction /// can be validly executed (by executing it); if it is invalid, it'll be returned along with /// the error. Otherwise, it will return a mutable reference to self (in order to chain). - pub fn push(&mut self, xt: Block::Extrinsic) -> error::Result<()> { + pub fn push(&mut self, xt: ::Extrinsic) -> error::Result<()> { let (output, _) = state_machine::execute(&self.state, &mut self.changes, &self.executor, "execute_transaction", &vec![].and(&self.header).and(&xt))?; - self.header = Block::Header::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); + self.header = <::Header as Slicable>::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); self.extrinsics.push(xt); Ok(()) } @@ -86,7 +85,7 @@ impl BlockBuilder where self.header.extrinsics_root = Hashing::ordered_trie_root(self.extrinsics.iter().map(Slicable::encode)); let (output, _) = state_machine::execute(&self.state, &mut self.changes, &self.executor, "finalise_block", &self.header.encode())?; - self.header = Block::Header::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); - Ok(Block::new(self.header, self.extrinsics)) + self.header = <::Header as Slicable>::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); + Ok(::new(self.header, self.extrinsics)) } } diff --git a/substrate/client/src/blockchain.rs b/substrate/client/src/blockchain.rs index b36171c93f7b7..d6f618c8b0c8b 100644 --- a/substrate/client/src/blockchain.rs +++ b/substrate/client/src/blockchain.rs @@ -16,7 +16,7 @@ //! Polkadot blockchain trait -use runtime_primitives::traits::Block as BlockT; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; use runtime_primitives::generic::BlockId; use primitives::bft::Justification; @@ -25,9 +25,9 @@ use error::Result; /// Blockchain database backend. Does not perform any validation. pub trait Backend: Send + Sync { /// Get block header. Returns `None` if block is not found. - fn header(&self, id: BlockId) -> Result>; + fn header(&self, id: BlockId) -> Result::Header>>; /// Get block body. Returns `None` if block is not found. - fn body(&self, id: BlockId) -> Result>>; + fn body(&self, id: BlockId) -> Result::Extrinsic>>>; /// Get block justification. Returns `None` if justification does not exist. fn justification(&self, id: BlockId) -> Result>; /// Get blockchain info. @@ -35,7 +35,7 @@ pub trait Backend: Send + Sync { /// Get block status. fn status(&self, id: BlockId) -> Result; /// Get block hash by number. Returns `None` if the header is not in the chain. - fn hash(&self, number: Block::Header::Number) -> Result>; + fn hash(&self, number: <::Header as HeaderT>::Number) -> Result::Header as HeaderT>::Hash>>; } /// Block import outcome @@ -54,11 +54,11 @@ pub enum ImportResult { #[derive(Debug)] pub struct Info { /// Best block hash. - pub best_hash: Block::Header::Hash, + pub best_hash: <::Header as HeaderT>::Hash, /// Best block number. - pub best_number: Block::Header::Number, + pub best_number: <::Header as HeaderT>::Number, /// Genesis block hash. - pub genesis_hash: Block::Header::Hash, + pub genesis_hash: <::Header as HeaderT>::Hash, } /// Block status. diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 8958599eae2b6..06e2d102282b4 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -21,7 +21,7 @@ use parking_lot::Mutex; use std::marker::PhantomData; use primitives::{self, AuthorityId}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Hashing as HashingT, Zero}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing as HashingT, Zero}; use primitives::storage::{StorageKey, StorageData}; use codec::{KeyedVec, Slicable}; use state_machine::{self, Ext, OverlayedChanges, Backend as StateBackend, CodeExecutor}; @@ -47,7 +47,7 @@ pub trait BlockchainEvents { /// Chain head information. pub trait ChainHead { /// Get best block header. - fn best_block_header(&self) -> Result; + fn best_block_header(&self) -> Result<::Header, error::Error>; } /// Client info @@ -57,9 +57,9 @@ pub struct ClientInfo { /// Best block hash. pub chain: ChainInfo, /// Best block number in the queue. - pub best_queued_number: Option, + pub best_queued_number: Option<<::Header as HeaderT>::Number>, /// Best queued block hash. - pub best_queued_hash: Option, + pub best_queued_hash: Option<<::Header as HeaderT>::Hash>, } /// Information regarding the result of a call. @@ -119,11 +119,11 @@ pub enum BlockOrigin { #[derive(Clone, Debug)] pub struct BlockImportNotification { /// Imported block header hash. - pub hash: Block::Header::Hash, + pub hash: <::Header as HeaderT>::Hash, /// Imported block origin. pub origin: BlockOrigin, /// Imported block header. - pub header: Block::Header, + pub header: ::Header, /// Is this the new best block. pub is_new_best: bool, } @@ -131,13 +131,13 @@ pub struct BlockImportNotification { /// A header paired with a justification which has already been checked. #[derive(Debug, PartialEq, Eq, Clone)] pub struct JustifiedHeader { - header: Block::Header, + header: ::Header, justification: bft::Justification, } impl JustifiedHeader { /// Deconstruct the justified header into parts. - pub fn into_inner(self) -> (Block::Header, bft::Justification) { + pub fn into_inner(self) -> (::Header, bft::Justification) { (self.header, self.justification) } } @@ -146,18 +146,18 @@ impl JustifiedHeader { pub fn new_in_mem( executor: E, build_genesis: F -) -> error::Result> +) -> error::Result, E, Block, Hashing>> where E: CodeExecutor, - F: FnOnce() -> (Block::Header, Vec<(Vec, Vec)>) + F: FnOnce() -> (::Header, Vec<(Vec, Vec)>) { Client::new(in_mem::Backend::new(), executor, build_genesis) } impl Client where - B: backend::Backend, + B: backend::Backend, E: CodeExecutor, - error::Error: From<<::State as StateBackend>::Error>, + error::Error: From<<>::State as StateBackend>::Error>, { /// Creates new Polkadot Client with given blockchain and code executor. pub fn new( @@ -166,7 +166,7 @@ impl Client where build_genesis: F ) -> error::Result where - F: FnOnce() -> (Block::Header, Vec<(Vec, Vec)>) + F: FnOnce() -> (::Header, Vec<(Vec, Vec)>) { if backend.blockchain().header(BlockId::Number(Zero::zero()))?.is_none() { trace!("Empty database, writing genesis block"); @@ -269,9 +269,9 @@ impl Client where /// Check a header's justification. pub fn check_justification( &self, - header: Block::Header, + header: ::Header, justification: bft::UncheckedJustification, - ) -> error::Result { + ) -> error::Result> { let authorities = self.authorities_at(&BlockId::Hash(header.parent_hash))?; let just = bft::check_justification(&authorities[..], header.parent_hash, justification) .map_err(|_| error::ErrorKind::BadJustification(Box::new(BlockId::Hash(Hashing::hash_of(header)))))?; @@ -285,8 +285,8 @@ impl Client where pub fn import_block( &self, origin: BlockOrigin, - header: JustifiedHeader, - body: Option>, + header: JustifiedHeader, + body: Option::Extrinsic>>, ) -> error::Result { // TODO: import lock // TODO: import justification. @@ -304,7 +304,7 @@ impl Client where &mut overlay, &self.executor, "execute_block", - &Block::new(header.clone(), body.clone().unwrap_or_default()).encode() + &::new(header.clone(), body.clone().unwrap_or_default()).encode() )?; let is_new_best = header.number == self.backend.blockchain().info()?.best_number + 1; @@ -347,12 +347,12 @@ impl Client where } /// Get block hash by number. - pub fn block_hash(&self, block_number: Block::Header::Number) -> error::Result> { + pub fn block_hash(&self, block_number: <::Header as HeaderT>::Number) -> error::Result::Header as HeaderT>::Hash>> { self.backend.blockchain().hash(block_number) } /// Convert an arbitrary block ID into a block hash. - pub fn block_hash_from_id(&self, id: &BlockId) -> error::Result> { + pub fn block_hash_from_id(&self, id: &BlockId) -> error::Result::Header as HeaderT>::Hash>> { match *id { BlockId::Hash(h) => Ok(Some(h)), BlockId::Number(n) => self.block_hash(n), @@ -360,7 +360,7 @@ impl Client where } /// Convert an arbitrary block ID into a block hash. - pub fn block_number_from_id(&self, id: &BlockId) -> error::Result> { + pub fn block_number_from_id(&self, id: &BlockId) -> error::Result::Header as HeaderT>::Number>> { match *id { BlockId::Hash(_) => Ok(self.header(id)?.map(|h| h.number)), BlockId::Number(n) => Ok(Some(n)), @@ -368,12 +368,12 @@ impl Client where } /// Get block header by id. - pub fn header(&self, id: &BlockId) -> error::Result> { + pub fn header(&self, id: &BlockId) -> error::Result::Header>> { self.backend.blockchain().header(*id) } /// Get block body by id. - pub fn body(&self, id: &BlockId) -> error::Result>> { + pub fn body(&self, id: &BlockId) -> error::Result::Extrinsic>>> { self.backend.blockchain().body(*id) } @@ -383,7 +383,7 @@ impl Client where } /// Get best block header. - pub fn best_block_header(&self) -> error::Result { + pub fn best_block_header(&self) -> error::Result<::Header> { let info = self.backend.blockchain().info().map_err(|e| error::Error::from_blockchain(Box::new(e)))?; Ok(self.header(&BlockId::Hash(info.best_hash))?.expect("Best block header must always exist")) } @@ -391,7 +391,7 @@ impl Client where impl bft::BlockImport for Client where - B: backend::Backend, + B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, Hashing: HashingT, @@ -409,7 +409,7 @@ impl bft::BlockImport for Client impl bft::Authorities for Client where - B: backend::Backend, + B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, Hashing: HashingT, @@ -420,31 +420,31 @@ impl bft::Authorities for Client } } -impl BlockchainEvents for Client +impl BlockchainEvents for Client where - B: backend::Backend, + B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, Hashing: HashingT, error::Error: From<::Error> { /// Get block import event stream. - fn import_notification_stream(&self) -> mpsc::UnboundedReceiver { + fn import_notification_stream(&self) -> mpsc::UnboundedReceiver> { let (sink, stream) = mpsc::unbounded(); self.import_notification_sinks.lock().push(sink); stream } } -impl ChainHead for Client +impl ChainHead for Client where - B: backend::Backend, + B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, Hashing: HashingT, error::Error: From<::Error> { - fn best_block_header(&self) -> error::Result { + fn best_block_header(&self) -> error::Result<::Header> { Client::best_block_header(self) } } diff --git a/substrate/client/src/error.rs b/substrate/client/src/error.rs index 9a12a51ccb8a6..50b05d0917244 100644 --- a/substrate/client/src/error.rs +++ b/substrate/client/src/error.rs @@ -16,7 +16,7 @@ //! Polkadot client possible errors. -use std; +use std::{self, fmt}; use state_machine; use primitives::hexdisplay::HexDisplay; @@ -29,7 +29,7 @@ error_chain! { } /// Unknown block. - UnknownBlock(h: Box) { + UnknownBlock(h: Box) { description("unknown block"), display("UnknownBlock: {}", h), } @@ -77,7 +77,7 @@ error_chain! { } /// Bad justification for header. - BadJustification(h: Box) { + BadJustification(h: Box) { description("bad justification for header"), display("bad justification for header: {}", h), } diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index 72d54b96ebc6b..98e776026945c 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -17,12 +17,12 @@ //! Tool for creating the genesis block. use std::collections::HashMap; -use primitives::traits::{Block as BlockT, Hashing as HashingT, Zero}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing as HashingT, Zero}; /// Create a genesis block, given the initial storage. pub fn construct_genesis_block< Block: BlockT, - Hashing: HashingT, + Hashing: HashingT::Header as HeaderT>::Hash>, > ( storage: &HashMap, Vec> ) -> Block { @@ -30,7 +30,7 @@ pub fn construct_genesis_block< let state_root = Hashing::trie_root(storage.clone().into_iter()); let extrinsics_root = Hashing::trie_root(vec![].into_iter()); Block::new( - Block::Header::new( + <::Header as HeaderT>::new( Zero::zero(), extrinsics_root, state_root, diff --git a/substrate/client/src/in_mem.rs b/substrate/client/src/in_mem.rs index b1507322647f5..9760bd4a880b0 100644 --- a/substrate/client/src/in_mem.rs +++ b/substrate/client/src/in_mem.rs @@ -17,44 +17,44 @@ //! In memory client backend use std::collections::HashMap; +use std::hash; use std::marker::PhantomData; use parking_lot::RwLock; use error; use backend; -use codec::Slicable; use primitives; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing as HashingT, Zero}; use blockchain::{self, BlockStatus}; use state_machine::backend::{Backend as StateBackend, InMemory}; -struct PendingBlock { - block: Block, +struct PendingBlock { + block: B, is_best: bool, } #[derive(PartialEq, Eq, Clone)] -struct Block { - header: Block::Header, +struct Block { + header: B::Header, justification: Option, - body: Option>, + body: Option>, } #[derive(Clone)] struct BlockchainStorage { - blocks: HashMap, - hashes: HashMap, - best_hash: Block::Header::Hash, - best_number: Block::Header::Number, - genesis_hash: Block::Header::Hash, + blocks: HashMap<<::Header as HeaderT>::Hash, Block>, + hashes: HashMap<<::Header as HeaderT>::Number, <::Header as HeaderT>::Hash>, + best_hash: <::Header as HeaderT>::Hash, + best_number: <::Header as HeaderT>::Number, + genesis_hash: <::Header as HeaderT>::Hash, } /// In-memory blockchain. Supports concurrent reads. -pub struct Blockchain { +pub struct Blockchain { storage: RwLock>, } -impl Clone for Blockchain { +impl Clone for Blockchain { fn clone(&self) -> Self { Blockchain { storage: RwLock::new(self.storage.read().clone()), @@ -63,7 +63,7 @@ impl Clone for Blockchain { } impl Blockchain { - fn id(&self, id: BlockId) -> Option { + fn id(&self, id: BlockId) -> Option<<::Header as HeaderT>::Hash> { match id { BlockId::Hash(h) => Some(h), BlockId::Number(n) => self.storage.read().hashes.get(&n).cloned(), @@ -85,15 +85,15 @@ impl Blockchain { fn insert( &self, - hash: Block::Header::Hash, - header: Block::Header, + hash: <::Header as HeaderT>::Hash, + header: ::Header, justification: Option, - body: Option>, + body: Option::Extrinsic>>, is_new_best: bool ) { let number = header.number; let mut storage = self.storage.write(); - storage.blocks.insert(hash, Block::new(header, body, justification)); + storage.blocks.insert(hash, ::new(header, body, justification)); storage.hashes.insert(number, hash); if is_new_best { storage.best_hash = hash; @@ -121,11 +121,11 @@ impl Blockchain { } impl blockchain::Backend for Blockchain { - fn header(&self, id: BlockId) -> error::Result> { + fn header(&self, id: BlockId) -> error::Result::Header>> { Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).map(|b| b.header.clone()))) } - fn body(&self, id: BlockId) -> error::Result>> { + fn body(&self, id: BlockId) -> error::Result::Extrinsic>>> { Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).and_then(|b| b.body.clone()))) } @@ -142,14 +142,14 @@ impl blockchain::Backend for Blockchain { }) } - fn status(&self, id: BlockId) -> error::Result { + fn status(&self, id: BlockId) -> error::Result { match self.id(id).map_or(false, |hash| self.storage.read().blocks.contains_key(&hash)) { true => Ok(BlockStatus::InChain), false => Ok(BlockStatus::Unknown), } } - fn hash(&self, number: Block::Header::Number) -> error::Result> { + fn hash(&self, number: <::Header as HeaderT>::Number) -> error::Result::Header as HeaderT>::Hash>> { Ok(self.id(BlockId::Number(number))) } } @@ -170,14 +170,14 @@ impl backend::BlockImportOperation for BlockImportOperatio fn set_block_data( &mut self, - header: Block::Header, - body: Option>, + header: ::Header, + body: Option::Extrinsic>>, justification: Option, is_new_best: bool ) -> error::Result<()> { assert!(self.pending_block.is_none(), "Only one block per operation is allowed"); self.pending_block = Some(PendingBlock { - block: Block::new(header, body, justification), + block: ::new(header, body, justification), is_best: is_new_best, }); Ok(()) @@ -195,15 +195,15 @@ impl backend::BlockImportOperation for BlockImportOperatio } /// In-memory backend. Keeps all states and blocks in memory. Useful for testing. -pub struct Backend { - states: RwLock>, +pub struct Backend { + states: RwLock::Header as HeaderT>::Hash, InMemory>>, blockchain: Blockchain, dummy: PhantomData, } -impl Backend { +impl Backend { /// Create a new instance of in-mem backend. - pub fn new() -> Backend { + pub fn new() -> Backend { Backend { states: RwLock::new(HashMap::new()), blockchain: Blockchain::new(), @@ -214,8 +214,8 @@ impl Backend { impl< Block: BlockT, - Hashing: HashingT + Hash -> Backend for backend::Backend { + Hashing: HashingT + hash::Hash +> backend::Backend for Backend { type BlockImportOperation = BlockImportOperation; type Blockchain = Blockchain; type State = InMemory; @@ -247,7 +247,7 @@ impl< &self.blockchain } - fn state_at(&self, block: BlockId) -> error::Result { + fn state_at(&self, block: BlockId) -> error::Result { match self.blockchain.id(block).and_then(|id| self.states.read().get(&id).cloned()) { Some(state) => Ok(state), None => Err(error::ErrorKind::UnknownBlock(Box::new(block)).into()), From 0fe89972a658a39fa70580c6c2cc9d27ae46dd58 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 24 May 2018 17:01:16 +0100 Subject: [PATCH 08/60] Fix remaining build issues up to bft interface. --- substrate/client/src/block_builder.rs | 4 +- substrate/client/src/client.rs | 28 +++++++--- substrate/client/src/error.rs | 4 +- substrate/client/src/in_mem.rs | 19 +++++-- substrate/runtime/primitives/src/testing.rs | 14 ++--- substrate/runtime/primitives/src/traits.rs | 62 +++++++++++---------- 6 files changed, 77 insertions(+), 54 deletions(-) diff --git a/substrate/client/src/block_builder.rs b/substrate/client/src/block_builder.rs index cc5961aa29cd3..bef3425480148 100644 --- a/substrate/client/src/block_builder.rs +++ b/substrate/client/src/block_builder.rs @@ -17,6 +17,7 @@ //! Utility struct to build a block. use std::vec::Vec; +use std::marker::PhantomData; use codec::{Joiner, Slicable}; use state_machine::{self, CodeExecutor}; use runtime_primitives::traits::{Header as HeaderT, Hashing as HashingT, Block as BlockT}; @@ -36,7 +37,7 @@ pub struct BlockBuilder where executor: E, state: B::State, changes: state_machine::OverlayedChanges, - // will probably need PhantomData here... + dummy: PhantomData, } impl BlockBuilder where @@ -66,6 +67,7 @@ impl BlockBuilder where executor: client.clone_executor(), state: client.state_at(block_id)?, changes: Default::default(), + dummy: Default::default(), }) } diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 06e2d102282b4..9b2982cdce652 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -18,6 +18,7 @@ use futures::sync::mpsc; use parking_lot::Mutex; +use std::hash; use std::marker::PhantomData; use primitives::{self, AuthorityId}; use runtime_primitives::generic::BlockId; @@ -31,7 +32,10 @@ use blockchain::{self, Info as ChainInfo, Backend as ChainBackend}; use {error, in_mem, block_builder, runtime_io, bft}; /// Polkadot Client -pub struct Client { +pub struct Client where + Block: BlockT, + Hashing: HashingT::Header as HeaderT>::Hash>, +{ backend: B, executor: E, import_notification_sinks: Mutex>>>, @@ -143,21 +147,27 @@ impl JustifiedHeader { } /// Create an instance of in-memory client. -pub fn new_in_mem( +pub fn new_in_mem( executor: E, build_genesis: F ) -> error::Result, E, Block, Hashing>> where E: CodeExecutor, - F: FnOnce() -> (::Header, Vec<(Vec, Vec)>) + F: FnOnce() -> (::Header, Vec<(Vec, Vec)>), + Block: BlockT, + Hashing: HashingT::Header as HeaderT>::Hash>, + <::Header as HeaderT>::Hash: hash::Hash, { Client::new(in_mem::Backend::new(), executor, build_genesis) } -impl Client where +impl Client where B: backend::Backend, E: CodeExecutor, + Block: BlockT, + Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<<>::State as StateBackend>::Error>, + <::Header as HeaderT>::Hash: hash::Hash, { /// Creates new Polkadot Client with given blockchain and code executor. pub fn new( @@ -394,12 +404,12 @@ impl bft::BlockImport for Client B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, - Hashing: HashingT, + Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<::Error> { fn import_block(&self, block: Block, justification: bft::Justification) { let justified_header = JustifiedHeader { - header: block.header, + header: block.header(), justification, }; @@ -412,7 +422,7 @@ impl bft::Authorities for Client B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, - Hashing: HashingT, + Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<::Error> { fn authorities(&self, at: &BlockId) -> Result, bft::Error> { @@ -425,7 +435,7 @@ impl BlockchainEvents for Client, E: state_machine::CodeExecutor, Block: BlockT, - Hashing: HashingT, + Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<::Error> { /// Get block import event stream. @@ -441,7 +451,7 @@ impl ChainHead for Client B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, - Hashing: HashingT, + Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<::Error> { fn best_block_header(&self) -> error::Result<::Header> { diff --git a/substrate/client/src/error.rs b/substrate/client/src/error.rs index 50b05d0917244..58052220a2047 100644 --- a/substrate/client/src/error.rs +++ b/substrate/client/src/error.rs @@ -29,7 +29,7 @@ error_chain! { } /// Unknown block. - UnknownBlock(h: Box) { + UnknownBlock(h: Box) { description("unknown block"), display("UnknownBlock: {}", h), } @@ -77,7 +77,7 @@ error_chain! { } /// Bad justification for header. - BadJustification(h: Box) { + BadJustification(h: Box) { description("bad justification for header"), display("bad justification for header: {}", h), } diff --git a/substrate/client/src/in_mem.rs b/substrate/client/src/in_mem.rs index 9760bd4a880b0..f434959da821d 100644 --- a/substrate/client/src/in_mem.rs +++ b/substrate/client/src/in_mem.rs @@ -195,13 +195,21 @@ impl backend::BlockImportOperation for BlockImportOperatio } /// In-memory backend. Keeps all states and blocks in memory. Useful for testing. -pub struct Backend { +pub struct Backend where + Block: BlockT, + Hashing: HashingT::Header as HeaderT>::Hash>, + <::Header as HeaderT>::Hash: hash::Hash, +{ states: RwLock::Header as HeaderT>::Hash, InMemory>>, blockchain: Blockchain, dummy: PhantomData, } -impl Backend { +impl Backend where + Block: BlockT, + Hashing: HashingT::Header as HeaderT>::Hash>, + <::Header as HeaderT>::Hash: hash::Hash, +{ /// Create a new instance of in-mem backend. pub fn new() -> Backend { Backend { @@ -212,10 +220,11 @@ impl Backend { } } -impl< +impl backend::Backend for Backend where Block: BlockT, - Hashing: HashingT + hash::Hash -> backend::Backend for Backend { + Hashing: HashingT::Header as HeaderT>::Hash>, + <::Header as HeaderT>::Hash: hash::Hash, +{ type BlockImportOperation = BlockImportOperation; type Blockchain = Blockchain; type State = InMemory; diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index e8fe549ecf31d..bd5f798a5a05a 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -96,11 +96,11 @@ impl traits::Header for Header { } #[derive(PartialEq, Eq, Clone, Serialize, Debug)] -pub struct Block { +pub struct Block { pub header: Header, pub extrinsics: Vec, } -impl Slicable for Block { +impl Slicable for Block { fn decode(input: &mut I) -> Option { Some(Block { header: Slicable::decode(input)?, @@ -114,7 +114,7 @@ impl Slicable for v } } -impl traits::Block for Block { +impl traits::Block for Block { type Extrinsic = Xt; type Header = Header; fn header(&self) -> &Self::Header { @@ -132,8 +132,8 @@ impl traits::Block } #[derive(PartialEq, Eq, Clone, Serialize, Debug)] -pub struct TestXt(pub (u64, u64, Call)); -impl Slicable for TestXt { +pub struct TestXt(pub (u64, u64, Call)); +impl Slicable for TestXt { fn decode(input: &mut I) -> Option { Some(TestXt(Slicable::decode(input)?)) } @@ -141,11 +141,11 @@ impl Checkable for TestXt { +impl Checkable for TestXt { type Checked = Self; fn check(self) -> Result { Ok(self) } } -impl + Slicable + Sized + serde::Serialize + Clone + Eq + Debug> Applyable for TestXt { +impl + Slicable + Sized + Send + Sync + serde::Serialize + Clone + Eq + Debug> Applyable for TestXt { type AccountId = u64; type Index = u64; fn sender(&self) -> &u64 { &(self.0).0 } diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 3d84ea23afa43..66aae6fd41a6c 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -236,6 +236,32 @@ impl Hashing for BlakeTwo256 { } +/// Something that can be checked for equality and printed out to a debug channel if bad. +pub trait CheckEqual { + fn check_equal(&self, other: &Self); +} + +impl CheckEqual for substrate_primitives::H256 { + #[cfg(feature = "std")] + fn check_equal(&self, other: &Self) { + use substrate_primitives::hexdisplay::HexDisplay; + if &self.0 != &other.0 { + println!("Hash: given={}, expected={}", HexDisplay::from(&self.0), HexDisplay::from(&other.0)); + } + } + + #[cfg(not(feature = "std"))] + fn check_equal(&self, other: &Self) { + if self != other { + runtime_io::print("Hash not equal"); + runtime_io::print(&self.0[..]); + runtime_io::print(&other.0[..]); + } + } +} + + + #[cfg(feature = "std")] pub trait MaybeSerializeDebug: Serialize + Debug {} #[cfg(feature = "std")] @@ -256,8 +282,8 @@ pub trait MaybeDisplay {} #[cfg(not(feature = "std"))] impl MaybeDisplay for T {} -pub trait Member: Sized + MaybeSerializeDebug + Eq + PartialEq + Clone {} -impl Member for T {} +pub trait Member: Send + Sync + Sized + MaybeSerializeDebug + Eq + PartialEq + Clone {} +impl Member for T {} /// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are /// each `Slicable`. @@ -278,7 +304,7 @@ impl Digest for substrate_primitives::Digest { /// `parent_hash`, as well as a `digest` and a block `number`. /// /// You can also create a `new` one from those fields. -pub trait Header: Sized + Slicable + MaybeSerializeDebug { +pub trait Header: Sized + Send + Sync + Slicable + MaybeSerializeDebug { type Number: Member + MaybeDisplay + SimpleArithmetic; type Hash: Member + MaybeDisplay + Default + SimpleBitOps; type Digest: Member + Default; @@ -326,7 +352,7 @@ impl Header for substrate_primitives::Header { /// `Extrinsic` piece of information as well as a `Header`. /// /// You can get an iterator over each of the `extrinsics` and retrieve the `header`. -pub trait Block: Sized + Slicable + MaybeSerializeDebug { +pub trait Block: Sized + Send + Sync + Slicable + MaybeSerializeDebug { type Extrinsic: Member + Slicable; type Header: Header; fn header(&self) -> &Self::Header; @@ -354,7 +380,7 @@ impl Block for substrate_primitives::Block { /// A "checkable" piece of information, used by the standard Substrate Executive in order to /// check the validity of a piece of extrinsic information, usually by verifying the signature. -pub trait Checkable: Sized { +pub trait Checkable: Sized + Send + Sync { type Checked: Member; fn check(self) -> Result; } @@ -365,34 +391,10 @@ pub trait Checkable: Sized { /// /// Also provides information on to whom this information is attributable and an index that allows /// each piece of attributable information to be disambiguated. -pub trait Applyable { +pub trait Applyable: Sized + Send + Sync { type AccountId: Member + MaybeDisplay; type Index: Member + MaybeDisplay + SimpleArithmetic; fn index(&self) -> &Self::Index; fn sender(&self) -> &Self::AccountId; fn apply(self); } - -/// Something that can be checked for equality and printed out to a debug channel if bad. -pub trait CheckEqual { - fn check_equal(&self, other: &Self); -} - -impl CheckEqual for substrate_primitives::H256 { - #[cfg(feature = "std")] - fn check_equal(&self, other: &Self) { - use substrate_primitives::hexdisplay::HexDisplay; - if &self.0 != &other.0 { - println!("Hash: given={}, expected={}", HexDisplay::from(&self.0), HexDisplay::from(&other.0)); - } - } - - #[cfg(not(feature = "std"))] - fn check_equal(&self, other: &Self) { - if self != other { - runtime_io::print("Hash not equal"); - runtime_io::print(&self.0[..]); - runtime_io::print(&other.0[..]); - } - } -} From 9f0113b3ccb5eb555436d5f7a7627ad2e17b67d8 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 24 May 2018 18:08:17 +0100 Subject: [PATCH 09/60] Make bft primitives be generic. --- Cargo.lock | 1 + substrate/bft/Cargo.toml | 1 + substrate/bft/src/generic/mod.rs | 1 + substrate/bft/src/generic/primitives.rs | 305 ++++++++++++++++++++ substrate/bft/src/lib.rs | 1 + substrate/client/src/client.rs | 13 +- substrate/runtime/primitives/src/generic.rs | 24 +- substrate/runtime/primitives/src/traits.rs | 4 +- 8 files changed, 329 insertions(+), 21 deletions(-) create mode 100644 substrate/bft/src/generic/primitives.rs diff --git a/Cargo.lock b/Cargo.lock index 0b0337d80d7cc..22271e0bccb0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1829,6 +1829,7 @@ dependencies = [ "substrate-executor 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/substrate/bft/Cargo.toml b/substrate/bft/Cargo.toml index 72aac2903e053..68179536b4330 100644 --- a/substrate/bft/Cargo.toml +++ b/substrate/bft/Cargo.toml @@ -8,6 +8,7 @@ futures = "0.1.17" substrate-codec = { path = "../codec" } substrate-primitives = { path = "../primitives" } substrate-runtime-support = { path = "../runtime-support" } +substrate-runtime-primitives = { path = "../runtime/primitives" } ed25519 = { path = "../ed25519" } tokio-timer = "0.1.2" parking_lot = "0.4" diff --git a/substrate/bft/src/generic/mod.rs b/substrate/bft/src/generic/mod.rs index 0795cbfc62291..a9d7eb50dcb12 100644 --- a/substrate/bft/src/generic/mod.rs +++ b/substrate/bft/src/generic/mod.rs @@ -29,6 +29,7 @@ use self::accumulator::State; pub use self::accumulator::{Accumulator, Justification, PrepareJustification, UncheckedJustification, Misbehavior}; mod accumulator; +pub mod primitives; #[cfg(test)] mod tests; diff --git a/substrate/bft/src/generic/primitives.rs b/substrate/bft/src/generic/primitives.rs new file mode 100644 index 0000000000000..4f7124e07de89 --- /dev/null +++ b/substrate/bft/src/generic/primitives.rs @@ -0,0 +1,305 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Message formats for the BFT consensus layer. + +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; +use codec::{Slicable, Input}; +use std::vec::Vec; +use primitives::{AuthorityId, Signature}; + +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +#[repr(i8)] +enum ActionKind { + Propose = 1, + ProposeHeader = 2, + Prepare = 3, + Commit = 4, + AdvanceRound = 5, +} + +/// Actions which can be taken during the BFT process. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Action { + /// Proposal of a block candidate. + Propose(u32, Block), + /// Proposal header of a block candidate. Accompanies any proposal, + /// but is used for misbehavior reporting since blocks themselves are big. + ProposeHeader(u32, <::Header as HeaderT>::Hash), + /// Preparation to commit for a candidate. + Prepare(u32, <::Header as HeaderT>::Hash), + /// Vote to commit to a candidate. + Commit(u32, <::Header as HeaderT>::Hash), + /// Vote to advance round after inactive primary. + AdvanceRound(u32), +} + +impl Slicable for Action { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Action::Propose(ref round, ref block) => { + v.push(ActionKind::Propose as u8); + round.using_encoded(|s| v.extend(s)); + block.using_encoded(|s| v.extend(s)); + } + Action::ProposeHeader(ref round, ref hash) => { + v.push(ActionKind::ProposeHeader as u8); + round.using_encoded(|s| v.extend(s)); + hash.using_encoded(|s| v.extend(s)); + } + Action::Prepare(ref round, ref hash) => { + v.push(ActionKind::Prepare as u8); + round.using_encoded(|s| v.extend(s)); + hash.using_encoded(|s| v.extend(s)); + } + Action::Commit(ref round, ref hash) => { + v.push(ActionKind::Commit as u8); + round.using_encoded(|s| v.extend(s)); + hash.using_encoded(|s| v.extend(s)); + } + Action::AdvanceRound(ref round) => { + v.push(ActionKind::AdvanceRound as u8); + round.using_encoded(|s| v.extend(s)); + } + } + + v + } + + fn decode(value: &mut I) -> Option { + match i8::decode(value) { + Some(x) if x == ActionKind::Propose as i8 => { + let (round, block) = Slicable::decode(value)?; + Some(Action::Propose(round, block)) + } + Some(x) if x == ActionKind::ProposeHeader as i8 => { + let (round, hash) = Slicable::decode(value)?; + Some(Action::ProposeHeader(round, hash)) + } + Some(x) if x == ActionKind::Prepare as i8 => { + let (round, hash) = Slicable::decode(value)?; + Some(Action::Prepare(round, hash)) + } + Some(x) if x == ActionKind::Commit as i8 => { + let (round, hash) = Slicable::decode(value)?; + Some(Action::Commit(round, hash)) + } + Some(x) if x == ActionKind::AdvanceRound as i8 => { + Slicable::decode(value).map(Action::AdvanceRound) + } + _ => None, + } + } +} + +/// Messages exchanged between participants in the BFT consensus. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Message { + /// The parent header hash this action is relative to. + pub parent: <::Header as HeaderT>::Hash, + /// The action being broadcasted. + pub action: Action, +} + +impl Slicable for Message { + fn encode(&self) -> Vec { + let mut v = self.parent.encode(); + self.action.using_encoded(|s| v.extend(s)); + v + } + + fn decode(value: &mut I) -> Option { + Some(Message { + parent: Slicable::decode(value)?, + action: Slicable::decode(value)?, + }) + } +} + +/// Justification of a block. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Justification { + /// The round consensus was reached in. + pub round_number: u32, + /// The hash of the header justified. + pub hash: <::Header as HeaderT>::Hash, + /// The signatures and signers of the hash. + pub signatures: Vec<(AuthorityId, Signature)> +} + +impl Slicable for Justification { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + self.round_number.using_encoded(|s| v.extend(s)); + self.hash.using_encoded(|s| v.extend(s)); + self.signatures.using_encoded(|s| v.extend(s)); + + v + } + + fn decode(value: &mut I) -> Option { + Some(Justification { + round_number: Slicable::decode(value)?, + hash: Slicable::decode(value)?, + signatures: Slicable::decode(value)?, + }) + } +} + +// single-byte code to represent misbehavior kind. +#[repr(i8)] +enum MisbehaviorCode { + /// BFT: double prepare. + BftDoublePrepare = 0x11, + /// BFT: double commit. + BftDoubleCommit = 0x12, +} + +impl MisbehaviorCode { + fn from_i8(x: i8) -> Option { + match x { + 0x11 => Some(MisbehaviorCode::BftDoublePrepare), + 0x12 => Some(MisbehaviorCode::BftDoubleCommit), + _ => None, + } + } +} + +/// Misbehavior kinds. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub enum MisbehaviorKind { + /// BFT: double prepare. + BftDoublePrepare(u32, (<::Header as HeaderT>::Hash, Signature), (<::Header as HeaderT>::Hash, Signature)), + /// BFT: double commit. + BftDoubleCommit(u32, (<::Header as HeaderT>::Hash, Signature), (<::Header as HeaderT>::Hash, Signature)), +} + +/// A report of misbehavior by an authority. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct MisbehaviorReport { + /// The parent hash of the block where the misbehavior occurred. + pub parent_hash: <::Header as HeaderT>::Hash, + /// The parent number of the block where the misbehavior occurred. + pub parent_number: <::Header as HeaderT>::Hash, + /// The authority who misbehavior. + pub target: AuthorityId, + /// The misbehavior kind. + pub misbehavior: MisbehaviorKind, +} + +impl Slicable for MisbehaviorReport { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + self.parent_hash.using_encoded(|s| v.extend(s)); + self.parent_number.using_encoded(|s| v.extend(s)); + self.target.using_encoded(|s| v.extend(s)); + + match self.misbehavior { + MisbehaviorKind::BftDoublePrepare(ref round, (ref h_a, ref s_a), (ref h_b, ref s_b)) => { + (MisbehaviorCode::BftDoublePrepare as i8).using_encoded(|s| v.extend(s)); + round.using_encoded(|s| v.extend(s)); + h_a.using_encoded(|s| v.extend(s)); + s_a.using_encoded(|s| v.extend(s)); + h_b.using_encoded(|s| v.extend(s)); + s_b.using_encoded(|s| v.extend(s)); + } + MisbehaviorKind::BftDoubleCommit(ref round, (ref h_a, ref s_a), (ref h_b, ref s_b)) => { + (MisbehaviorCode::BftDoubleCommit as i8).using_encoded(|s| v.extend(s)); + round.using_encoded(|s| v.extend(s)); + h_a.using_encoded(|s| v.extend(s)); + s_a.using_encoded(|s| v.extend(s)); + h_b.using_encoded(|s| v.extend(s)); + s_b.using_encoded(|s| v.extend(s)); + } + } + + v + } + + fn decode(input: &mut I) -> Option { + let parent_hash = <::Header as HeaderT>::Hash::decode(input)?; + let parent_number = <::Header as HeaderT>::Hash::decode(input)?; + let target = AuthorityId::decode(input)?; + + let misbehavior = match i8::decode(input).and_then(MisbehaviorCode::from_i8)? { + MisbehaviorCode::BftDoublePrepare => { + MisbehaviorKind::BftDoublePrepare( + u32::decode(input)?, + (<::Header as HeaderT>::Hash::decode(input)?, Signature::decode(input)?), + (<::Header as HeaderT>::Hash::decode(input)?, Signature::decode(input)?), + ) + } + MisbehaviorCode::BftDoubleCommit => { + MisbehaviorKind::BftDoubleCommit( + u32::decode(input)?, + (<::Header as HeaderT>::Hash::decode(input)?, Signature::decode(input)?), + (<::Header as HeaderT>::Hash::decode(input)?, Signature::decode(input)?), + ) + } + }; + + Some(MisbehaviorReport { + parent_hash, + parent_number, + target, + misbehavior, + }) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn misbehavior_report_roundtrip() { + let report = MisbehaviorReport:: { + parent_hash: [0; 32].into(), + parent_number: 999, + target: [1; 32].into(), + misbehavior: MisbehaviorKind::BftDoubleCommit( + 511, + ([2; 32].into(), [3; 64].into()), + ([4; 32].into(), [5; 64].into()), + ), + }; + + let encoded = report.encode(); + assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); + + let report = MisbehaviorReport:: { + parent_hash: [0; 32].into(), + parent_number: 999, + target: [1; 32].into(), + misbehavior: MisbehaviorKind::BftDoublePrepare( + 511, + ([2; 32].into(), [3; 64].into()), + ([4; 32].into(), [5; 64].into()), + ), + }; + + let encoded = report.encode(); + assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); + } +} diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index 327cfc0ad0d47..df2f3f9e1b6a2 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -22,6 +22,7 @@ pub mod generic; extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as runtime_primitives; extern crate ed25519; extern crate tokio_timer; extern crate parking_lot; diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 9b2982cdce652..75bef1c5da7b3 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -417,13 +417,12 @@ impl bft::BlockImport for Client } } -impl bft::Authorities for Client - where - B: backend::Backend, - E: state_machine::CodeExecutor, - Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, - error::Error: From<::Error> +impl bft::Authorities for Client where + B: backend::Backend, + E: state_machine::CodeExecutor, + Block: BlockT, + Hashing: HashingT::Header as HeaderT>::Hash>, + error::Error: From<::Error>, { fn authorities(&self, at: &BlockId) -> Result, bft::Error> { self.authorities_at(at).map_err(|_| bft::ErrorKind::StateUnavailable(*at).into()) diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 7f2342d3d77f0..359db5b039454 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -272,8 +272,8 @@ impl traits::Digest for Digest where #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Header where - Number: Member + MaybeDisplay + SimpleArithmetic, - Hash: Default + Member + MaybeDisplay + SimpleBitOps, + Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, + Hash: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, DigestItem: Member + Default, { /// The parent hash. @@ -289,8 +289,8 @@ pub struct Header where } impl Slicable for Header where - Number: Member + Slicable + MaybeDisplay + SimpleArithmetic, - Hash: Default + Member + Slicable + MaybeDisplay + SimpleBitOps, + Number: Member + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, + Hash: Default + Member + Slicable + MaybeDisplay + SimpleBitOps + Slicable, DigestItem: Member + Default + Slicable, { fn decode(input: &mut I) -> Option { @@ -314,8 +314,8 @@ impl Slicable for Header whe } } impl traits::Header for Header where - Number: Member + Slicable + MaybeDisplay + SimpleArithmetic, - Hash: Default + Member + Slicable + MaybeDisplay + SimpleBitOps, + Number: Member + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, + Hash: Default + Member + Slicable + MaybeDisplay + SimpleBitOps + Slicable, DigestItem: Member + Default + Slicable, { type Number = Number; @@ -365,8 +365,8 @@ impl fmt::Display for BlockId { #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Block where - Number: Member + MaybeDisplay + SimpleArithmetic, - Hash: Default + Member + MaybeDisplay + SimpleBitOps, + Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, + Hash: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, DigestItem: Member + Default, AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, @@ -382,8 +382,8 @@ pub struct Block wh impl Slicable for Block where - Number: Member + MaybeDisplay + SimpleArithmetic, - Hash: Default + Member + MaybeDisplay + SimpleBitOps, + Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, + Hash: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, DigestItem: Member + Default, AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, @@ -409,8 +409,8 @@ where impl traits::Block for Block where - Number: Member + MaybeDisplay + SimpleArithmetic, - Hash: Default + Member + MaybeDisplay + SimpleBitOps, + Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, + Hash: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, DigestItem: Member + Default, AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 66aae6fd41a6c..2d645adef020b 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -305,8 +305,8 @@ impl Digest for substrate_primitives::Digest { /// /// You can also create a `new` one from those fields. pub trait Header: Sized + Send + Sync + Slicable + MaybeSerializeDebug { - type Number: Member + MaybeDisplay + SimpleArithmetic; - type Hash: Member + MaybeDisplay + Default + SimpleBitOps; + type Number: Member + MaybeDisplay + SimpleArithmetic + Slicable; + type Hash: Member + MaybeDisplay + Default + SimpleBitOps + Slicable; type Digest: Member + Default; fn number(&self) -> &Self::Number; fn extrinsics_root(&self) -> &Self::Hash; From 967e478bf6c15640d86be9f393c6bdc14b2fcae0 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 24 May 2018 18:26:33 +0100 Subject: [PATCH 10/60] Switch out MisBehaviorReport for generic version. --- substrate/bft/src/generic/mod.rs | 4 ++- substrate/bft/src/generic/primitives.rs | 34 ++++++++++++------------- substrate/runtime/consensus/src/lib.rs | 7 +++-- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/substrate/bft/src/generic/mod.rs b/substrate/bft/src/generic/mod.rs index a9d7eb50dcb12..5f918c46c8791 100644 --- a/substrate/bft/src/generic/mod.rs +++ b/substrate/bft/src/generic/mod.rs @@ -29,7 +29,9 @@ use self::accumulator::State; pub use self::accumulator::{Accumulator, Justification, PrepareJustification, UncheckedJustification, Misbehavior}; mod accumulator; -pub mod primitives; +mod primitives; + +pub use primitives::MisbehaviorReport; #[cfg(test)] mod tests; diff --git a/substrate/bft/src/generic/primitives.rs b/substrate/bft/src/generic/primitives.rs index 4f7124e07de89..a8908590665c0 100644 --- a/substrate/bft/src/generic/primitives.rs +++ b/substrate/bft/src/generic/primitives.rs @@ -136,16 +136,16 @@ impl Slicable for Message { /// Justification of a block. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct Justification { +pub struct Justification { /// The round consensus was reached in. pub round_number: u32, /// The hash of the header justified. - pub hash: <::Header as HeaderT>::Hash, + pub hash:
::Hash, /// The signatures and signers of the hash. pub signatures: Vec<(AuthorityId, Signature)> } -impl Slicable for Justification { +impl Slicable for Justification
{ fn encode(&self) -> Vec { let mut v = Vec::new(); @@ -187,28 +187,28 @@ impl MisbehaviorCode { /// Misbehavior kinds. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub enum MisbehaviorKind { +pub enum MisbehaviorKind { /// BFT: double prepare. - BftDoublePrepare(u32, (<::Header as HeaderT>::Hash, Signature), (<::Header as HeaderT>::Hash, Signature)), + BftDoublePrepare(u32, (
::Hash, Signature), (
::Hash, Signature)), /// BFT: double commit. - BftDoubleCommit(u32, (<::Header as HeaderT>::Hash, Signature), (<::Header as HeaderT>::Hash, Signature)), + BftDoubleCommit(u32, (
::Hash, Signature), (
::Hash, Signature)), } /// A report of misbehavior by an authority. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct MisbehaviorReport { +pub struct MisbehaviorReport { /// The parent hash of the block where the misbehavior occurred. - pub parent_hash: <::Header as HeaderT>::Hash, + pub parent_hash:
::Hash, /// The parent number of the block where the misbehavior occurred. - pub parent_number: <::Header as HeaderT>::Hash, + pub parent_number:
::Hash, /// The authority who misbehavior. pub target: AuthorityId, /// The misbehavior kind. - pub misbehavior: MisbehaviorKind, + pub misbehavior: MisbehaviorKind
, } -impl Slicable for MisbehaviorReport { +impl Slicable for MisbehaviorReport
{ fn encode(&self) -> Vec { let mut v = Vec::new(); self.parent_hash.using_encoded(|s| v.extend(s)); @@ -238,23 +238,23 @@ impl Slicable for MisbehaviorReport { } fn decode(input: &mut I) -> Option { - let parent_hash = <::Header as HeaderT>::Hash::decode(input)?; - let parent_number = <::Header as HeaderT>::Hash::decode(input)?; + let parent_hash =
::Hash::decode(input)?; + let parent_number =
::Hash::decode(input)?; let target = AuthorityId::decode(input)?; let misbehavior = match i8::decode(input).and_then(MisbehaviorCode::from_i8)? { MisbehaviorCode::BftDoublePrepare => { MisbehaviorKind::BftDoublePrepare( u32::decode(input)?, - (<::Header as HeaderT>::Hash::decode(input)?, Signature::decode(input)?), - (<::Header as HeaderT>::Hash::decode(input)?, Signature::decode(input)?), + (
::Hash::decode(input)?, Signature::decode(input)?), + (
::Hash::decode(input)?, Signature::decode(input)?), ) } MisbehaviorCode::BftDoubleCommit => { MisbehaviorKind::BftDoubleCommit( u32::decode(input)?, - (<::Header as HeaderT>::Hash::decode(input)?, Signature::decode(input)?), - (<::Header as HeaderT>::Hash::decode(input)?, Signature::decode(input)?), + (
::Hash::decode(input)?, Signature::decode(input)?), + (
::Hash::decode(input)?, Signature::decode(input)?), ) } }; diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 40c879e811a8e..5f60eb8853b94 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -35,8 +35,7 @@ use rstd::prelude::*; use runtime_support::{storage, Parameter}; use runtime_support::storage::unhashed::StorageVec; use primitives::traits::RefInto; -use substrate_primitives::bft::MisbehaviorReport; - +use substrate_bft::generic::MisbehaviorReport; pub const AUTHORITY_AT: &'static[u8] = b":auth:"; pub const AUTHORITY_COUNT: &'static[u8] = b":auth:len"; @@ -59,7 +58,7 @@ pub trait Trait: system::Trait { decl_module! { pub struct Module; pub enum Call where aux: T::PublicAux { - fn report_misbehavior(aux, report: MisbehaviorReport) = 0; + fn report_misbehavior(aux, report: MisbehaviorReport) = 0; } pub enum PrivCall { fn set_code(new: Vec) = 0; @@ -86,7 +85,7 @@ impl Module { } /// Report some misbehaviour. - fn report_misbehavior(_aux: &T::PublicAux, _report: MisbehaviorReport) { + fn report_misbehavior(_aux: &T::PublicAux, _report: MisbehaviorReport) { // TODO. } From 0e1aa2e45cba40a4899c3afe7dacd35b6b5f8e53 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 25 May 2018 10:05:52 +0100 Subject: [PATCH 11/60] Merge Hashing into Header. --- substrate/bft/src/generic/mod.rs | 2 +- substrate/client/src/block_builder.rs | 15 ++---- substrate/client/src/client.rs | 34 +++++-------- substrate/client/src/genesis.rs | 8 ++- substrate/client/src/in_mem.rs | 14 ++---- substrate/runtime/primitives/src/generic.rs | 54 ++++++++++++--------- substrate/runtime/primitives/src/testing.rs | 3 +- substrate/runtime/primitives/src/traits.rs | 13 ++++- 8 files changed, 71 insertions(+), 72 deletions(-) diff --git a/substrate/bft/src/generic/mod.rs b/substrate/bft/src/generic/mod.rs index 5f918c46c8791..a39c9de5187d1 100644 --- a/substrate/bft/src/generic/mod.rs +++ b/substrate/bft/src/generic/mod.rs @@ -31,7 +31,7 @@ pub use self::accumulator::{Accumulator, Justification, PrepareJustification, Un mod accumulator; mod primitives; -pub use primitives::MisbehaviorReport; +pub use self::primitives::MisbehaviorReport; #[cfg(test)] mod tests; diff --git a/substrate/client/src/block_builder.rs b/substrate/client/src/block_builder.rs index bef3425480148..76cec8ea98913 100644 --- a/substrate/client/src/block_builder.rs +++ b/substrate/client/src/block_builder.rs @@ -17,7 +17,6 @@ //! Utility struct to build a block. use std::vec::Vec; -use std::marker::PhantomData; use codec::{Joiner, Slicable}; use state_machine::{self, CodeExecutor}; use runtime_primitives::traits::{Header as HeaderT, Hashing as HashingT, Block as BlockT}; @@ -25,11 +24,10 @@ use runtime_primitives::generic::BlockId; use {backend, error, Client}; /// Utility for building new (valid) blocks from a stream of extrinsics. -pub struct BlockBuilder where +pub struct BlockBuilder where B: backend::Backend, E: CodeExecutor + Clone, Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { header: ::Header, @@ -37,24 +35,22 @@ pub struct BlockBuilder where executor: E, state: B::State, changes: state_machine::OverlayedChanges, - dummy: PhantomData, } -impl BlockBuilder where +impl BlockBuilder where B: backend::Backend, E: CodeExecutor + Clone, Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { /// Create a new instance of builder from the given client, building on the latest block. - pub fn new(client: &Client) -> error::Result { + pub fn new(client: &Client) -> error::Result { client.info().and_then(|i| Self::at_block(&BlockId::::Hash(i.chain.best_hash), client)) } /// Create a new instance of builder from the given client using a particular block's ID to /// build upon. - pub fn at_block(block_id: &BlockId, client: &Client) -> error::Result { + pub fn at_block(block_id: &BlockId, client: &Client) -> error::Result { Ok(BlockBuilder { header: <::Header as HeaderT>::new( client.block_number_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(Box::new(block_id.clone())))? + 1, @@ -67,7 +63,6 @@ impl BlockBuilder where executor: client.clone_executor(), state: client.state_at(block_id)?, changes: Default::default(), - dummy: Default::default(), }) } @@ -84,7 +79,7 @@ impl BlockBuilder where /// Consume the builder to return a valid `Block` containing all pushed extrinsics. pub fn bake(mut self) -> error::Result { - self.header.extrinsics_root = Hashing::ordered_trie_root(self.extrinsics.iter().map(Slicable::encode)); + self.header.extrinsics_root = <<::Header as HeaderT>::Hashing as HashingT>::ordered_trie_root(self.extrinsics.iter().map(Slicable::encode)); let (output, _) = state_machine::execute(&self.state, &mut self.changes, &self.executor, "finalise_block", &self.header.encode())?; self.header = <::Header as Slicable>::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 75bef1c5da7b3..3fadb596e36fc 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -19,7 +19,6 @@ use futures::sync::mpsc; use parking_lot::Mutex; use std::hash; -use std::marker::PhantomData; use primitives::{self, AuthorityId}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing as HashingT, Zero}; @@ -32,14 +31,12 @@ use blockchain::{self, Info as ChainInfo, Backend as ChainBackend}; use {error, in_mem, block_builder, runtime_io, bft}; /// Polkadot Client -pub struct Client where +pub struct Client where Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, { backend: B, executor: E, import_notification_sinks: Mutex>>>, - dummy: PhantomData, } /// A source of blockchain evenets. @@ -147,25 +144,23 @@ impl JustifiedHeader { } /// Create an instance of in-memory client. -pub fn new_in_mem( +pub fn new_in_mem( executor: E, build_genesis: F -) -> error::Result, E, Block, Hashing>> +) -> error::Result, E, Block>> where E: CodeExecutor, F: FnOnce() -> (::Header, Vec<(Vec, Vec)>), Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, <::Header as HeaderT>::Hash: hash::Hash, { Client::new(in_mem::Backend::new(), executor, build_genesis) } -impl Client where +impl Client where B: backend::Backend, E: CodeExecutor, Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<<>::State as StateBackend>::Error>, <::Header as HeaderT>::Hash: hash::Hash, { @@ -190,7 +185,6 @@ impl Client where backend, executor, import_notification_sinks: Mutex::new(Vec::new()), - dummy: Default::default(), }) } @@ -267,12 +261,12 @@ impl Client where } /// Create a new block, built on the head of the chain. - pub fn new_block(&self) -> error::Result> where E: Clone { + pub fn new_block(&self) -> error::Result> where E: Clone { block_builder::BlockBuilder::new(self) } /// Create a new block, built on top of `parent`. - pub fn new_block_at(&self, parent: &BlockId) -> error::Result> where E: Clone { + pub fn new_block_at(&self, parent: &BlockId) -> error::Result> where E: Clone { block_builder::BlockBuilder::at_block(parent, &self) } @@ -284,7 +278,7 @@ impl Client where ) -> error::Result> { let authorities = self.authorities_at(&BlockId::Hash(header.parent_hash))?; let just = bft::check_justification(&authorities[..], header.parent_hash, justification) - .map_err(|_| error::ErrorKind::BadJustification(Box::new(BlockId::Hash(Hashing::hash_of(header)))))?; + .map_err(|_| error::ErrorKind::BadJustification(Box::new(BlockId::Hash(<<::Header as HeaderT>::Hashing as HashingT>::hash_of(header)))))?; Ok(JustifiedHeader { header, justification: just, @@ -318,7 +312,7 @@ impl Client where )?; let is_new_best = header.number == self.backend.blockchain().info()?.best_number + 1; - let hash = Hashing::hash_of(header); + let hash = <<::Header as HeaderT>::Hashing as HashingT>::hash_of(header); trace!("Imported {}, (#{}), best={}, origin={:?}", hash, header.number, is_new_best, origin); transaction.set_block_data(header.clone(), body, Some(justification.uncheck().into()), is_new_best)?; transaction.update_storage(storage_update)?; @@ -399,12 +393,11 @@ impl Client where } } -impl bft::BlockImport for Client +impl bft::BlockImport for Client where B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<::Error> { fn import_block(&self, block: Block, justification: bft::Justification) { @@ -417,11 +410,10 @@ impl bft::BlockImport for Client } } -impl bft::Authorities for Client where +impl bft::Authorities for Client where B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<::Error>, { fn authorities(&self, at: &BlockId) -> Result, bft::Error> { @@ -429,12 +421,11 @@ impl bft::Authorities for Client whe } } -impl BlockchainEvents for Client +impl BlockchainEvents for Client where B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<::Error> { /// Get block import event stream. @@ -445,12 +436,11 @@ impl BlockchainEvents for Client ChainHead for Client +impl ChainHead for Client where B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, error::Error: From<::Error> { fn best_block_header(&self) -> error::Result<::Header> { diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index 98e776026945c..d62fb216c18de 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -21,14 +21,12 @@ use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing as /// Create a genesis block, given the initial storage. pub fn construct_genesis_block< - Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, + Block: BlockT > ( storage: &HashMap, Vec> ) -> Block { - // TODO gav don't use `trie_root`! - let state_root = Hashing::trie_root(storage.clone().into_iter()); - let extrinsics_root = Hashing::trie_root(vec![].into_iter()); + let state_root = <<::Header as HeaderT>::Hashing as HashingT>::trie_root(storage.clone().into_iter()); + let extrinsics_root = <<::Header as HeaderT>::Hashing as HashingT>::trie_root(vec![].into_iter()); Block::new( <::Header as HeaderT>::new( Zero::zero(), diff --git a/substrate/client/src/in_mem.rs b/substrate/client/src/in_mem.rs index f434959da821d..abadff9c89774 100644 --- a/substrate/client/src/in_mem.rs +++ b/substrate/client/src/in_mem.rs @@ -195,23 +195,20 @@ impl backend::BlockImportOperation for BlockImportOperatio } /// In-memory backend. Keeps all states and blocks in memory. Useful for testing. -pub struct Backend where +pub struct Backend where Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, <::Header as HeaderT>::Hash: hash::Hash, { states: RwLock::Header as HeaderT>::Hash, InMemory>>, blockchain: Blockchain, - dummy: PhantomData, } -impl Backend where +impl Backend where Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, <::Header as HeaderT>::Hash: hash::Hash, { /// Create a new instance of in-mem backend. - pub fn new() -> Backend { + pub fn new() -> Backend { Backend { states: RwLock::new(HashMap::new()), blockchain: Blockchain::new(), @@ -220,9 +217,8 @@ impl Backend where } } -impl backend::Backend for Backend where +impl backend::Backend for Backend where Block: BlockT, - Hashing: HashingT::Header as HeaderT>::Hash>, <::Header as HeaderT>::Hash: hash::Hash, { type BlockImportOperation = BlockImportOperation; @@ -244,7 +240,7 @@ impl backend::Backend for Backend where fn commit_operation(&self, operation: Self::BlockImportOperation) -> error::Result<()> { if let Some(pending_block) = operation.pending_block { - let hash = Hashing::hash_of(&pending_block.block.header); + let hash = <<::Header as HeaderT>::Hashing as HashingT>::hash_of(&pending_block.block.header); let old_state = &operation.old_state; self.states.write().insert(hash, operation.new_state.unwrap_or_else(|| old_state.clone())); self.blockchain.insert(hash, pending_block.block.header, pending_block.block.justification, pending_block.block.body, pending_block.is_best); diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 359db5b039454..e024b3e53e6d4 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -20,7 +20,8 @@ use rstd::prelude::*; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; -use traits::{self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, Block as BlockT, Header as HeaderT}; +use traits::{self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, Block as BlockT, + Header as HeaderT, Hashing as HashingT}; use rstd::ops; /// A vetted and verified extrinsic from the external world. @@ -271,27 +272,29 @@ impl traits::Digest for Digest where #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header where +pub struct Header where Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, - Hash: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, + Hashing: HashingT, DigestItem: Member + Default, + ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, { /// The parent hash. - pub parent_hash: Hash, + pub parent_hash: ::Output, /// The block number. pub number: Number, /// The state trie merkle root - pub state_root: Hash, + pub state_root: ::Output, /// The merkle root of the extrinsics. - pub extrinsics_root: Hash, + pub extrinsics_root: ::Output, /// A chain-specific digest of data useful for light clients or referencing auxiliary data. pub digest: Digest, } -impl Slicable for Header where +impl Slicable for Header where Number: Member + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, - Hash: Default + Member + Slicable + MaybeDisplay + SimpleBitOps + Slicable, + Hashing: HashingT, DigestItem: Member + Default + Slicable, + ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, { fn decode(input: &mut I) -> Option { Some(Header { @@ -313,13 +316,15 @@ impl Slicable for Header whe v } } -impl traits::Header for Header where +impl traits::Header for Header where Number: Member + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, - Hash: Default + Member + Slicable + MaybeDisplay + SimpleBitOps + Slicable, + Hashing: HashingT, DigestItem: Member + Default + Slicable, + ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, { type Number = Number; - type Hash = Hash; + type Hash = ::Output; + type Hashing = Hashing; type Digest = Digest; fn number(&self) -> &Self::Number { &self.number } @@ -364,32 +369,34 @@ impl fmt::Display for BlockId { #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Block where +pub struct Block where Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, - Hash: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, + Hashing: HashingT, DigestItem: Member + Default, + ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member { /// The block header. - pub header: Header, + pub header: Header, /// The accompanying extrinsics. pub extrinsics: Vec>, } -impl Slicable - for Block +impl Slicable + for Block where Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, - Hash: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, + Hashing: HashingT, DigestItem: Member + Default, + ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member, - Header: Slicable, + Header: Slicable, UncheckedExtrinsic: Slicable, { fn decode(input: &mut I) -> Option { @@ -406,21 +413,22 @@ where } } -impl traits::Block - for Block +impl traits::Block + for Block where Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, - Hash: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, + Hashing: HashingT, DigestItem: Member + Default, + ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member, - Header: traits::Header, + Header: traits::Header, UncheckedExtrinsic: Slicable, { type Extrinsic = UncheckedExtrinsic; - type Header = Header; + type Header = Header; fn header(&self) -> &Self::Header { &self.header } diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index bd5f798a5a05a..fa383d6950581 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -21,7 +21,7 @@ use std::fmt::Debug; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; use substrate_primitives::H256; -use traits::{self, Checkable, Applyable}; +use traits::{self, Checkable, Applyable, BlakeTwo256}; #[derive(Default, PartialEq, Eq, Clone, Serialize, Debug)] pub struct Digest { @@ -75,6 +75,7 @@ impl Slicable for Header { } impl traits::Header for Header { type Number = u64; + type Hashing = BlakeTwo256; type Hash = H256; type Digest = Digest; fn number(&self) -> &Self::Number { &self.number } diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 2d645adef020b..efadf35d3457a 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -174,7 +174,8 @@ impl Executable for (A, B) { } /// Abstraction around hashing -pub trait Hashing { +pub trait Hashing: MaybeSerializeDebug { // Stupid bug in the Rust compiler believes derived + // traits must be fulfilled by all type parameters. /// The hash type produced. type Output; @@ -207,6 +208,8 @@ pub trait Hashing { } /// Blake2-256 Hashing implementation. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] pub struct BlakeTwo256; impl Hashing for BlakeTwo256 { @@ -307,6 +310,7 @@ impl Digest for substrate_primitives::Digest { pub trait Header: Sized + Send + Sync + Slicable + MaybeSerializeDebug { type Number: Member + MaybeDisplay + SimpleArithmetic + Slicable; type Hash: Member + MaybeDisplay + Default + SimpleBitOps + Slicable; + type Hashing: Hashing; type Digest: Member + Default; fn number(&self) -> &Self::Number; fn extrinsics_root(&self) -> &Self::Hash; @@ -320,11 +324,15 @@ pub trait Header: Sized + Send + Sync + Slicable + MaybeSerializeDebug { parent_hash: Self::Hash, digest: Self::Digest ) -> Self; + fn hash(&self) -> Self::Hash { + ::hash_of(self) + } } impl Header for substrate_primitives::Header { type Number = substrate_primitives::block::Number; type Hash = substrate_primitives::block::HeaderHash; + type Hashing = BlakeTwo256; type Digest = substrate_primitives::block::Digest; fn number(&self) -> &Self::Number { &self.number } fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } @@ -359,6 +367,9 @@ pub trait Block: Sized + Send + Sync + Slicable + MaybeSerializeDebug { fn extrinsics(&self) -> &[Self::Extrinsic]; fn deconstruct(self) -> (Self::Header, Vec); fn new(header: Self::Header, extrinsics: Vec) -> Self; + fn hash(&self) -> ::Hash { + <::Hashing as Hashing>::hash_of(self) + } } impl Block for substrate_primitives::Block { From e508b8e4c970e83239857e5c1f5a71a27f034f64 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 25 May 2018 10:11:27 +0100 Subject: [PATCH 12/60] Update runtime for new generics (with Hashing). --- polkadot/runtime/src/lib.rs | 9 +++++---- substrate/runtime/system/src/lib.rs | 7 ++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index f933085d51052..4a470557a65bd 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -57,6 +57,9 @@ use runtime_primitives::generic; use runtime_primitives::traits::{Identity, HasPublicAux}; #[cfg(feature = "std")] pub use runtime_primitives::BuildExternalities; +/// Block header type as expected by this runtime. +pub type Header = generic::Header; + /// Concrete runtime type used to parameterize the various modules. pub struct Concrete; @@ -71,7 +74,7 @@ impl system::Trait for Concrete { type Hashing = BlakeTwo256; type Digest = generic::Digest; type AccountId = AccountId; - type Header = generic::Header; + type Header = Header; } /// System module for this concrete runtime. pub type System = system::Module; @@ -140,10 +143,8 @@ impl_outer_dispatch! { } } -/// Block header type as expected by this runtime. -pub type Header = generic::Header; /// Block type as expected by this runtime. -pub type Block = generic::Block; +pub type Block = generic::Block; /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type as expected by this runtime. diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 864a007726238..fe45b2a9474c5 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -65,7 +65,12 @@ pub trait Trait { type Hashing: Hashing; type Digest: Parameter + Default + traits::Digest; type AccountId: Parameter + Ord + Default; - type Header: traits::Header; + type Header: traits::Header< + Number = Self::BlockNumber, + Hashing = Self::Hashing, + Hash = Self::Hash, + Digest = Self::Digest + >; } decl_module! { From 3ad0410f38528bf2650adcb1673c6b5d0328583f Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 25 May 2018 10:12:33 +0100 Subject: [PATCH 13/60] Update demo runtime. --- demo/runtime/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 1f7248f68e4df..002b0f73c1088 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -61,7 +61,7 @@ impl system::Trait for Concrete { type Hashing = BlakeTwo256; type Digest = generic::Digest>; type AccountId = AccountId; - type Header = generic::Header>; + type Header = generic::Header>; } /// System module for this concrete runtime. @@ -133,9 +133,9 @@ impl_outer_dispatch! { } /// Block header type as expected by this runtime. -pub type Header = generic::Header>; +pub type Header = generic::Header>; /// Block type as expected by this runtime. -pub type Block = generic::Block, AccountId, Index, Call, Signature>; +pub type Block = generic::Block, AccountId, Index, Call, Signature>; /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type as expected by this runtime. From d2b8a3549c1cc2cbff42c671de0d526d321ef978 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 25 May 2018 11:47:23 +0100 Subject: [PATCH 14/60] Make runtime compile. --- Cargo.lock | 76 ++-- demo/runtime/wasm/Cargo.lock | 354 ++++-------------- substrate/bft/src/generic/mod.rs | 3 - substrate/runtime/consensus/src/lib.rs | 2 +- substrate/runtime/council/src/voting.rs | 3 +- substrate/runtime/executive/src/lib.rs | 4 +- .../primitives/src/bft.rs} | 15 +- substrate/runtime/primitives/src/lib.rs | 1 + substrate/runtime/primitives/src/traits.rs | 4 +- substrate/runtime/staking/src/lib.rs | 5 +- substrate/runtime/system/src/lib.rs | 16 +- substrate/state-machine/Cargo.toml | 2 +- 12 files changed, 130 insertions(+), 355 deletions(-) rename substrate/{bft/src/generic/primitives.rs => runtime/primitives/src/bft.rs} (96%) diff --git a/Cargo.lock b/Cargo.lock index 22271e0bccb0a..3155d9fa54aef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -364,7 +364,7 @@ dependencies = [ "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "fixed-hash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -376,30 +376,30 @@ dependencies = [ "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ethcore-bytes" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" [[package]] name = "ethcore-crypto" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ethcore-io" version = "1.12.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -415,7 +415,7 @@ dependencies = [ [[package]] name = "ethcore-logger" version = "1.12.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -431,7 +431,7 @@ dependencies = [ [[package]] name = "ethcore-network" version = "1.12.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-crypto 0.1.0 (git+https://github.com/paritytech/parity.git)", @@ -446,7 +446,7 @@ dependencies = [ [[package]] name = "ethcore-network-devp2p" version = "1.12.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -460,7 +460,7 @@ dependencies = [ "ethkey 0.3.0 (git+https://github.com/paritytech/parity.git)", "igd 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)", + "keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)", "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -475,7 +475,7 @@ dependencies = [ "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "snappy 0.1.0 (git+https://github.com/paritytech/rust-snappy)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -517,7 +517,7 @@ dependencies = [ [[package]] name = "ethkey" version = "0.3.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "edit-distance 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -531,7 +531,7 @@ dependencies = [ "quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -640,7 +640,7 @@ dependencies = [ [[package]] name = "hashdb" version = "0.1.1" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -842,22 +842,21 @@ dependencies = [ [[package]] name = "keccak-hash" -version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "keccak-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" +version = "0.1.2" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -872,7 +871,7 @@ dependencies = [ [[package]] name = "kvdb" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -882,7 +881,7 @@ dependencies = [ [[package]] name = "kvdb-memorydb" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "kvdb 0.1.0 (git+https://github.com/paritytech/parity.git)", "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -891,7 +890,7 @@ dependencies = [ [[package]] name = "kvdb-rocksdb" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -963,7 +962,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "mem" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" [[package]] name = "memchr" @@ -981,13 +980,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memorydb" version = "0.1.1" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hashdb 0.1.1 (git+https://github.com/paritytech/parity.git)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)", + "keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)", "plain_hasher 0.1.0 (git+https://github.com/paritytech/parity.git)", "rlp 0.2.1 (git+https://github.com/paritytech/parity.git)", ] @@ -1141,19 +1140,19 @@ dependencies = [ [[package]] name = "path" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" [[package]] name = "patricia-trie" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-bytes 0.1.0 (git+https://github.com/paritytech/parity.git)", "ethcore-logger 1.12.0 (git+https://github.com/paritytech/parity.git)", "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hashdb 0.1.1 (git+https://github.com/paritytech/parity.git)", - "keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)", + "keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "memorydb 0.1.1 (git+https://github.com/paritytech/parity.git)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1169,7 +1168,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "plain_hasher" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1585,7 +1584,7 @@ dependencies = [ [[package]] name = "rlp" version = "0.2.1" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2346,8 +2345,11 @@ dependencies = [ [[package]] name = "tiny-keccak" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "tokio-core" @@ -2433,11 +2435,11 @@ dependencies = [ [[package]] name = "triehash" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#80528c53445ed958ad6164a49ac1cf28e8f52c56" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)", + "keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)", "rlp 0.2.1 (git+https://github.com/paritytech/parity.git)", ] @@ -2762,8 +2764,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" "checksum jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" "checksum jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" -"checksum keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" +"checksum keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)" = "" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" @@ -2861,7 +2863,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" "checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098" "checksum timer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "31d42176308937165701f50638db1c31586f183f1aab416268216577aec7306b" -"checksum tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e9241752647ca572f12c9b520a5d360d9099360c527770647e694001646a1d0" +"checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "52b4e32d8edbf29501aabb3570f027c6ceb00ccef6538f4bddba0200503e74e8" "checksum tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "514aae203178929dbf03318ad7c683126672d4d96eccb77b29603d33c9e25743" "checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index 461b9c9645875..a8bcfb756675b 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -1,25 +1,3 @@ -[[package]] -name = "aho-corasick" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ansi_term" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "arrayvec" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "odds 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "arrayvec" version = "0.4.7" @@ -28,18 +6,6 @@ dependencies = [ "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "bigint" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "bitflags" version = "1.0.1" @@ -140,57 +106,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "elastic-array" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "env_logger" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "environmental" version = "0.1.0" [[package]] -name = "ethcore-bigint" -version = "0.2.1" +name = "ethbloom" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "ethcore-bytes" -version = "0.1.0" +name = "ethereum-types" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] -name = "ethcore-logger" -version = "1.9.0" +name = "ethereum-types-serialize" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayvec 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -202,6 +159,17 @@ dependencies = [ "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fixed-hash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -221,15 +189,6 @@ name = "gcc" version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "hashdb" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "heapsize" version = "0.4.2" @@ -260,36 +219,16 @@ name = "integer-sqrt" version = "0.1.0" source = "git+https://github.com/paritytech/integer-sqrt-rs.git#f4cf61482096dc98c1273f46a10849d182b4c23c" -[[package]] -name = "isatty" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "keccak-hash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "lazy_static" version = "0.2.11" @@ -321,33 +260,11 @@ dependencies = [ "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "memchr" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "memory_units" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "memorydb" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "nodrop" version = "0.1.12" @@ -366,11 +283,6 @@ dependencies = [ "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "odds" -version = "0.2.26" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "owning_ref" version = "0.3.3" @@ -389,15 +301,6 @@ dependencies = [ "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parking_lot" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "parking_lot" version = "0.5.4" @@ -418,32 +321,6 @@ dependencies = [ "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "patricia-trie" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-logger 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "plain_hasher" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "proc-macro-hack" version = "0.4.0" @@ -514,36 +391,6 @@ dependencies = [ "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "redox_syscall" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "redox_termios" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "ring" version = "0.12.1" @@ -558,13 +405,12 @@ dependencies = [ [[package]] name = "rlp" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -760,7 +606,7 @@ dependencies = [ "substrate-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -886,12 +732,9 @@ name = "substrate-state-machine" version = "0.1.0" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "patricia-trie 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -912,35 +755,6 @@ dependencies = [ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "termion" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread_local" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "time" -version = "0.1.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tiny-keccak" version = "1.4.0" @@ -948,12 +762,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "triehash" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -975,31 +790,24 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unreachable" -version = "1.0.0" +name = "uint" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "untrusted" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "utf8-ranges" -version = "1.0.0" +name = "unicode-xid" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "void" -version = "1.0.2" +name = "untrusted" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1012,11 +820,6 @@ dependencies = [ "parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "winapi" version = "0.3.4" @@ -1026,11 +829,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -1042,11 +840,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" -"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" -"checksum arrayvec 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "06f59fe10306bb78facd90d28c2038ad23ffaaefa85bac43c8a434cde383334f" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" -"checksum bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5442186ef6560f30f1ee4b9c1e4c87a35a6879d3644550cc248ec2b955eb5fcd" "checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" @@ -1056,42 +850,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" -"checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" -"checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" -"checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" -"checksum ethcore-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3977c772cd6c5c22e1c7cfa208e4c3b746bd6c3a6c8eeec0999a6b2103015ad5" -"checksum ethcore-logger 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1fd5813e49546030be7d134e775088d56b8ff4ab60617b90e93d4f0513da4c5b" +"checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" +"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" +"checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6" +"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" "checksum fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" +"checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" -"checksum hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d97be07c358c5b461268b4ce60304024c5fa5acfd4bd8cd743639f0252003cf5" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" "checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" "checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" -"checksum isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f2a233726c7bb76995cec749d59582e5664823b7245d4970354408f1d79a7a2" -"checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" "checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" -"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "013b7e4c5e10c764936ebc6bd3662d8e3c92292d267bf6a42ef3f5cad9c793ee" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dee092fcdf725aee04dd7da1d21debff559237d49ef1cb3e69bcb8ece44c7364" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" -"checksum odds 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)" = "4eae0151b9dacf24fcc170d9995e511669a082856a91f958a2fe380bfab3fb22" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4dc02a80a0315b109e48992c46942c79bcdb8fac416dd575d330ed9ced6cbd" -"checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" "checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd" "checksum parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f35048d735bb93dd115a0030498785971aab3234d311fbe273d020084d26bd8" -"checksum patricia-trie 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1e2f638d79aba5c4a71a4f373df6e3cd702250a53b7f0ed4da1e2a7be9737ae" -"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" @@ -1099,12 +884,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" "checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" -"checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd" -"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "744554e01ccbd98fff8c457c3b092cd67af62a555a43bfe97ae8a0451f7799fa" -"checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" -"checksum rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "babe6fce20c0ca9b1582998734c4569082d0ad08e43772a1c6c40aef4f106ef9" +"checksum rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "89db7f8dfdd5eb7ab3ac3ece7a07fd273a680b4b224cb231181280e8996f9f0b" "checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" "checksum rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)" = "" "checksum rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9743a7670d88d5d52950408ecdb7c71d8986251ab604d4689dd2ca25c9bca69" @@ -1118,21 +899,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" -"checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" -"checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098" "checksum tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e9241752647ca572f12c9b520a5d360d9099360c527770647e694001646a1d0" -"checksum triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9291c7f0fae44858b5e087dd462afb382354120003778f1695b44aab98c7abd7" +"checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" +"checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" -"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" -"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" -"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26b20dbeb7caee04597a5d2c93e2b3e64872c6ea2af732d7ad49dbec44067c35" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/substrate/bft/src/generic/mod.rs b/substrate/bft/src/generic/mod.rs index a39c9de5187d1..0795cbfc62291 100644 --- a/substrate/bft/src/generic/mod.rs +++ b/substrate/bft/src/generic/mod.rs @@ -29,9 +29,6 @@ use self::accumulator::State; pub use self::accumulator::{Accumulator, Justification, PrepareJustification, UncheckedJustification, Misbehavior}; mod accumulator; -mod primitives; - -pub use self::primitives::MisbehaviorReport; #[cfg(test)] mod tests; diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 5f60eb8853b94..3cf77cb148a67 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -35,7 +35,7 @@ use rstd::prelude::*; use runtime_support::{storage, Parameter}; use runtime_support::storage::unhashed::StorageVec; use primitives::traits::RefInto; -use substrate_bft::generic::MisbehaviorReport; +use primitives::bft::MisbehaviorReport; pub const AUTHORITY_AT: &'static[u8] = b":auth:"; pub const AUTHORITY_COUNT: &'static[u8] = b":auth:len"; diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index 8c2362ed76353..bf6470cc12348 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -18,8 +18,7 @@ use rstd::prelude::*; use rstd::borrow::Borrow; -use primitives::traits::{Executable, RefInto}; -use runtime_io::Hashing; +use primitives::traits::{Executable, RefInto, Hashing}; use runtime_support::{StorageValue, StorageMap, IsSubType}; use {system, democracy}; use super::{Trait, Module as Council}; diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 35982f754b5d3..26d74b150148f 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -45,9 +45,9 @@ extern crate substrate_runtime_staking as staking; use rstd::prelude::*; use rstd::marker::PhantomData; -use runtime_io::Hashing; use runtime_support::StorageValue; -use primitives::traits::{self, Header, Zero, One, Checkable, Applyable, CheckEqual, Executable, MakePayment}; +use primitives::traits::{self, Header, Zero, One, Checkable, Applyable, CheckEqual, Executable, + MakePayment, Hashing}; use codec::Slicable; use system::extrinsics_root; diff --git a/substrate/bft/src/generic/primitives.rs b/substrate/runtime/primitives/src/bft.rs similarity index 96% rename from substrate/bft/src/generic/primitives.rs rename to substrate/runtime/primitives/src/bft.rs index a8908590665c0..3ec779738ff9d 100644 --- a/substrate/bft/src/generic/primitives.rs +++ b/substrate/runtime/primitives/src/bft.rs @@ -16,10 +16,10 @@ //! Message formats for the BFT consensus layer. -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; +use rstd::prelude::*; +use traits::{Block as BlockT, Header as HeaderT}; use codec::{Slicable, Input}; -use std::vec::Vec; -use primitives::{AuthorityId, Signature}; +use substrate_primitives::{AuthorityId, Signature}; #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] @@ -135,8 +135,9 @@ impl Slicable for Message { /// Justification of a block. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct Justification { +#[cfg_attr(feature = "std", derive(Debug, Serialize))] +pub struct Justification +{ /// The round consensus was reached in. pub round_number: u32, /// The hash of the header justified. @@ -186,7 +187,7 @@ impl MisbehaviorCode { /// Misbehavior kinds. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] pub enum MisbehaviorKind { /// BFT: double prepare. BftDoublePrepare(u32, (
::Hash, Signature), (
::Hash, Signature)), @@ -196,7 +197,7 @@ pub enum MisbehaviorKind { /// A report of misbehavior by an authority. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] pub struct MisbehaviorReport { /// The parent hash of the block where the misbehavior occurred. pub parent_hash:
::Hash, diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 3d157cc2d47b7..5f1c05cf912be 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -44,6 +44,7 @@ pub mod testing; pub mod traits; pub mod generic; +pub mod bft; #[cfg(feature = "std")] pub type BuiltExternalities = HashMap, Vec>; diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index efadf35d3457a..65e70481ed688 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -174,8 +174,8 @@ impl Executable for (A, B) { } /// Abstraction around hashing -pub trait Hashing: MaybeSerializeDebug { // Stupid bug in the Rust compiler believes derived - // traits must be fulfilled by all type parameters. +pub trait Hashing: MaybeSerializeDebug + Clone + Eq + PartialEq { // Stupid bug in the Rust compiler believes derived + // traits must be fulfilled by all type parameters. /// The hash type produced. type Output; diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 67f8eeef0b16b..a71fec5a2a335 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -46,7 +46,8 @@ use rstd::cell::RefCell; use rstd::collections::btree_map::{BTreeMap, Entry}; use codec::Slicable; use runtime_support::{StorageValue, StorageMap, Parameter}; -use primitives::traits::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable, MakePayment}; +use primitives::traits::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable, MakePayment, + Hashing}; mod contract; @@ -71,7 +72,7 @@ pub trait ContractAddressFor { } impl ContractAddressFor for Hashing where - Hashing: runtime_io::Hashing, + Hashing: Hashing, AccountId: Sized + Slicable + From, Hashing::Output: Slicable { diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index fe45b2a9474c5..bf14ab1dff942 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -34,8 +34,8 @@ extern crate substrate_runtime_primitives as primitives; extern crate safe_mix; use rstd::prelude::*; -use runtime_io::Hashing; -use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded}; +use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, + Hashing, Member, MaybeDisplay}; use runtime_support::{StorageValue, StorageMap, Parameter}; use safe_mix::TripletMix; @@ -59,13 +59,13 @@ pub fn extrinsics_data_root(xts: Vec>) -> H::Output { } pub trait Trait { - type Index: Parameter + Default + SimpleArithmetic + Copy; - type BlockNumber: Parameter + SimpleArithmetic + Default + Bounded + Copy; - type Hash: Parameter + SimpleBitOps + Default + Copy + CheckEqual; + type Index: Parameter + Member + Default + SimpleArithmetic + Copy; + type BlockNumber: Parameter + Member + MaybeDisplay + SimpleArithmetic + Default + Bounded + Copy; + type Hash: Parameter + Member + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual; type Hashing: Hashing; - type Digest: Parameter + Default + traits::Digest; - type AccountId: Parameter + Ord + Default; - type Header: traits::Header< + type Digest: Parameter + Member + Default + traits::Digest; + type AccountId: Parameter + Member + Ord + Default; + type Header: Parameter + traits::Header< Number = Self::BlockNumber, Hashing = Self::Hashing, Hash = Self::Hash, diff --git a/substrate/state-machine/Cargo.toml b/substrate/state-machine/Cargo.toml index 647b9e40ddefb..40bb922f5ba5f 100644 --- a/substrate/state-machine/Cargo.toml +++ b/substrate/state-machine/Cargo.toml @@ -6,6 +6,6 @@ description = "Substrate State Machine" [dependencies] substrate-primitives = { path = "../primitives", version = "0.1.0" } -triehash = "0.1" +triehash = "0.1.2" byteorder = "1.1" hex-literal = "0.1.0" From 5a88df4309aa13c30b106e2810da48b1ac5d59b3 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 25 May 2018 11:53:17 +0100 Subject: [PATCH 15/60] Build fixes for runtime --- demo/runtime/src/lib.rs | 9 +- .../release/demo_runtime.compact.wasm | Bin 237583 -> 236579 bytes .../release/demo_runtime.wasm | Bin 259318 -> 258367 bytes polkadot/runtime/src/lib.rs | 7 +- polkadot/runtime/src/parachains.rs | 4 +- polkadot/runtime/wasm/Cargo.lock | 354 ++++------------- .../release/runtime_test.compact.wasm | Bin 11128 -> 11122 bytes .../release/runtime_test.wasm | Bin 11796 -> 11790 bytes substrate/runtime-io/without_std.rs | 4 +- substrate/runtime/council/src/lib.rs | 4 +- substrate/runtime/democracy/src/lib.rs | 4 +- substrate/runtime/executive/src/lib.rs | 4 +- substrate/runtime/session/src/lib.rs | 4 +- substrate/runtime/staking/src/lib.rs | 8 +- substrate/runtime/timestamp/src/lib.rs | 4 +- substrate/test-runtime/wasm/Cargo.lock | 360 ++++-------------- .../substrate_test_runtime.compact.wasm | Bin 16186 -> 16187 bytes .../release/substrate_test_runtime.wasm | Bin 17932 -> 17933 bytes 18 files changed, 153 insertions(+), 613 deletions(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 002b0f73c1088..abf61850653fd 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -39,10 +39,9 @@ extern crate substrate_runtime_timestamp as timestamp; extern crate demo_primitives; use rstd::prelude::*; -use runtime_io::BlakeTwo256; use demo_primitives::{AccountId, Balance, BlockNumber, Hash, Index, SessionKey, Signature}; use runtime_primitives::generic; -use runtime_primitives::traits::{Identity, HasPublicAux}; +use runtime_primitives::traits::{Identity, HasPublicAux, BlakeTwo256}; #[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildExternalities; @@ -61,7 +60,7 @@ impl system::Trait for Concrete { type Hashing = BlakeTwo256; type Digest = generic::Digest>; type AccountId = AccountId; - type Header = generic::Header>; + type Header = generic::Header>; } /// System module for this concrete runtime. @@ -133,9 +132,9 @@ impl_outer_dispatch! { } /// Block header type as expected by this runtime. -pub type Header = generic::Header>; +pub type Header = generic::Header>; /// Block type as expected by this runtime. -pub type Block = generic::Block, AccountId, Index, Call, Signature>; +pub type Block = generic::Block, AccountId, Index, Call, Signature>; /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type as expected by this runtime. diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index e017912fbaa0711bd28d794286c41c54b4091dd8..9867a123434674abbaa9a29e5c2c064b17fc9940 100644 GIT binary patch delta 73812 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 diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index d4dcdde39a444b11446f007665711c7b0262cea7..24a2fb9a4402c8cd485ae65a4ed21936deb5c907 100755 GIT binary patch delta 77301 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 BYIgtt delta 78287 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 +pub type Header = generic::Header; /// Concrete runtime type used to parameterize the various modules. pub struct Concrete; @@ -144,7 +143,7 @@ impl_outer_dispatch! { } /// Block type as expected by this runtime. -pub type Block = generic::Block; +pub type Block = generic::Block; /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type as expected by this runtime. diff --git a/polkadot/runtime/src/parachains.rs b/polkadot/runtime/src/parachains.rs index ef46a25146e62..cd06b19c8f6d9 100644 --- a/polkadot/runtime/src/parachains.rs +++ b/polkadot/runtime/src/parachains.rs @@ -124,7 +124,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::H256; use runtime_primitives::BuildExternalities; - use runtime_primitives::traits::{HasPublicAux, Identity}; + use runtime_primitives::traits::{HasPublicAux, Identity, BlakeTwo256}; use runtime_primitives::testing::{Digest, Header}; use consensus; @@ -140,7 +140,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/polkadot/runtime/wasm/Cargo.lock b/polkadot/runtime/wasm/Cargo.lock index 6e14575403a4a..ca1b460116516 100644 --- a/polkadot/runtime/wasm/Cargo.lock +++ b/polkadot/runtime/wasm/Cargo.lock @@ -1,25 +1,3 @@ -[[package]] -name = "aho-corasick" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ansi_term" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "arrayvec" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "odds 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "arrayvec" version = "0.4.7" @@ -28,18 +6,6 @@ dependencies = [ "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "bigint" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "bitflags" version = "1.0.1" @@ -105,57 +71,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "elastic-array" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "env_logger" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "environmental" version = "0.1.0" [[package]] -name = "ethcore-bigint" -version = "0.2.1" +name = "ethbloom" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "ethcore-bytes" -version = "0.1.0" +name = "ethereum-types" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] -name = "ethcore-logger" -version = "1.9.0" +name = "ethereum-types-serialize" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayvec 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -167,6 +124,17 @@ dependencies = [ "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fixed-hash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -186,15 +154,6 @@ name = "gcc" version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "hashdb" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "heapsize" version = "0.4.2" @@ -225,36 +184,16 @@ name = "integer-sqrt" version = "0.1.0" source = "git+https://github.com/paritytech/integer-sqrt-rs.git#f4cf61482096dc98c1273f46a10849d182b4c23c" -[[package]] -name = "isatty" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "keccak-hash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "lazy_static" version = "0.2.11" @@ -286,33 +225,11 @@ dependencies = [ "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "memchr" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "memory_units" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "memorydb" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "nodrop" version = "0.1.12" @@ -331,11 +248,6 @@ dependencies = [ "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "odds" -version = "0.2.26" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "owning_ref" version = "0.3.3" @@ -354,15 +266,6 @@ dependencies = [ "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parking_lot" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "parking_lot" version = "0.5.4" @@ -383,32 +286,6 @@ dependencies = [ "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "patricia-trie" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-logger 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "plain_hasher" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "polkadot-primitives" version = "0.1.0" @@ -514,36 +391,6 @@ dependencies = [ "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "redox_syscall" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "redox_termios" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "ring" version = "0.12.1" @@ -558,13 +405,12 @@ dependencies = [ [[package]] name = "rlp" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -760,7 +606,7 @@ dependencies = [ "substrate-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -886,12 +732,9 @@ name = "substrate-state-machine" version = "0.1.0" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "patricia-trie 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -912,35 +755,6 @@ dependencies = [ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "termion" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread_local" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "time" -version = "0.1.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tiny-keccak" version = "1.4.0" @@ -948,12 +762,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "triehash" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -975,31 +790,24 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unreachable" -version = "1.0.0" +name = "uint" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "untrusted" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "utf8-ranges" -version = "1.0.0" +name = "unicode-xid" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "void" -version = "1.0.2" +name = "untrusted" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1012,11 +820,6 @@ dependencies = [ "parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "winapi" version = "0.3.4" @@ -1026,11 +829,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -1042,11 +840,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" -"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" -"checksum arrayvec 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "06f59fe10306bb78facd90d28c2038ad23ffaaefa85bac43c8a434cde383334f" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" -"checksum bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5442186ef6560f30f1ee4b9c1e4c87a35a6879d3644550cc248ec2b955eb5fcd" "checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" @@ -1056,42 +850,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" -"checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" -"checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" -"checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" -"checksum ethcore-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3977c772cd6c5c22e1c7cfa208e4c3b746bd6c3a6c8eeec0999a6b2103015ad5" -"checksum ethcore-logger 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1fd5813e49546030be7d134e775088d56b8ff4ab60617b90e93d4f0513da4c5b" +"checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" +"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" +"checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6" +"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" "checksum fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" +"checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" -"checksum hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d97be07c358c5b461268b4ce60304024c5fa5acfd4bd8cd743639f0252003cf5" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" "checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" "checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" -"checksum isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f2a233726c7bb76995cec749d59582e5664823b7245d4970354408f1d79a7a2" -"checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" "checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" -"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "013b7e4c5e10c764936ebc6bd3662d8e3c92292d267bf6a42ef3f5cad9c793ee" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dee092fcdf725aee04dd7da1d21debff559237d49ef1cb3e69bcb8ece44c7364" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" -"checksum odds 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)" = "4eae0151b9dacf24fcc170d9995e511669a082856a91f958a2fe380bfab3fb22" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4dc02a80a0315b109e48992c46942c79bcdb8fac416dd575d330ed9ced6cbd" -"checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" "checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd" "checksum parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f35048d735bb93dd115a0030498785971aab3234d311fbe273d020084d26bd8" -"checksum patricia-trie 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1e2f638d79aba5c4a71a4f373df6e3cd702250a53b7f0ed4da1e2a7be9737ae" -"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" @@ -1099,12 +884,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" "checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" -"checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd" -"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "744554e01ccbd98fff8c457c3b092cd67af62a555a43bfe97ae8a0451f7799fa" -"checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" -"checksum rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "babe6fce20c0ca9b1582998734c4569082d0ad08e43772a1c6c40aef4f106ef9" +"checksum rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "89db7f8dfdd5eb7ab3ac3ece7a07fd273a680b4b224cb231181280e8996f9f0b" "checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" "checksum rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)" = "" "checksum rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9743a7670d88d5d52950408ecdb7c71d8986251ab604d4689dd2ca25c9bca69" @@ -1118,21 +899,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" -"checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" -"checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098" "checksum tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e9241752647ca572f12c9b520a5d360d9099360c527770647e694001646a1d0" -"checksum triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9291c7f0fae44858b5e087dd462afb382354120003778f1695b44aab98c7abd7" +"checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" +"checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" -"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" -"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" -"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26b20dbeb7caee04597a5d2c93e2b3e64872c6ea2af732d7ad49dbec44067c35" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index 056404f6f4e8693c3fe9a679cb11abf3c91520e0..419bf1b2cb8036f0bbac2698a687f3fde12b8421 100644 GIT binary patch delta 1180 zcmZuuPiS049G-c*$?j&Yo!umjY0`8zNjJNRP3F&=_hwR%KL3Okh3diTK{PY--ivLM z6ne-(TH{6OK`3+t3&oQjyhT~?*!JSB)F=cBdT9?Ls3mx*B2|A$<3aHB&G-Gj-*3L( z%0rOOXr#Q1Z+(fFwHaS@h(uUy^s zFE!W7OJ;5Ex$_q?ztw!jPmF)IzTH>7hGh|<8bW9supjWp0HGehuYeB#Zk8YO4v0Ix ztA)pW0qSkwtAHl}%NU^w;9tOJ0RQ!$0(}tpJoNVgKEH=e1P?s+KZQxqUI@2aiLrURN8*{^k_RLa6D$`CH8A-{7 z^Iw8FHdz?5kU>it=9Ui6@8%wv>LXn7JeJy+JQrDJLocUJ)KV#8rI@!=JcCpruNhTBv)#2V1v%GxXHH!I#ENfoz&$P3dETpO8nzCH0 zSkwH4+2!T6m08AO9Y%seW*#w31%-FM-5#l@F5?suNXFAN4&#ZV{!aUV-`^<_YlSh; zD051+5}|K(S|qcaJMe0g*&Ke%ztL%sDAQczoTqtYg^jKMup?yJ?T+7Q5H;&wEqXN@yIE`atyFZtywEc^mN6-i>h( z-2#_t`3d07`EVbIwz?C&I}jfFV4_&)*$+wx+2(;apWP}}K?JI>6n#^SO2~_TEJi&( z@FD7n?i8b5;@V_zEDEPvh4y@s3gTSx5pUAJ}crspdEJRI!1 z-5=%9q*LWm^n;bd2`t;|!;AmZ@7TU0^RV1Kd*u5({Jk5Dy$s8%;JmYM z*mL#$WyLb1m^0^boQ6^k-M6n8ZUhf#N@yC=jGKf1HlP%%K!+rilqc8()UMR0D{cxb z14821(2SAz@Pm3Tv!IFb#P|oT2?<@=-rbV(jif!Z=Yx8#-2K?{4kqvo&L?Z&=du;JwN~Smi~7>VmGgU{J0Bq;a03&{QlkQb z?Y+hrVmKq1F)iKOXd{gEn{~vMbk|W#D(%)v61&j!ks&$=d8&diG>QkAeZ5H$jwKJ2 zp diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm index d8868180bb90f026faf7e0618b0d9d287e5d989b..cb9c1fab1bf4833ac35deba2d914f9a825d93a17 100755 GIT binary patch delta 1135 zcmZuuU1(fI7@fPjY4&C-&SsO+Y-+n3+nCMfXMXP7J7e+Twr)^gw0$nRGjr$G)-*!I zh@hl>5Q<<6PN6CIV6ljARTlL@sQMr%h{QsnqAwK{!5{J#M5BJ$whw|&XU_S~H{Y3W zE*v{|?A=F;!G?dVIPWi(y8fHuHUDC<+uJOiE)1Qm;1;TsQM%^O4DJiodzT0Q34)Qg zE{8h?YN&#%{_T6ux7WiaN>MYYq+f?=1sBrq!gQd48UZe+x59J~7aD~W#RZi9?7O&L zyW{#LOpA?T-}SqH4XeGIVT@1%rKOW8nn!6sHt$BTutC3Iz^w4_hD;EmoN_n!$c5t(K=rBp^4 zQ6%xN9+<8X66HBjMl+fVCP}CEykBj_e(S(oEsi5DR7O~o32JH5894&AhiWu=np4A! zF~UfjS*w&kH`&D22*#M9iKEg9C;i8h8Z)j< zEsK>+Y@(EATad!ujCtn%XWRnPiI4T**X{yfe4BxN>Ta(nLiuCy<=QR1r>K z<-6PW;mkTlV7j0z%aSPZo%RGahHDKiA}2&i9{CsA)7TltEVz_*CWmkH@3r^i*eS+y z#$#>dX?(6&1>A644|P(rUjo h^AU#i$Sjed4 zP*7}@`c^GW!B!DX1z&te-UOa2<1?*FU|TcPg`P%eO( zsN4e}-kR^KpQt<5ITtFI`^oKBOGzG123O7{Klu;()2Qxu4b1+}zu`|0?2GE%F9&`s zM1OWK?Rh?mR{cctT=DHfSoCCHdEI~BT&^uHq;_#>`uO6)oHa|&P1~iz{(+&#{F_57 zQ|qPj`6w;`Pyql81=a$u=K$yl{3Pgl;8%VBYV7BR2Rn}kr!NAa7`QEzwF7bBX2K)E z-yS# zK1Wq&r%zf3tBN_RSP0-+XR(x>U7HbA%dOyqW|(F%b=-FPH>+WW6frT*B;_fxg!*4b z?}MQWk_2O|Ep-fQzqh3!7e>U+WGG{?Ns;uct^1)9jM$7BLkKonb6*&n4HFP$T$b@v zF{QBWG`3nfNtrMX(U?0N!u<6y1LIVqupN$ds<5%tKRG^@I}`bjN3tg*6G~vrW1Bge zS<#s~dUW~N6eox(iX|6JQXvqPt%-wAJz{3pL#|{vhGJ5guuGcy_uF?tiw%i+rbrxH#fkGjv?WAZ za-t+pDGz&U>qjSMpimhTAxmnFkVs>HVq(4;qmae8Bbm%XWZWVCt=vuzCok5*g*C=9 hM%pn>x#`@q-@iCH;(wm3RkUP;Voky?Be^oX^AC)*BKH6Q diff --git a/substrate/runtime-io/without_std.rs b/substrate/runtime-io/without_std.rs index b261d651cbf58..d1cddfb398967 100644 --- a/substrate/runtime-io/without_std.rs +++ b/substrate/runtime-io/without_std.rs @@ -141,7 +141,7 @@ pub fn trie_root< I: IntoIterator, A: AsRef<[u8]> + Ord, B: AsRef<[u8]>, ->(input: I) -> [u8; 32] { +>(_input: I) -> [u8; 32] { unimplemented!() // TODO Maybe implement (though probably easier/cleaner to have blake2 be the only thing // implemneted natively and compile the trie logic as wasm). @@ -151,7 +151,7 @@ pub fn trie_root< pub fn ordered_trie_root< I: IntoIterator, A: AsRef<[u8]> ->(input: I) -> [u8; 32] { +>(_input: I) -> [u8; 32] { unimplemented!() // TODO Maybe implement (though probably easier/cleaner to have blake2 be the only thing // implemneted natively and compile the trie logic as wasm). diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index 78fc0e39eb54c..c8c647c9b1efe 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -570,7 +570,7 @@ mod tests { pub use runtime_io::with_externalities; pub use substrate_primitives::H256; use primitives::BuildExternalities; - use primitives::traits::{HasPublicAux, Identity}; + use primitives::traits::{HasPublicAux, Identity, BlakeTwo256}; use primitives::testing::{Digest, Header}; impl_outer_dispatch! { @@ -592,7 +592,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 86851d6e7ab4f..249d142dd2270 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -332,7 +332,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::H256; use primitives::BuildExternalities; - use primitives::traits::{HasPublicAux, Identity}; + use primitives::traits::{HasPublicAux, Identity, BlakeTwo256}; use primitives::testing::{Digest, Header}; impl_outer_dispatch! { @@ -355,7 +355,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 26d74b150148f..66615d877c06d 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -172,7 +172,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::H256; use primitives::BuildExternalities; - use primitives::traits::{HasPublicAux, Identity, Header as HeaderT}; + use primitives::traits::{HasPublicAux, Identity, Header as HeaderT, BlakeTwo256}; use primitives::testing::{Digest, Header, Block}; pub struct Test; @@ -187,7 +187,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = substrate_primitives::H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index ac26d6db724e8..eee223377329d 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -193,7 +193,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::H256; use primitives::BuildExternalities; - use primitives::traits::{HasPublicAux, Identity}; + use primitives::traits::{HasPublicAux, Identity, BlakeTwo256}; use primitives::testing::{Digest, Header}; pub struct Test; @@ -208,7 +208,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index a71fec5a2a335..002a311e25699 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -47,7 +47,7 @@ use rstd::collections::btree_map::{BTreeMap, Entry}; use codec::Slicable; use runtime_support::{StorageValue, StorageMap, Parameter}; use primitives::traits::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable, MakePayment, - Hashing}; + Hashing as HashingT}; mod contract; @@ -72,7 +72,7 @@ pub trait ContractAddressFor { } impl ContractAddressFor for Hashing where - Hashing: Hashing, + Hashing: HashingT, AccountId: Sized + Slicable + From, Hashing::Output: Slicable { @@ -706,7 +706,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::H256; use primitives::BuildExternalities; - use primitives::traits::{HasPublicAux, Identity}; + use primitives::traits::{HasPublicAux, Identity, BlakeTwo256}; use primitives::testing::{Digest, Header}; pub struct Test; @@ -721,7 +721,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index ee6bad5c83188..15a1ac0ee6855 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -102,7 +102,7 @@ mod tests { use runtime_support::storage::StorageValue; use substrate_primitives::H256; use runtime_primitives::BuildExternalities; - use runtime_primitives::traits::{HasPublicAux}; + use runtime_primitives::traits::{HasPublicAux, BlakeTwo256}; use runtime_primitives::testing::{Digest, Header}; pub struct Test; @@ -113,7 +113,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/test-runtime/wasm/Cargo.lock b/substrate/test-runtime/wasm/Cargo.lock index 20af98c6cd5d0..a51ab7129cfc5 100644 --- a/substrate/test-runtime/wasm/Cargo.lock +++ b/substrate/test-runtime/wasm/Cargo.lock @@ -1,25 +1,3 @@ -[[package]] -name = "aho-corasick" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ansi_term" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "arrayvec" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "odds 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "arrayvec" version = "0.4.7" @@ -28,18 +6,6 @@ dependencies = [ "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "bigint" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "bitflags" version = "1.0.1" @@ -105,57 +71,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "elastic-array" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "env_logger" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "environmental" version = "0.1.0" [[package]] -name = "ethcore-bigint" -version = "0.2.1" +name = "ethbloom" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "ethcore-bytes" -version = "0.1.0" +name = "ethereum-types" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] -name = "ethcore-logger" -version = "1.9.0" +name = "ethereum-types-serialize" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "arrayvec 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -167,6 +124,17 @@ dependencies = [ "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fixed-hash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -186,15 +154,6 @@ name = "gcc" version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "hashdb" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "heapsize" version = "0.4.2" @@ -220,46 +179,21 @@ dependencies = [ "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "isatty" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "keccak-hash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "lazy_static" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazy_static" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" version = "0.2.36" @@ -281,33 +215,11 @@ dependencies = [ "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "memchr" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "memory_units" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "memorydb" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "nodrop" version = "0.1.12" @@ -321,11 +233,6 @@ dependencies = [ "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "odds" -version = "0.2.26" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "owning_ref" version = "0.3.3" @@ -344,15 +251,6 @@ dependencies = [ "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parking_lot" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "parking_lot" version = "0.5.4" @@ -373,32 +271,6 @@ dependencies = [ "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "patricia-trie" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-logger 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "plain_hasher" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "proc-macro-hack" version = "0.4.0" @@ -469,36 +341,6 @@ dependencies = [ "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "redox_syscall" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "redox_termios" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "ring" version = "0.12.1" @@ -513,13 +355,12 @@ dependencies = [ [[package]] name = "rlp" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -629,7 +470,7 @@ dependencies = [ "substrate-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -660,12 +501,9 @@ name = "substrate-state-machine" version = "0.1.0" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "patricia-trie 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -700,35 +538,6 @@ dependencies = [ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "termion" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread_local" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "time" -version = "0.1.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tiny-keccak" version = "1.4.0" @@ -736,12 +545,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "triehash" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -763,31 +573,24 @@ dependencies = [ ] [[package]] -name = "unicode-xid" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unreachable" -version = "1.0.0" +name = "uint" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "untrusted" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "utf8-ranges" -version = "1.0.0" +name = "unicode-xid" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "void" -version = "1.0.2" +name = "untrusted" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -800,11 +603,6 @@ dependencies = [ "parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "winapi" version = "0.3.4" @@ -814,11 +612,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -830,11 +623,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" -"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" -"checksum arrayvec 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "06f59fe10306bb78facd90d28c2038ad23ffaaefa85bac43c8a434cde383334f" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" -"checksum bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5442186ef6560f30f1ee4b9c1e4c87a35a6879d3644550cc248ec2b955eb5fcd" "checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" @@ -844,40 +633,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" -"checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" -"checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" -"checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" -"checksum ethcore-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3977c772cd6c5c22e1c7cfa208e4c3b746bd6c3a6c8eeec0999a6b2103015ad5" -"checksum ethcore-logger 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1fd5813e49546030be7d134e775088d56b8ff4ab60617b90e93d4f0513da4c5b" +"checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" +"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" +"checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6" +"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" "checksum fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" +"checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" -"checksum hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d97be07c358c5b461268b4ce60304024c5fa5acfd4bd8cd743639f0252003cf5" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" "checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" -"checksum isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f2a233726c7bb76995cec749d59582e5664823b7245d4970354408f1d79a7a2" -"checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" "checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" -"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" -"checksum memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "013b7e4c5e10c764936ebc6bd3662d8e3c92292d267bf6a42ef3f5cad9c793ee" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" -"checksum odds 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)" = "4eae0151b9dacf24fcc170d9995e511669a082856a91f958a2fe380bfab3fb22" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4dc02a80a0315b109e48992c46942c79bcdb8fac416dd575d330ed9ced6cbd" -"checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" "checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd" "checksum parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f35048d735bb93dd115a0030498785971aab3234d311fbe273d020084d26bd8" -"checksum patricia-trie 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1e2f638d79aba5c4a71a4f373df6e3cd702250a53b7f0ed4da1e2a7be9737ae" -"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" @@ -885,12 +664,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" "checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" -"checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd" -"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "744554e01ccbd98fff8c457c3b092cd67af62a555a43bfe97ae8a0451f7799fa" -"checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" -"checksum rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "babe6fce20c0ca9b1582998734c4569082d0ad08e43772a1c6c40aef4f106ef9" +"checksum rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "89db7f8dfdd5eb7ab3ac3ece7a07fd273a680b4b224cb231181280e8996f9f0b" "checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" "checksum rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)" = "" "checksum rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9743a7670d88d5d52950408ecdb7c71d8986251ab604d4689dd2ca25c9bca69" @@ -904,21 +679,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" -"checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" -"checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098" "checksum tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e9241752647ca572f12c9b520a5d360d9099360c527770647e694001646a1d0" -"checksum triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9291c7f0fae44858b5e087dd462afb382354120003778f1695b44aab98c7abd7" +"checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" +"checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" -"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" -"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" -"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26b20dbeb7caee04597a5d2c93e2b3e64872c6ea2af732d7ad49dbec44067c35" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 4607caa9b3f8a09d856f5903d359ba75b10fe4bb..bb8c35cae7e0d7a2f9f65c381e2384bb5e3a6cd1 100644 GIT binary patch delta 650 zcmY*XJ8M)?5aw<~4aj-U>Ei42J3oCQxJWOymyFL&^3>IP| znBx2nLD(+-3PG#|!P?T&8(0LZ8HVpMuj9inho5&F#k=ep-F#_*@{h(^-fg^{y;UtBdPyG@AITnup0`TvdBD3K0o( z1QTU6D|hBXXY=o>*-l0{CkzkK2hCGj{pZsT=n`X6aSBRBVr%~~OX4abpi(S>78G)` zw^;_`kr|V~duufEe7ASGILiCIc-?~aCNige@Ja}{y)_!W9B%>RQVGcrg+``+!^kb%utdnNQL&~BXs^SeBD%zCz8a`S%@YtZEySqW-7fw delta 649 zcmY*XyK0nC5a!>ABp~tMO;(c>AxMZKF`hYdZu9SM5(_OXECdUy)qtd zRR2=7I61j|W3K8>POm+ktA6E2>gUYI`of_d#p?Y;==G{*gvyJE%78{ln2*d_+Y4|O zk`h5HhML;>4)xnyh7g0nh>R!TvU3)#NqYpr&}tVgC6l*l(6%~|ms|q|Kx@VPS!yRJ zLj^9F1PBmymvY@($zPh8?dSpnACRjc6?lE+;wX;%(W|Sgb~qgSra3p`@u+F`t>%UA^}Tg6C2d+EPYRJY9c~KW{GNhlA&JVt`tkvV!0+ zp~yc5w`=KzD=#340dpEtp5NTBc_Az%f-c%Q&GU!N*R#R85G-d*r*i(>-CFw##FV;l diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index b7541aeb582fda727115a070472ae93056f93d90..ba0f64a59c754c764677e4a56cdc7b6f11152413 100755 GIT binary patch delta 596 zcmY*WJ8P6t6y!?+!h+$ty9z!)S0uuU@t$+vs983!)*b>8^)%mcnOvHWe)6Be~6sVH?`Hk-)5C!;}kAR>V);EO4~J^SRZ-~?Zojt151 z7`0cqr0i6!?YV!3gN(6CX{@4bZ6Vp7|4%DO*@A%9$_h?X=6ln*$UdR;zCudDJ5+o) zz1Y0r<7v4TAS7R8bSWpRHME<%yU+GEK`LXlk%&5=Qqnsxe1CgafT=~N>Oj{3sV4rq z-HMzFN|%BG%-LzjquFIaq+&OKGhN=`mF9=Du_%O?I#!5P%K5`L@TfTZA$>m+Y{hR27urJG)OWP(siW1H}@2b?soe+6$C@GKv5*UYtan}|ubodRgc$jFa#IvY%Gl1FF~wU| z`RnAPs1lIKbvNdS6*WJfqA*FvE>Ghn$VgcE^Yld*V5-I-P}gH5#Shvy8#% Date: Fri, 25 May 2018 12:13:27 +0100 Subject: [PATCH 16/60] Remove old modules. --- .../release/polkadot_runtime.compact.wasm | Bin 235275 -> 233550 bytes .../release/polkadot_runtime.wasm | Bin 257489 -> 255853 bytes substrate/primitives/src/bft.rs | 308 ------------------ substrate/primitives/src/block.rs | 276 ---------------- substrate/primitives/src/lib.rs | 19 +- substrate/runtime/primitives/src/traits.rs | 51 --- 6 files changed, 1 insertion(+), 653 deletions(-) delete mode 100644 substrate/primitives/src/bft.rs delete mode 100644 substrate/primitives/src/block.rs diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index 07c28e8cff59720e8d2ed27dc43f225a14628216..ec751e3eb6e9584d9f65c6077ecdd01b5b915329 100644 GIT binary patch delta 75923 zcmeFad7xEQ*+0J5KJ&TLzTEjT?Q^)mWw>xbCP9XcqL>3XRA!cF_No^rl=?NOhm3kj z$*^s1OiWPJtAb)!*V6P_mYAlfWRzN1mQ=n)*<18#`TcyJwe~*yT)?S*?_Y1mJ$pZE ze%3Rs=UHp*EAFg)VtwtFz;1m?J*lijGKK$H3CpsR$yCxxTb6&f-MI*lOsM=H@*zrqbz*W#RwHhIA&~ zoNP=tOIj|OQWvP^=2Svi_34}{DR0kr{Yw%fN=K#7J?)%x&i{zDIQbtJe)OZ(aaE^% zZ24K|UwHQNvp;%~b)$05J`azlopbg@A3gPSK)OG54b+vjy{ame6`9D5e z{p8lulY8y93$3b@<;>mZ@6lT?%KR+X@RNsBDpyKgI;xbuw7N9H^48b;XVl-}ySJu% zXHYuVo9}TGp6e#Q+&aYW&HJ+lO&`+`SkLo0BiwAwL{^KNcC)6ooExI1-hG#t00K(Hlo|M& z4|i4FfZ-BQFn%x!-KNTB(lFuz1 zegX9eWWzqSZZl8t+9>PdNk%U zUg8*5&}nB2t*A#cuh1%}lf}VkoTr>F2_QI=&%)E=r1z9@gQT$FEE+4P5Zu;alJM9T zP8XBF*zG0>kAuS`V2Icylea}2HP~%8>FF{LK!{2$Db(_ld{3tZEI`T<#SmbeAUs-6 zqAJM3beClnAbC5j$MS_F1=@4@0akbEngVM_aEj95F6f3hzm?135`b z;9r%&Z239N@?MdFn(HHsc-y3^h={>x06;NQap_JF;DTxhm?hmJWF$q0={}LLw+@7j z7RK1m*A}2rJMEpdh0*8Dt4MQF!Ypo8mJ#bm1218Hc4Y5 zIvneUQ#{^{+&$?h-|(K_@X*WvS2lJ69^lh4!m-0e;*@nt$+^lTSr@L5ws@nAk{ zdMM81Gqk3rgUN2}9n^M^D|vM~2y==n_2_qWf0iq4=y#0t5LY^2dnHx~w9Iy;cRB+w zILByva#EI~5Hk$pi24fjh1%p3XJrj0) zlV4L9(KeN=ku4^@o5GUsh-tid?WEig~Yebj=7i zzW^p&-ciN+nxZo#zD5|zg~9(6M)Idn?BdVjVjF)pPj71`P9RGn2_)ml`(G_~$dn=p z8vCtuz2hb+D}XrB4UjG(E1)ApRzOFHtPmCc3sLbRD!_9hDqtgss1OqXsvgq@QE{r) z{R*-|j0eaH*aV@h80zLLw0$TmcGd_<4UH#~7IxOasB0EhPhy7h)oGx6nE&k&?ZXaY zbJ-#+y*%szb$AU7H_twz25^v!e`l90ty(%pI#7Z}c%w&5TQ*q`xq5Ph$jC4?h`eud zgvhrRx?qmP{){Ful3+AJGzlU>Z4|n1(`H&+HkxEv2}Dxb?bm41XiPv(YVla9_UgO@ zXuHZ_Zcss%5_PbUH3pLlYN}jdml#YEgH!#VjeM_~Dy*Zg9EhNf3 zByg;HG(2K9ogbQ8!&@Vsll)NN8tzuYh0iIJMvB#8&8O7c9X3omBimD^k%_9ec9yyY zq|RPaUhD-irykObzstJ#ch@0J zC2u2|ve`EZ4!Z}lI+F$wsAfj;aqa`XF*em`KnM;T^n*_8$`0<$STc|WK7Ugx4)@np6d3O zj+x$qJd>>KeD&Ev6>F%jrho-YQo!Qps_tf$_aR?lnN@jqA_c_fo!RqO!OI8l#@b7i#$X zY+kHR^>bM(3C$0rZIU*5D$WZkw6vFmltpF$Wkm@gWf6{vjKgIj2?s%h@PWLe^im7_ z0D31|XyOMW7_Klp0){XQ)4!;tq+-0KLf*nKL#8+o-w1<9w+z9D-5SUsad@1eG#q>} zkl@1tgvS{q4ws4yLm4sjCU%#`VevmGRC^FVo?6CLZ^gQ=4w58SouEKTS5=R# zqOIpDr%;6I8%H$0d(~Fb>=`aj2l8_qzCZpS$exiW zyv0%nABuq~PB<8tFu2817t0+^IXK_MQWtMfWU0>)3td+AF!g0sPtWFo`OUTGLp^ax z29cik*BvzE;JlmQ0$oBMIWKce%_z6QZ54KeJfpbdPooY@S|8j-v5v3V`-Hxo7|Kpm*NqN@3#!8(AiNRMWqtjRT=l+{A(QFLr46( zV|mf2?||d|yJif7J^sXu5vt1n^Nd5fLgvPbl#vj~jRDM^f=gsLJtK+g;qZIRRm1%2 z4)&^siWtZiQq_Y29pUF^4y%Dr($qo3{=G%k>nG2gLX5AODJygsEq?#ZWV10^7_k&b z7-a-<{cPqtGg?wyrT=?{D2x^uDS}e*wZdqjzx%*K)ZaX7#IRQQ`w+Gg4H6Gq`pv1?;yNbW@T zz||J*$u~=Ddy{glZ<6L5Agu}QHA`Auk5jB}IzYB0vNihepVO%t{1tOrn(2k450qTW zC}4)H+Td@VGuG~P{GZO5kZE%39lN^8ubn%w9t`h+5eLIv40Eu$Q0*T(chRsRP%O#n zK~-+`tqW=f!Ru_}#p$q27vL-qdC)(O3sLv@=EGnw%L)xP2AmaIg3w#5pXjUAPxRF8 zBVTd{7#R_seMe0)$fK)ggh)RzYP3(2nFBO=Jeo{14J$yS!zKLr&O)HT<+}`lDm1MZ zC$#Fx(ePCN`$C}QAlUw5X|k@@vCe_BE$VM`rMKqH9Q(h*IK8WYf@B;QX!lh}*`nrNT2QxVa`N-qjVnjl5Y2%u{b z?u9T;4;)L7qKrfVz{CzwBuEGYnudy8P!hL|r2KpG&6Q!y+`uqqJC#L_VN9q9!-E`} z;lXfjB?-}_kXZ1@z*R&n@EUNtiP6Q3V@VQ5ABHi9$ryCh%aQKus8^?3KyDrNf;(3{ zR0uAcAQa!xRxXS|@g1UJ_`nzxVw*N$5`*d$`QZ+iUVsLn7XX23h(aO)02U)&AZ;=@ z*_(%%NbfC1BC$#Nv;P2P6rXJ0Z+sF^YT^=VK!7rdK>di&6=9fCn~lPsVdP%$3{Etm zPsZN{G9{w2f@kt)h-X#^PJ}>_Bs_-k;lT)_nOv^K8aXcoi8O{Y1f-EEN63BzJwY8p zfqH^Q3L^Ccjd6>dEQuJJ36*G~nNW!|nh6b~kaU88Iz|i#OLhzhOO6~6mK-%8EIA>h z2&i~sWo$?he1}vUH;^L2s3hngSTSKq+v|(AxD=x860RHKcrZ6k2zAo$jd;#n;(fW=Fu|JqEU@p6?{(J!wH_>{? zMB2ZXFJRf*Wj$;n?cdKAM)Ca-6KU_2U{9BId%iH%Ot`p@C@M^7#B#?l1ppT-C_N$x zf{S=D02)kMycj^I0hHr6BC;g}3bSggkgu2tz1W?j+XQ1pZGz7L7lVj`K!jgSHvE-MQzAARBtVNHj4X|G zmI)jQknxB?OG0-=0)%~uaeOvX$$z~dQxW@6=4)e{MHtB8s%ACzrr6v86LMl0!VT?~ zSxC{m6|oxS53qWONzubCiA-Y>Y?0X}DK=moi^fhF&3Q3|8{=`VNr_>PDX49pNh#L` zW&|V7QmbLZlNqlg)Cwg)oX9ifhJ3Y4W8Uj%7{0ac-Jv0Qc zI8EPGRg6R~ckAdm^|H$^gbxW%7s5L~x*YIe8@;sYAh{UO;9T!3x$-6@#_JS9pl@#M z)btUyPp1tD6w7QwC>1H_YDg~;ycC&pnr3QdO2$+b|T_C;>X_#dBO-QNpjPC@m{Mbe|HQDPfa%)#8fq5)#TICIPQP z#Uib+l^+Zd?x{#dLdpbR^U*{S0G_R@0Dw_OR{%6pL{3KV-MLmnW&@1S-kcbrC2TBW z$D@T8Fr*tRi%0?>s>&jgfX=vxB%nJkA_;(~3b&RD+sC$Eh{4HiO^^;^adJaaxc6dw zB&xW%LI$PDCmNL5bP;V=4Yx0qrR%PcxwLkRN)nF2mZffq5TG^^yQBz8E^dno1((@8 zB!Y{Zhr*2&WzpQP>y1RSFatbut6vz(Ta7FID=E3pFYNW+9_ zcq|*$detS%JWXw}lO{}qK|?!&X)(KuDX`^eE--}xtH&7j+B+aCIxW27GV7N7ECrKM z1p3~bc5sL&#SW;9ucT2dGY<1iX!V-8zAIW@+B;<}Fd zGS)g%&^*_5T9ZbjWeVEox=!ofD8;P!JhrdNyCMnI%{M8r(P-r%Yc`gN4M)2Jiie>L zX*Sk5?G7j|Fe$Ox#2tXu{NX04Tpdxc0w@SAw_RBM&~hWZAJ4tDJmCPrnK`_Mi$Kk0 zF>^}uW6Z)K0GwA|^AP|WXgm+P=s*G?P@P?o)n;5q6XS%p3btivCUa%aH5q%wrSKjs z)kN>YP%0ZFRK(pedqi?{M$16rpIOkCvavw`dK;cp(K#R>Vkv$sr>0V<>ta&2?DV#NBN0Xq1c<~Unzq@iUT8xW(jVZC} zv>X@r8dGA!F(P#?Y9qDBP{S0^4#lwMgQyE4Q6U5AI%86~I+1ml)lde~OQMf?h!;+; zWR2LJkJ4J}Mim>eOZOU6;sX#btcYr+phbAJqHr9wsfgEvje}yLfZd*9Mt4Y5Jpo|n z@_Lm3h^#Q&XL|%dsFhcp1VFxaM)I{E08~1rvlQE0Oac2(>>=auDPXsoXA0PUJbNop z3Iet)$qDF=ElnjyCq#SHS>`}jV#`Ya(AjW#iCz56g7K8aHUa2dw2bs#Pm6$^94AqT zl@-!IEnr_~Om!#nq3*IUCjeEKg*gGJx-85~_v$ibX-)vjlzn;xpiCsTy|ubXS!xr2 zB4w#f0E$FXJCv_G(Mvw}Vy5qvXXro*+qLZeUL0pf_sgQ40MuI+?F69SNVH2`kk5N@ zvj7&lARFlABcPY}b71kV1j62OWQA&bGv8)eh*I0$ZFtVhktXkUJVIstGc!vu*CxE; ztPCI5C)gJR=+j?#n)pgbI~;oA?8(4?zoeVx!j%{t{# zq~Np-GyM>cjXKlgcpR#sKf+_1etZItkj2RBCT3c_Se>}Q!FsMzb|9%icY+Oc_qc=f z+n16I>+`@4oA@H%FnR>+WMDIT%uN;E8l=e92tDF{3-}lVPSC^Ljp{Xfm4$`3Cj!Pe zeQyMe$)XjgJmgNpA)x=yMbMZgx|%>(T$$;D(RGriUl=3QN!|tkT|J=ncpR)BZ^UCk zqi-V~himA~cr5D2TktqSXXs60$90qnhC@`VW4 zEecG4KaPN%W#Eq@pw?)T^ZTU;s_`Vy??gb2Q2~A<0&3g~a5I50STnjef0R7`Oh;$* zy#FF(qIzA=wzmhbt(qcMr#PI_PGM$_M-aVIpakls1^BvDOQ3FAfPWznf-)}v7XeWl<-b&SHKAi574+-ll4)&abq`0tSatVDz*y(*(Y38Lwe68STE0Z0 zc{hPGMe6A4gp+qgS#@;;vSWKwuy|6g0`+n4B$h<}+Vi`)E%%4#Pv*}*&u`-mHC*B) zqBdZdbe1=v;V~Icf|aAU{rQV7Xj+(7xy`4oHQz)K`?>vF1%g1+~pi}knohQhS=3E%!M8g za!b+f=+KDP7x|Ry$H2KAK4yl{_=9b$+!o>phOXr%G`>XGCp8{L4Wy(SMZtsKpBLhq z?E=>ve^y@|WNsUvF^)D>h-_`p1dNM?|Hr}x@%pjZZKtOc$5Z{5L=;|T9 z1C8eDp^`CXI1E`Y;#c+sL5pe$ztiS^VT8dUupbPr-d?Qy z%0#^fZ)NJ=ZNI0-Rbf_gksK$qT~ZCmcWpwqUA|R-420gBZLu@Lt;ND_cU{ynnCTcj z18~Ax+C_&qFyM<9wM=0;ut#eG=@6-A6GFs2IsyD%PVmPsAIi;AY*Z7WNu)y6BxnF^ zRuiBBP!JFRiLUEo!vsVv(`+OlY7xr{0YJK#E&wl91MN-pLEA0%JY-t$Kev2rX-k5# z+*3zLbm!g#4|*?<=X>PY!35(nx$stoa(0deSsZRNfLC#a7g zg!{F1U!<8N6^W>EFuDml-FUHb>@rI*C^$T#ijINZCYF@TG;j;d(^22!<2D_>R3(a*;^r`%)z z#ZL{7^%rNvP!@Vz6>wIQ_Y%BGPu{#2HO*ls7GP(q;0ut-)`1~h%;mrQskX{KAfxWX zd>k@o)aZcNc#A$XmHUulUF^rX8J*%Fx+qPmx6LIzpg}{6Hfgb5(_#U9EXOR^P&JN$sQEQ- zK^23d8Nodt99pFTLq>pjCqrdVMaO^wvfLzHq9QvW31ASJXb=g^J+{HU zNo8+US30UIiMp~JV2(^>d#-Ea2CsJ9ugZ7O;DM_GZQI=a4hHgeS)w)hh;m|n7^SV# zU<{^A8Xlp>#b=|_V9TICQVx&Wkg7#ZA@-KINk4f>v9yHZ510gpdC#LgNO;uQWnHGY zx>DXYz)*pW$3TU;QG?ND*u?N~WrO-BsugOMIz^hYz64pY5L0e_Ruxd)80$Yl(WvWT zY06ENjPFFjd>|8*2Z49U7ao9-jjz(qb09%=ay zAtryerxX@o-vk%f^huq9*>iDo=Xm^p>^c#!Cx$@a-I$>aq!Qk`dvGy`Rj?EDbbSz? z!|i!Uhl*QLOiQLQ_8Br@PP`-=4zFga?H#Ln3c#&!dLE(=CCAgIAU>Q++$t_>1lkE6 z1J7h}5DZexA^UXNorM%ygUW=|^jgm;B>lf%I%{asI}2*M#-g%9bqi{8AUK=Eox`Lb zS86R)iw-A#^IX=+jXFlNE?A`5CT$z$yC(13P954Rh9Qey^F0GsnMyBpZrPv99qh8MYtSaZd=rUTCsnm36=p-ZpkF#y4QRpQic_tWo z6v7D;NH&MfQcI*CiB8e=$kVsQ88iGEKTBx8w5@5WhC9@QW8R!7dXd#}QX;CC$ zs4f#Gs)e(xp?KmE_?gylP*Os|2!_6kY_(P5sm5IrQY36=%EPcV8L8oKP;X3qw1V{6 zl)zRf%zwg5)3>I)^$PZ;$9up+zICmr8S()J$2Ec6gcypDXw4vX0zPPZKmUosstZF$us0xd91v$!LcFx@tL3~IByL7fEdv1D9;pyyj3 zzHF(=oUQL^_Mf=yG(TARh3pNiCm8>tJ+=i{oDcSLU8~Dd3t)ZP zm>H+XU$ttH2c;kOBSo}Zp1!OTLxB^S?}N(e7^~&AhwngGN5S%2zc9KE6y4}%Arl*c zYSet}7bZ=xP#u`oL*ymFTk)DOtORbw8|2j2LF~!=Vw#2GyjK59Uu>@DG*XBIg(QCG zTmG3>cldk1P|R5%K+F%C`{LSBRlEg?r+C@aiI-1mU{fHm`POmq!Hrgy-+#G_zb{^1 zn8e99^PY7rSwCTkiaJRz7VQVNEt}9Nex4fLu;d1a6>8+~|LfX-*hfWD+fbF|54{WaWg(M+U z#7;;60jj46F=$ouOfQOGFU6l)Jv7VW(&ArNa{^Q0gk<#u)|B660-MV3GJ!+QI~5qm zdC5!mq!MkqBBeG*7B&#hj>O<}2jQp``+?WZp@VW4w@o!35gDfsy)xp&WgVSGT+PfO zJ+3Vt5EpqJfE@;a4X?smmiK%ti*)y;2!MOMP&Y*i8Y7V;_TS1YQ3=z^Ut$13$?GwI zG*Vg_vBBGIWpz|Sq@(3+i~*#Tbuoa9_UZ@_Z-iJc!6-39QX<*}Yq*yZgxU!_eGX;~ z5%_DX2ZGc>kPp(3Qx97xFJ#nH$cw2Y#!KGA&1lpN+mx`4sa&Q8@{dZ)OQIcQq13~D zl$iZ0GM}joce0?o^r%XZY;qhY6vz#C=+ltjWh(K|3e#);n11j#Xa*IZJ52L=*l3_xx0y<3~@7_mhRBq9uO z6`J?z-x)2v8&WC>F8@8W^lnJ0L^{RPN0=m?;yuFTJD{a^LrQx5{~lVZ82{TOCDI=; z@b93di1sQ-3A%>%0)5SB2j&dL93DZ@An=lKzudS_ou{RXQv|i^#k~#NAzG-RqDC9MquLl5Pxzx} zi;+Ro5iGAW@1v@1GDcig%Na)29W4E=U2Lc{XV4qxAy_mEVFhftddMI%PvmLpG`#vh zzj|mjF#!WsgtMRd%6Qe|Px*?skoJVZEXfknRVcrsf0ox)eh1zxuReTFL$Fa&={COe z71x2$lcT@`t_1)7e|@FpVB%0Pns#~L9()m%h%{yr<^duZwjLZZ#txZ%%`uZ=c8Jls zksV?*dt`@bed*tKO$RWs>zYoCFc*v;$*u^Fl!#VnHX#);@;i&{9eUuO9JIH}gp!;{ z5->Z3wi*kTzd9H{2)1ZS`X`4?#ZLNRaNNP~0AJLs5wb1+#I@ZZjqzpsvsOqWnrr`| zwIgG+v*p?mI)l)TwC`TK-wblxPBN6P?F1@%uRY~o=;rLNvYS)N-9(Mof3>|$=*e&z zr&W^{sMg>9)e&6vB)K$03Rp_X+N)@a$aIwRvoIHEjP$_|0vd`ITH>0~3oR%U-kj~N z?sg8gs=Rxq$j@s1vuTdJ-9JlyHuYmMz)bfa%%7~~-80EK!QXgYm->$X^mPZ>TgLgB zb??K=hu0mUp7w89H-VsM*BynI;`N6Q**nZT$Qg$UqK7+%dqqN=@&3x|3+iG2mg|pI zkNN+7{S?);b?nzRC{(cZM>m|U>L$?On8(i)~2Y4aiWcSib8J>AXL{<>_ut52uKCU#&Tn(xE-OZ& z{!tGU?MFvoKn?z74~${9%@52}hxxl7_~t;e+Pe9{PpYc>H6QWEpY+hL)mXpfyHk>P zkMr{WY2WMeFaGXSl>Yj6@33EM^4B~**}v+0bL|^kfAJ#+ZB0EqNF`qw=T$N1kgStL z{0|h8chd}fK;Q6Zo9$s{7C+LNAY#At{V#XmyfbD6H-cGiHC;@Jvj!G;I?MV~ZB^cu zcK?zej8m8SiyoQczwm<*_MNWuV#*`!>I(o~rxy6Xf8^2B;m+9V27k>D+EhWhmVWe0 zN*&=}^TS|fG#MN9NFVOEL@2DAD?g8G$+7Mbd3!}9MaXw&JvLq~^uO}h3+hP!vBw9K zQr0~FKK(O!Yx|Gx#4P%cJ~?FQc+8LG?G}$+(T-O4`S!r}6CgqcJtb6o*i*+1Kb-iZ!ryOIkNNjJHBHyj<+nXO9AyuFTITqSrx#=5 zHf(NJxB1(jp2R$fXO6|o@y~ew5h391JiIhX@GyXI!FfBhOpOwDXl#acKI{MenGQAH zAGV{-UeoL^dU=F@%8pamk#FxY_>%?p7uY%J z%Br6nr@Ja|*_{`GmfRgJrn5C$#=*;AIdCxH?s|X1uA=|Poq08W>;LTZ6$tXmpKZb4 zxzCMfXU~1^_v$A91J9qSIEJ&-4fxyOPxx`Yf9wm5%rN+G<1msnFIfNuHqoa}G$(K<|e*7u%n@Zb2gprq+H<5ZvT{bro~TgN}|H}ipsyMNOb zo1ee`=0vsLKlWw8@Wn5GR?YhI?xC2YVY_|%+sfZiKYr^kc7IH%Z~O24-H*ZS<9>gx z`u5gqe}8&Pow)V&JvFvEXKVh|4<*!e|E#~B1V(=7uOrmU(ahxj=0r1d(-D8eoNisX zw@Q`P9qiV*jv#6i9^qd!Z?DgAo3PV?Y6y?m`M^h9MP@rE(%xRCU6Y3`kbyM(QMs?~T1+Qh)$JDKyi^H>5)d{*g1>L2WswjGcU0L-h zbrpx-cV12%tOnhuyfKBb)sLZ5mIoiSbAR8r@~WWJ=Yr>|)ZywoL9tr(jl6FhT{R>0 zcE>un@jPpy_24*msLpigp>cixtX30f`~(wf)nxTR-)XgKLP9O*TT`#nYUZQkxEhGK zUhnU%hds{WJT*?%|E|S&MWPeg5R$;(HR#fV!S+FF1M2O&s6j1O>agJ9Ms=RM+tjCH z7dU?}8-~LQ_l)a1zDYfy)O|srMO~x%`|fQ~c{MxaALm2B`G&W&X=+BWp+mhtt@8x`>`-&n zw7xkb)goJ+8C*G9-JSxSIv)sTcdGG)6RfHXX4Jv&9f<_3#-v0Euqy<6oGi!dyS!7K zW2=Yy{x(+iD*GoL!G`hb81+){$MI?ujH{rfOHCxfEbIcU&FTA6m%2v*-nU?)`h!Bb zDU(#vZjXA5a6}o`E1|plPB=)NDZRgcidu?scTQFRu(L-REC*dPRC{Y!JVHH;?sZUc z!KpLU8|sO^Qx8_FrH=oasg5*5?>l6c`a}eD!YUXLxz|=n#}AceSe;hZ=b4*f*&5H?k!IMNXI!nShGNN+iTrm z=n<+T_{{>XvAg_?!!!NNlWXQ3LKyv6mh!SEwgF<7z?q6HOPv`~$~tY5zn6R;dpgi_n+u;9H9zMkWNi7peCi z6CysEyZt=u!+nuFjZ$hzjrA&{Ty4gPSFTA5!Sf=napKA=95 z`M3t^9G@7FgWbq{DxTxwFvn%OqaQs*Ey-MJa{TGT>hswZ%Di27nmQ;Ldzv~2(>CjL zbzcfNb%t<~j|x7&M8Lsm>ZUTduOvCFs#=SzDG_owcB*d4DEW?XKbE-34oQQ@qL`Yf z(#5owKMD>Y`rWZF7))4Q%zD-56m#(76>+^|#?3JS?ysc)JJZ{7+buj}^l@R$Pe(=u z@l{)b=&9qq)re<--jRXj7{7+^9SyEW74$DvZK^u>*;3VB!pL1MTR9my zFCEPfHomZC#i_xz2JEQd2-vEd3$cp@d&TU)XbWe@Ob$w7D-ZWgSC*6=0|~DbO$;`S zn4)lIM(Afaqb}^oy)gNzaFhvpU=tqEFNGl+R3H-L9ks5MPS33v zj_Fja(Ej>F<4y_bxcT7I=c;y<39dO;ji}R91iz!3gr{>_@W8q1pwjLtRYyI(CUanR z(43I*Qp*vl0$E^GAQx;GbTdla%Pf)tpj z^BnMp?48Gcu^1Vh!em�zU1ya{4%b*ElkXBh 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 Id{oZ=2EzZmHUIzs delta 77139 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 I-5d7*1#AhcJOBUy diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index 777e44d49c173d44c434cc5df340523086db5ee2..abbef301d72fdfd41c86364f3bab03dc955b9633 100755 GIT binary patch delta 80413 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 xX>bvOTY!o8`3WDfu96PQaUcU}?B( zk$^$AXaN;vYmiM%AP}S@AS4PBStKZ6P>|p#L|2*$Gr>bsu2rz^GzYl)t zTlJppJ@0MV9sh&`YWGapS63IluNu|=ML?)5Qr2X5So&!?}rquq2 z9QZ%_qu=>A!-9!ywh{lAviPql+nmoNQuvohrTwW%cYYlnvW1oe|4TJzvYEDQswLAV z1qGN$;lUG&cZTx{>O-`@w)^x^a&RlZTCyx8{38x(OnN$Atgj0@9 z9F#fvxRXD5@@a_=W==llq?1nlWa2}qPn~hxaf!o<$9!hV@u!|~!jcn?J2P>EDxGi& z9*;Tcgfovj>J!L!V&X>Cc+6?1o%Fe*jyr3~87G`_<_Vun+^p)4JL|YlerAcybE|6j z)Cs5PQr)`PO4ayT0FFIo$*E@?^~qB|bIOv$Dpd$UXC`j*4^1^sd0hP%w0&4@R8Oj( zs152Vb)~vmJ*}=#�fNYgFOuzpsB{&4sBWl0B~v4h|*~#eAZ)euqy#UQ@`OQ5g5- zM^!doO?@F%b-pmAn*KtzIvK?V6W-P_zCY&nyql^|xQ@3e?;qSe)xpnM%?l=M$`5$$ z1C>lqGBGd73@SDxks++TtlyvKLS-zui#;uFq zQF+!a$~#NuDtO+E>IvJFM>FeCsC~fA+WG}h8gL_&m?JmfCT$MZvpG92>8#88-)cE; ze7lz|CtasEk*k!v>;d)joJDS_A(u#Ja|`_aTldO&$#T9wQLgugCU<1!pv`T0zuY<1 z!Os(|u77lU+JC*ZIk_!A5bSkAvaQMt(vz^$BnybpBxU7sOdOkS`FY8ln-!ed!Gv3I zbI4E;LX2^n_}r|CvZ+bRXWZDkP}~r0Qt|}vI z2CU>uwtg33UAd^ckMgdY_Fvq`t%6Q&#!cCJSVii@N>-|1!aya(=d?HJpn6wOptPlR zJ=+sJ;`z>rUv-F>rhdjvhZHx|7YZBdx71KS?Z)0kWMkX_hB+g`(rm}Y-Nm~Mv5s;(wiJJ0?3^O#$F0S9jQ=a1) zQBQkg_Vw@WsLxFYd6WCr@8X|0cPIZ}rcZ1Ex4NBNxmAC=HGBj&u;wy!6Bj5c(c?^FqFO(+{enp`SLG4Whg)&$*Q*Fza z%Y6Uue7OQ-Hik@7TfA$|&Ney@j{0~6tL^tJC7alOK6ljeT zDR*-bGeiX^Q)f=BbZPxT>Of@*pEKUVgX(+GJjgyD@?dC-$57#!)JMV9`h&-vLSiDR zd!RBE{TJQBb9X$=9jLHwsvRDunWVPRx{P%#b30ti%b4Qrn3dDq9#dg=)tzb{cM|JJ z#Xx^UR90xqm~zMUB&?kS2*Q;CdY2UjYQPjngY~4^6m)`QxNby&?y8pMTSmY^D$4Qg zBfubTyQzQS0OV`;#9N3T#Ayy(Nx9B-W~(>yDKStfB&e)L05; zsqudVxC0@Dbdm0Xm~t>j-$1BAI>-D0w>^&L3RwS5BErAQm!ZSGiTN+)%OFf|VspL> z^_;1GnJ=T~y@}`ZWstHr@m#))E_XYd^5yBe>u#6lx?Q31m=ekBWVb73JdiL@*_oo+ zMdQ(p(hxeZs8`p+#~C4`kp!mBG)Z{uizmTi%rZ%MoNbcg#-q=jX`r*+S>|bm+Z$H0 zw#Inuz;vt~>V9aCr#U^>RRPE}0DWCCD1rZNLe2RbUI1NtMT z16ET^2TZV-j$Qc<)4`xan~uudTH~?y9U713QO09uH#qGj)n45hv=5EMRJZI_ywZ|0 z%JbYhx7ls!FI}*--@RZd#B*17j-*hVzyb((%#f5r>LCd#L1RaYfXAKVNiZJhl(i#s zdXiP6swf7srpwbSY_c;eWABi;MXu!4=@3uPm3s6$(C>Gp5&e!{ z@9hc#`W;l+$Al17X#m7rY$7@xGa#Ojm;t{MGi(-_bmtn!G0Rw4yC zzT0n}c6IkQPZf6`^OSNInHJq4@F>;Urpa~-}-x{u+4WMtploWwPj&2Ls z&E#+`V1@y-TR@)ylq_Jj0OrwA$MAvCVV6BsPSx#PbQ4}yM>|``40OqOq>*7HMi9p= zY*m~5rd`@#Z~V&^j>~V#7ZJ&)>gN03tnASN6=Fo6@=^!X@8T?SQw`}vN88wzguiHy zPQQI}&qN*PR0>}8!1{_?Sd0j>P&$|XwbE2y_K%wUaYpzLOzz>&?j`h)u+> zh+RfV0y8Xj1*nN#5p#@?1m;-mN`dg;r~>V`7#3)*7#4aiS|E_c^y2ygf=jh;Jwj5?d0)M@%l^lU zGIn}pN>7O{5}FVF(YC}tb@$ecj_-Xnr=!gfGaR{4MnTNJIUzBb`E7}rBr!o0A*S>l zRvJD^tTf^^AtvHCG15Xb7-{isFw&rr7-`au@tqJo_<-hug6Ecq8djQup^53HYpA73 znM52$%LOxDJv*Q%WMY*ip8Lq6UY}P^KJf*&J^OaG?_g zJw_+Og|39h=t{Vts}&>U!=SEb0Q9J}-4o0Cn^}PP2EVY{K7ZSH$IuABg#}O@{N{GY&hFbF$s(=Qqw$RjBAsnS4wi82Eu#JYq;nL~VRq-7m zH7N0#dRjwl0m9=N5{GN*X$>)O5+YG`@upin=m!$&%!~`7yk7cnPOd~2uhB3Rq1*OpHhqKdq}wV&Sh0=)zQwIv4Oby#^G^&kHfcP zAKu<&b-z=eMXmdP%wu7``XBAF+{RTHM7pU}OW}_)(7CBvuQ2=Tx&BU_6)MmzyH4>3 zItwLCgct?;pT>mmNWml~gkP-*uo3%7ObEr3m{4Ls1lXMK;J{sCKg5JGIfwvTCI=A{ z!lfa=-m6ds$`W8>_EZ!MQvy3su$syBCckN}yIYf+(Q7ng5iWC@)z13MMDrM| z-yF4PtN+p6o2j{{?%u(r9Qg1Zjfe|Y5GarFB`;26=p`3EC8JdjGt?1B`!)`<3ccYV z@4Z!MJ=xDO-rMPO#(2z&7gW?3|MmrwRh|FS1&eyE?qZC{MHTql5xSekj70}0E|PT< zF*UKbn&2)5fl@_7Gr0I6xERY4zkE)>y(d%ublu%!yGYd}`HIbh%T+ z{(^_7jE=0x`B2Tt*2oMyU}X!N0<}3i6(49ZnC#d=TKf*t#_k|(%v+>&puJY6VIHq^ z1EaFHL@kA^&Hj;I_iT7I2uyhlOhFp|a>+#iVC8}{k<>-n0j@V@tudJ3-|bCvu;lzJ zZ+5Z8Z7O|Hx8zUipV`#pHhBrRX`G($sKfgCQT-p9G97Lx#qntUEsN`$+_WjuR4m=d zvI*&rU+QTC`QDtzzfbnIEv9J8cnl&P4*xlUt0w|Dd#j%~cWWjGAlMwvpm)W$AW|M_ zg?G^)R~U8WT(r_pTz?$Zpp2)tBLyUN4vu=NEVMGZhj7BQ)atV=i|=@$RhIR#Tq{v1 zt%oC6Wf0|t2?&?jj0wQHgCxNkbXmP;66Ps)GD&!}%WLtqk}h|$DbR^^HElAcy5ZWO zgcdSI-KFh8Cx0-*WtURBvBs)r+Rl^d$lk=#0%zi8CeAlAY+o|b)rBUyx~Nbcz4l6T z@IP33oo37krh0|MTv$cOiPhCg_o(&NaD@aWMQ4w#SBcx}p#p>}-m+*VjOeb%V4d`w zZ|5=Pv1XOD4=Y%P)Of5}F6oYzOYpcersQkZMC=+E78UHe)wpmW73*k*D?5eDqntS~ z4mM(6#I%T!Gs8tMy2ji>oqpwG!{Gkm-&J3AUXDR#mppGosh29h8Wk zEc0h*1K^k_eNcS*OA`jzRWnI~;#>28#~SH_;#>28$BIEQZUbhxQvlTqXl3cQUO=k| zQS|zmVmVkR7Ev9-I0Gm{C6IEbNC!4aTp8_5vZJXQ zTIy9$xGX(l1nH^h{6iNXZllPY2qK4SZneD24TAt`x!cJ&peoS>l4NbPlN%^f?lgB7 z2?R#3jau#J$dmMkA*fmQgbbVJD9+JRGq?tow|as{tKk@wBMmBV?K2+j>gSYjMRc5N zSvgr2JYxYJ_iXK~ca+KAq+St6y&^hOWK}b?Pek3Whzg_0z$y#@C0wtF8cxSnKp`qq zN34i;k601y8L=Wd%}RovYpv`uVnuXTd{b2w6rBA|Rzw}|<-A==n;e?JajrGKQ^E}- zJGs-0aCf=8n5WKg13;!`NjXt{VbrQ9eA+MaWw5a~@%wyPBGgy%WoX>Y#H)F(@%JYF zkS{}*dJ|jo+!HV}@yEPg>i^HYUh026U+y9NPx-RAra$M)veb_q6Of$V#Lx5PS>PJ< zpc-F(r3cWPHVoR_`#^wMrs49n288Q5qn2Oonr^rNfk^_XBfj#0i9cC=bu(3WmWXDdk(tq&l-NeI0RYmnskA^X zCAym%O%p4SJ=O-{LMFmvWFlNzT|se*+784oe^PQQ!Ln?Z{Xvl-IpCx$emLhqDreAEDp4a)S_wvmGi znY!4{;9`oYoQ6<0Lo+z4K}R$M@+m~2h(tt@8E_#Y;V~kvKz8qCZ z=P>Q>&TsJt{LeYAlExBjQ%^Dd-^{eREJ=Uqro(Q40oIVFn~D8|2Uv8Fj{ z@zRd1hG27O)WN#i*VrGOXh%gy?Fr^x^ zJWN8|&KQJAF}K4MMEDFwm=fzdQxG9CDq%{@AZo`fJ2bVkj{9g1i8u^!t02rWIw-DB zf{qdlT6b+?AW1+l&FzGn&`7MGD1lH~_NXBt)=ea!mvc>tSSOKyKF&7@?ZK{-oKjWx zwAFSD`OvS0CSR;y&tY^Uo?N?h8zPazoEet=8#Cd>7pUjhCo>r0{2HBfjHqVVZJ4&J z7!5X7qXENK?7^xXFld1a5!!?Xq-TW3dPcbPjPUL#Y$IGcMtIB)5iT7Aye2MWg7l09 zVm%{VdPaDxXW_^~OJH2^=y5osPsv-^Fmh<2MUWlSL$J+S3AJp-8YWyC)&glML2+D$ z25N^ES}tuKu~E_)!ee!=vvm@l!!)2#G*-F=hXmI(y5l9hnimVN%Jp@Mo801F5fjiN zJ2Ba#OM?1#5$N8D6oSv_0SZ|n&dQdGpaNg>yr3G1CI4bTRZXp@5&#}LRA#37&+a*D0%dSbcMnX>kDD+aA=Nm6t_ZF zVeGgbs(l{;um$5o0V4oLps@x3?VnTwfZDq?0BA@l4ybD3(NYv9te~pUv~7RNAsn!ubg=cTIZor<-5di#AjR&_aP(o@sMt``P)hyT5L|&c%)Dn4l0t8Pj z02Wc=MYp)T&P{Q5EEbdZtqQwWSS2P`qh_O#KH+h}LVl1+%Sl`m0T&Oz{4u>_{h+?i z-yLc2iahqffloRirrIn3hFU?4C_7VKS{H4@z7_VfcBrN$$6A|c8@6VhrG&siGRLcG zCf6iL&j^q8j2pM5XN1RkM!58h@L10XmyQu0>loqEF~a8$gi8X#8}!C(@Rm_i?GA4( zWtI}LAs{M>Av%Nxq-T`27|RG3nIJr3an&0{g7lbD6RU`Dsfh4cMTAR5ghv%o(w_or z!X4h&)opipFP9zOBSwGqkiR!om2(L7Sma2;;UVspRqc(kmtH$B2tw3|#}w;_kP<_S zDKPEy9~7QgN0}j^^pwtnDY2e11wDoHkd#(DzsZ-BKM zWKZ8H&=OWS#?(_6p}1~B3XtX?a|m^XNOSfEN$4qujZBL5lqsMNhK-UEqt04gT|ZI= ziq0R&q;wuPa3DCD z#KEK+4koAT!DOS0cpg@cilPTLmFa9>OH_K6QhYO6P}PC8h+a)~Q2dIiuGYk@Yh0i>5E6pIuyedGb{V=wbE$O^l*;QA4O_y z8$&HxZt0?)=n^jg(?&C?r8$&knn~bGGf5$i;mZ_QHkw1G#AJvmpw~jS&!iY#wu$!= zbEqXgq!?3B9nB$AV%0GP)%BZ{s5WZA3QWW>NMdg|@}i~Y^B{%*+p654KQIw{COOll6~d;lYQ|+7a@_wZ(`&|T4(dB=rrVqz022R3V+Lk{E=FSp z0$`OQ%Sr&OQe;^PfK`etD*>=d70V#fU^9gFe(ca9a-1p{#Iv^*n<#LY$lW;<*42Oj z5DftcfQgBQ00aQR$g&au1S88z01%AL$^ifbBg4uZKv3d!<9~V}Z?#2$V(co$e;y$y({Ia&&>)am zY0#1LTIQJ(ky|(uu|d}x8D9cWZ)kia2db@^m1Cr^A&ucjvIxn5L-h|DsIS%@gAS4y zc*>zUjzq8E+kylizk%qis3Au%t@}oGtT!Bd>bCe>WWz!%TV10Ms#_icV=}pnKumC^ zHL=%89&Iy1ZcB(&w>r!kRmZ9}psHKbu7a`VUR+FL`m0ab)xpn8r_ANg#8W%w z(-FeqC&M;$WPpibJ0luyv4aM|a90o-vZ_;0Z9RlL#f|r^xk3mI5J#jW36CSMN5E++ zNrE#Rd7}TRQ|DGE02O_GhrY^5Z&u66MKyY}nhsh}JRjdXhL#HPy<_mtP4Vl|1a(*x z>YNUGDif@g<2$I(21BBGO8~;1vBoHpoO0=$%$UPaa(z+)LS%}rF47=WG&Xk6jtMB+ zTy{)1PY}?V;D*OTr7mDR#;t}&G6aTRHMxbFlIVEBt+`l&Ym0~~m0Yo;uZ~MNPld$BJ9?L<`4(d1 zy_;J=jZ0y`4H{*w)#f|MnA5bbnvjFtkO@IcZFojw;T?PM06Gk#8w!!P4Zc5;wyk)J z#BvMX(jgr;<1G^GO?a~!fcSDFUX{&C)^kOEgX6L@(1F2Z)PAiarY@i-O6P--G~0wk z+|gzFGE~r4n*iFRbOMZJB5z~_Dpr5y*l||9bOuJ znV(%U?dTOr+G9_>Pj<);C3)+^VtKw=p7rSuWUnP>RE)hs*3wNp95O23<^ETewC-J7 zHhe3-JT9HBsxLVBr|e~x>(q%A)rHDXo8sA)A%))||F=u}lFnQw@TNGu{^l`tRX4d9 z3*8yaWvE_csvrP6puPiLOX6zClrwHzI+IKk<8>&ADWWl)j|s&j;lWd+-K04)fDYhv zXC+BTkIPXyOx1YgrHUXDAUvl8oU%X)6(;@b&z{_jBXQ=6CLC!(o^EHzZ~AQW@kw4? z(?U#f`psNjldm6BH;#vFQ*}5~6zk$>^l%?{grn>O1bvY-)?1rT0B8DZdN{12U7uEhbFG!FevxmbtQ!2b;n ztq~4s)<-<{tXkZdOlJHS2KrO(crag~M-<;snGLLY2S1;vv191JQD-4kzI(Yp&DkP3$W9#q}k3 zA}D;L7EgA56pBCi+>}t5ochN196ug;!@X4_D1)Iuj{iXMbjknt*=@ZwN>y*sz;>HF zCc`KWF@}k0uvkN4a0-%asT1>{%Gj6l?g$$ft z(ol>fPtwpSP#O`{@DXMCXd?tGk%(|~8iFAN2{G-4L(Z5qJm!0vM~iII|KjH>)j{a{ z5DCkw-blz=K$5z8gW|YMd0PNO6%HPUm36inj8<(Ulk9K@+?uI|)B^Q+VO-*N)PFog zA@L0;D9E0;1>%poel1P8RUVes4Q-Hy80?sS5CAKcu{l`t=NG7BwL}~b`y{M0#6g{! zU?v{0gfZ|iaL{nEipbBkY+HcXX>xFTqb#?=|7j6~B<{x*FVqIvKLl*TJ+>sz#>7Cm z4k=D@k!}eVS=8QHgiJ6@gQ}8|tUbQx@Y+u8`bSVbnYDLLl&d!eb|NMsnCWziR0`*aJK-L+vV(CTw8=7&<`;u8&%tV4PWnpJIgOF_WEV-Zf z|FoCpx{~r96gfut90_u_C=8-rTLZ=(sJe<)?O;H(WDr`ikFJy*?M7{eRwMO1s>)68 zo}fvj5VGh@waB1n1Yh!_MZ{lFBZW_yU*k~=XLLp)U zy$Man%)~(<##9tw-0d8K6GN!=K-hheyaGZ#J%yan6zY-*(L`_6Dmum=kOw;wQh1?g zh1AlWQe9zJaDT9!d(2?dCoo>826X7`CFsqBY+!f_kJ6g87)Ij6Ok&E0x^9h&VK-Gv z+P4X8y({82=01m%*Jol{3>gwG?ueKR1%YZ&EfSpG%;5*+z|aH&S!hn84nNSN5)&Ah z&2!qPBit-v%x92GV1%lPz*;zCDHOm9`nP7qxwop~AGA#K;`}uSoY$aI-%TZx{=Y1J ze-%x0CvVboOSgzozyWTU51iu0Wz7`)p2U#D`6#GAvWyXtX&>MZLfmEIwDBWtYD)A_!i}75y(~j|o!4{@X zkVTjX1B>8;ub4K48X5oSEF!3d1W#GZ24jQCRa*y5H@cccLENsnE+IG|w^UWh8ZxXi zWROm72s@di$iaHY0758?!|4u$P~ea9FiZ~t;1L|31?+~7_Ys0oewYO_!HSar8h}nn zEJQJ}+{Inx{=Z$YlgjuvTyR(0dd=d})%thcG>0Qa|CBEs6nx+dPR4)WOFOAIgF~-( zTK&I%snP&NQ;RVSaloO{oBk z?kX$)2g_zQqvjSjXYN7Z{ShVIa`3_p&RBolCHX1T6^O3~Q-T2ffciFcFp2w2$CR2H zVe5Hm1F$;k!WkI_zftX z+k$!5J1rR=JJb0l``^E~1^Iqv@(FqFU(xBeU9u;bmbOgDX{Oaj@4~d!=v|mL!MxY; zS_jLVfg7E%J>9O;4}HW|?;*VyFjZ2NYNysvl{%EPNyR2E#W}ZX0L?M@R#sysseIqXYgU zVn}A4H9%kLH4T(gI(pR1qz%O7Q3y0}`6V8aYem3f5()%0gsS%_<2_Woc(tA|^VK0;3Zvu|Nl9Bek(Rt{|S69fzNNn z=ITF*&u_uz;=we;yf*6+$Hp>vheTuA9w9VLGE(p&GhB3XZUyUW8D=-%xiMosrgfDw z!6Uai<7e&IEjEO1u_5%+$t$|ynCpyV-t~&<4dR&PAeDp{@Mse-1aPc0V$esV^zmi! zWkXl=*(yrU!rLDXXE*CgccJMB{ehknRK&H!e!!kHR6uOUs|G*{_8Yy1xzWKP%KFQ% z+*Q5lKXm2(v*>@V)rCNVspaThyktl8&d|qS7_e&AU%6nc-ly{9#9#83xBoE>U=W7Mf zUw8G`H0&a%{oK{lgWlVm@j>!a$uU*$mDS)->0TY5dzXJF{`SgU@wb%^#NRGQk*M6# z`{Qq~AnXs*8WY~-ck=yd-Nwh1syZ0`a7`r<)L*UkD}Gz2a3JXa;+oym27iyCPJiaL zuCsBKf9SQx2wb?xz2n8|OGruJXsTAL#?5W&9)I!8y&Yk$ksb3dy7^Dhxd;x#h&$l9J`ZidgL`%L*);^i?29loPSeb0aKj(&B& z-*sm|b`*JYxIUo%b$85!6y#i~&;C46ATS=g77m5zKo>WA6WO%~a>_ zq}D>)|9$S--#Pyl+s1~wE>Y{&eE2&Z4w^r0*xhYp)g#|WvO9cV^P}Oj73$jOyAx2? znor!jz`@(K-+M~6tz{=LE0y&!ZV?km@LxsDs4RQn=SqFw|KxhF_yguZ#OstE^lxAP zkb21f%=hmm#=Sqdr}HltviRmi*u4-ZUp+X@`O6Tx*Xh6S!5-bkcK^!{_NpKHYahJl ztwnmxMGu{$TCctXHHW6fy!jIz{;gW+XE)4uUcABgHk^vO?%1%#x#~*)y2s}FSN~{V z=ZS0ZxYwG>BReVQl5hC$f7I)^O?pspGhFk6PV#4ik$0s|#WVLJ|=imEyhx1LH((>a^tB3v1|M=+3bv^Xl)%bA~)8 zCa~yJwPfNOE#3a{KdGok{EL3_C-ta*?oTIC_}HgSKb>wK*DQGIaSB`hXI<(xf5y)y zI`>@TFMM{Uf6mX!mVs-3HotEDHK^Rnx(O_R_};d1>asuoSVkyX^k4W^hqLM; zqZz@ATUE3F#LxFttNgZK95RZop$uvoj8e(BOMg&IvGr;rC_2jYtlYJR9V4^fRm0@4 zX}{yST|nc5o|~Xn`)c!a|H|i%v~;O^{zK|20CxdE_x0B2=R?k3e14o-9h6&Dr@#NN zoBZxy3egX}w#7g2mv_T(CSO=w)w13|$FoIMaF+03EQn`Eo23vDL!*&sul#OYs@^6y zJaURHC0zgE7j{$MG`Rb7HyZiEB^egyGFz> z_?K*L27#~NI)iCXZaoO{J?W1VB5^q5k4HH_Tn=8$W~uCdTnZO^<$shR*=zqJQ1`4k z&HwPo*uNNR7^PpjO9TX!)}Tt1jrF_hi5 zu$H!{meR|Hk6T9aak!LLKg+7Shqu(JE=N5O)Hf=3%nz2M32szw^RPWO(VKW^cwwU& zlTzOZKG;Rf{@b4G%-VKB-#oJr~t_ zJ>_Y2j{;ZtdS{??-|*Mk6vk}l1>Ya54pQF>O6}^0(|>;ha`J;TlihZXCL6KIz)Q?b z{DE*H)@Ts>;|;^AL+#IaIXJLW?WXP@zMxYrPO688ADf`YDCaLX1e+(SiO#v-xN;IO zdmxxNN!^9q!%t08Co1*BU{P6}?X37la9>$Xa)!P!{CrvcQK@@_Cnn?T%Ik(t?owqn zQlU$~G4y=N(DO?-v1hxD4qZml+r0nhmCQdr%zqbRr-a+?c7dqXl z-$@;w9EHUugT>EGt#6~%-u=?*oUqjqrWk_UY^5jC^r#1W0_C?J*=WhfS4(lAAnb)! zkQ5<-J5BBGeC6igNdAId7+|yvubigdufViFPgh4d>QBMpGt}qQqrsCi)UaAReBn%$ zS0kgl($7t|pB?^opE^lcF9VF;+3E;&PjJC(byPm=TJYLzbpWc`eHZm5NBu4M{v35r z-l#$8<>36eYJR;L5Ec>7m7WeBnX4wN9}K@XSFLu`v%}ZzhVN_>@9`Ho9l=)?V1MEH zw**alV3tEHLvwKC9%?U0%2j))$COEH8?Nr9k}Q7SBK1CJW{8eK-7G_m3ILX_gB+CZ z9sWzd@}rL3u#fr#Xp~;8#wQyeWfc*7g1-G!rDsI_QL=6iW5PFd>@fUq`>Cla{|joO zvk04JW*)3MhacKsT`$dnC+)%D0cxL!fWwa;py2p4!$u`OcaS=1~$Jrxb7&G z4L%S8W5`o(?6=Zf=7;!HW?HKe>g(z?X0h@ ztCI)~d_)~>6Hvu2I;@|^ttGLzKIh#dm4489=9-}TQQ)OrLGY80s&Nps*FFl_y&%}_ zW9s|{J+eu<^ckfGgU3Fmo^>8NH@Nh0)ya52-W$PyVP{bHFY0jkl4Jix-2$Hy)E%V` zgM~fjDD3O_^)g%LOyp=jTCGs(&S2#+>cD6=AcuKO#Ac<^9YOIEYEC=>-`|pHg5X1+ zP_t0*{7KU1jL2Vz8VIgEOFgRA4}bAkb(}+~fr=gP zA9~)W)uY4T{WQK_qSgn$7*Mm-%R$45>Z;;KEzO*s3GO;k{Q${lousA*t4>mrtB;4G zeq(%=hnb^d|G1}p-`T)%`IBc;O6nZR>wVfar;}cLyIoO?{^LUoq&+C7}Ga7(g)m z?-)R;d?Nzrr)!i-2jvsh_~71?)mg>AN9nL(M2Wf&5MPVlTI4yW{iCR+pVhpOK zBgp)#`YHPU^M6$fgYSGseO^D`iyx#M9$ffY0S$akm8*jds?l!z-i&RssV=lCh7L2| zsY)8B;*yn&S2%#X9lTp{h721pvRI|j$CNOj*HA3da$h2rm-IFk4aGVwH*aB$DGtS4 zb^%bVlbKK3VsC|HxD_i-Txa0NveHYqlD`>87?R#P>yv7+ z6)k<9Ew-YyL5`h;3vxK!9!??`z3!6+D%g3}&57-_cR$)dZ!x8GB2uD8xEx}zmkD!w zph9NT?LiZnYA@JqJUnr0l9L^n@uxz5pe z<)Q(4&or#a3aa0Rf#fPx_OfoQ1b_N1K*PkEa&X2TJ;8}VBS*b@swR&H<>c|#eq zyohNsbj+}7t=Y%|A}6Xi$eMKVFxOejUr-vkxS+e)u0u8g&@FpB>p&))*)n^w1que2 z0L7uLI1~)VXDd9M+6tkR99hFi%R;jihbrNygkL}9a5 znx=3cKX)!|#f}3A6PEWqo;=gsEszzT!!aTX(X|w!a$^-#L8q|nHilf+(4vc-V&quS z#bIaAC&lHRx)3?A$(|tQnzm~XC8fxCY;Ys1NkWK@6%Y+TEmnLqpmbCuT^fSw>`pwX zj&igg>H~xDHE_2$7s~>R9C%%7iSjbkOR89?jx}1C4bJ(y(^0L}uTiRn{!;MO|5CfK zfDvk!674d|RkhWR&?`%v(RvkWT#O#vPhj+_AQ)@C;@UK?t|8tR%%KSJd?i>F&oO z8H|%QL2}?rOib5++b|b9L6FuB-O-k6XN*zwQy(luPtv8BC$J@fFW7j>7ks2a_IN-o zr8K^VgU^+UQp-?fL3cWh7wfSMAzjRao_{1Bj_+epY}7ONme4-?)d$+{(B&4#g~ zH8#<1Uwb~M3c+QcQxj)j>O}qwb`3^}C%D3sy%Z4#Q`E2|=pB=D!Qh9IE!FwfH#uJ2 zNpMYdutQvZh2OyBHf5kLbQ=Ylg)Gc4N8$y|X*{L9rC6xWxcr(0%hB&#iuH8yJ2e%E zL&=#6gnhfr=LY8*he8{Gg+jOyHY4sMEl;Q&yQ5DU2tItanizca9917&dbY~o%3N^` zbhR1w_@&$N5Wn3Hb~1 z(Ch;l&0ij1!-N#KBy6WB{l5$~h&?t(_aud}IX5?j6p>JYChhG|1vN-HY@o$d7W@}C zm8|6MM>d*9bL*2TuSXOIAcQs+Yy{E#oi2H zuf?xU??T2~AAsnu7E4goEe6gxYI0gENU-ZUYLEBlRJ{#A2YCvxt0n-=N(&NxX2evW zwwSg;??k-zgQ#u`HlL?Dn$H4NB`ZO+5T%QQx}~Zc(f^#KY6iCW5sa|H$Xvn5I(|jg zq0E$DXE{cM5*gTbD|KuNTq}4(BslF)2)R`tn`02{V@4iYCtC_zo$=KOZ)*su!%mw> zoiYeCsW{RXUr7|iCpQ=8TJVcVX(f3kmZfvpAp9#T-#l2c^ka-9^w>SBtzZ9@)~{wa~J?7J|QApq5kzlVR*`{nYhI zm9^^NhQl#v5jM}KK{)J8!URSgz7Iw-h%uMhuA^-sra@$pm2Q{GJcvKavyq}%3JFeg z!_MK8=Fp-@^|PZ4hV?_D`l111r(rBmRX)+-w;req(b8v%UZ!{PI^UWiFdg(P^JK9m?P_E z_ODm0v6=wl;?2+%oa=)$gP$VZq<1;tWuDsNqO zduHqYq#iYEbAy;L7NTlckh)NnGBifHfxx{)we&-PJzOk;hT4+u+9i$zu~iq5pFlB)YXFoZ!59=W*a#>`f(DAW!L<2&S+~Xx-Nh&pWy6u4 z?Jv17ir$>UI1}!Z|f?1E_{FW-MWh<>^TR0f(6pPBC zU|Tp8tkhu)tu5t!8QhIROW7K;lr7p)*75S5`+2meHD)Q>XesYYVz~+aP-q%j$|_7{ zt2LDr08pS94l1q0z(U)hr3RtrZQ->T8iZcAy3Mx7bV=0vQh1x7cqxboDA^F@sv;ZM zIL58FFk0Ycsd-77P&~r$9s%ZHH4kEEFXE7Qh+Kpe(xIz%Ff1jH;7$G_5fI{{slGnE zrK3Tv+c<$@)9ALwTR)32x7hl_@B@A`dbIUN;|HexSTspGj#9Hg zU8tJ>5jyr!NR<#*w~W8M5eRw~IS=$9hOBlTKonWw^ab^QGR|E)!Wr=!IiCymy;M!B zLIBK=PPopwx@c5q1R(@rU}t0{1g#U(BR=0SSr6@utq5VD1j-^`YzPP;W|RhJY_b8Z zL&{?rU&>gOXPd@~D}m`9JL*7swl@LkmO>Zw(xJ47O8a;_INd|OR>d_B4HRvuqU*x&&3)Z+13gLh*FrdusT?ed&rsf)%n}Y`3uQe zU`}lQIUG6FT4R=LG85BvQZr zbu5BSU(ep+AhTV9ed8Xy+s%QXLP#VxJ^Zn&)m_QzecXNQ;s0=1yJm~0_n4#ufwxG1 zPSP=uev9J=-ml|L*S`I5d^(A! zFjY#aWDV&b0?O?_h4qy^F-bY3{p^$`*hFl~Ba2Q!-FLMme#G0hH=@!T+x?MAmS%O*(k zZ8^+I)VXE2*hWKxS8qo5mMdqGTrA@j?A}k5xmcA8{aBMRIR{CaL+Aj zQZJp2rS$(rj4Z_%S=tUG0UOCkfWj%}e;6aVCPpRwzk-pFQ7TWc?we|-YP9AjS9=(# ziUxWzvnx(m`#*f?8^%aWie2*S#5-&{dk3kNNJMU{c<_6WF|DqUmBWw=Z-+o~Fm^s# zm%)8YXOv+V@P;5wESg)ofU?OINNjbI0>;2mS+$J{111txLa&&TG7>V>*7>zQOMoQG zP6ZMqPIIx;r6-V%=ge@obJ$$xBou-&u@1zVTFF*0NcW(WIt@*BJBcz)Fx5_}-?Q zp5*cKoHy|3-KqwxXhDcpXtZJeQ3$eiBYsIO`~?e2R}oPjjmz*TIRi>uU`zgt5~n^; z-spcQHb$O8TM;HezH`A7!)h!XGTMa{pBCb5X3hThVnpXTT8wzjSR_VPYT*2h9I^Xv zAx3t=FZ2l8m7jMdI3Ob_|IZg3TvSZbA4LhGul)xJPB80s)mlA-`mKeEqfQ#9($$nK zDv{>LR_t{VL&c~CVFjrup%)62E@R%s+%ue#ssChxv#_u++Tbxx2+LaE?;yWkbj$3H z?qzilLs3J&4UbCK7(LWD=vt!a0n!t^dAn+_l0`A4xR#|fq;wshxd4+A^NgK42;NFj z#Qrv$9lcl9p!^Qv^*4}Sg~5Ewfc@fk6|fHxUBuG0gMy2(T{|3BcsJI(-FM$$f0Ss? z|C19#b_SsM^ten)!f*A3WHoIjXDhh%47t`}LF?$#gX@P>TX4t}?AScz4mG0{^WI*I zn0~Idbq&mcq0a?(+yRRqcWA-E;c%Hg`wK>s+OQd%(#EWLxd?t`c~b`{CxcA{%LBYG zlLK$eIAdP`N3?YqR$`nfcTpAGI$12?4`!6H?}oYam~Q3J*YFNkXw?PpyHho{V166B z*s-&G5Cc~43%s-_8=P{d+V5YuhKKz-)qU%+ii3J^Bp4NCF^C0@kn4aHu3+1ba*N0+ zzd8=ax8NK~iY&>YQ;73ha5EuSGij5SvF&YVdB61nd8HSDE z6S{@$;A!crRbf=bAHx=KW&6x9kzB|U6TpRxk#}@942vu|`kY1V;L;q8XUQ7QRPe3u zs4>-26wgAK>%np@g5kmiRA{?f*eGAIc$SU@kt#hLhJe9yDBwGH*P>A?IFC>EA z$Y1Ia%NP+PMK-1|v~&Fg!c17Bcc_HZPv^&^TXfe*yq#PkSr zjWT*+ROy&CaQwoZ>S>BpLO`fr~T$S&+&m{4FEUtSugHx!lShdtXb1BRBLM? zOp2CGQEsLPMKx({2{wUi$)Iv=^!{tPZ>(X#EcC@zI{D zujd`7w(EG%G`18I&KZ=tMb5jOr!cpT&288kSi*;KWzqo%B(O=ZCy^^RYY5Ot;F1Z< zQk8LT%OI10KJ+BqGPdxcKe!_i{uCUNT&+46dWBpON${l|hVae2*fYf|*pJ3fD_6Bz z`kfEf7lFNZ-`m7Gk4gHdP^W4qJiX^6!#kavw6V_R96X10tc<^vzD8S{U_1d4KdmC> z15Zn|8Tlepix?xgP1;{E*XOkhi}A{i?5F}VvXkgYY#I$jvsdA8Qvb%O*q;*k- z=Am<8iQt7{>`WNqjZ((2X)9->VF#uJvBNpF)`V6@3<#_tjf$}zS^)$-ng%#hyX0Uc zj`wpJ?G#yq#MW8~2=aStBs5Q~nW*XjfKnJ@Z4naF0FqkM5HoZ%Bn*m7ng6-bsBXt< z2#rFk5!n!0jnIa?M@EA}NGtb_twwSXiUbFUou-zDczAbK1NzTKX*H_GY#1XEGaFbr z8(}tJPhd7`tcI~aBdrEL5V0J*p}knfUwn#TkiW1dn3$-ii{Az578)0BaDXlca+BnQakDSBi>3{*MvLQ7a!M@N@ zj~Q!5d{V?*jD}6^W~a*4!R6moWuD*~{;s+N(?hbeMeiQMWq64)2QP&rEDy&befU9a zl*Rf0?&vSt1q$>DgY(`*ACJw}@tSnpMuUSAWn4n+76-~%Mm_QW-MWTUQl%1PJAIL@ zw~C5o%Mz}`j%xRC@3jnLP!pNhSH{(pob9!O%y##iD)kJyDI!J1UIHshYx044FeMHtbsITp7W0 zI9V1r2A|lWtLd5}qp%WM#I|c(>57eXjP8nzDddwnd8A{^m(9(D1)E@bF-x;cKuHeiS^`p=2Xx}f+y9MP)_rhZR-W=fd9 zufox@M7$LaBrEtFNs41uAQY_so;tfSBI|shZ1UklRbjs7;I#YIz>e#c%e+jzm7x59 zI${Tv%T553St@S~zW0DS2RyC|_FM;>$cGc`!xi>n{W>)fo!q=m?a~BV?+>}F_tX;f z5~J~;YdzL>FwUsM^ZVDUt}4GFi(9L}Cq0_Rz4+MF9392LtJlr#P}~Y93~~{SVl-+r z2lU0Y)1a=k2i*I}S!ZxU#sj?SOFL&5`$}!}uLDsWEqir6rXnE9RuSuXhjmd`#!Ejb z+N>YH3Dbmk`&B>|Q@QrcGB8ercXW+PE&W2r9;N5Z?|S{~CRX*k7r1KG(%`)Bt7#2S zrd8gqX>N9cd%us1;~^ICgxDmFAB1i?Xa*2YFasbQU!1q+O%s?ASNFZ4`hI>#}_hnw62~rsbJfP2g&_l2T zPirwPqv!4s;9z_lF0r8=wh@LHe22c-!zkkVFxD$U*>ae#ui8Ke=21ZcL{Gvv2o_Yf zH{zE=D$z9=;=<%$-~w+2!w9S(czKzp*A?g=!5$B(sRblU&eBhVlOIxZ$8UDbrisR4=|S4KXz#$~!2=Jek2;q+LFW(E z*9v6}-@&&WZVLRt57ncDU-qz?%-=N+tGR7B4M1Z88E=M1DAbL|l#h4u@S6{-FDmE$ zWbnlwsew*x{J>SNycR#hFM{Cy^Ck2nSl9|ukEo9@-^U+Orw2cM1c%+%2RlEi_9E=W zN7Xqj3k7A_0?X!E7T4CJ?3Is6(czCirbKJu% zaR1Y45{}^i@@e()JsuUKj$LcHiX)pyAjLV%1>y&@gw{!lY*%of-!g~DV@YE+HdP1b zKBEq+2S_HN(*oN3jG9$N1m%!a*z2Oz+|v`$nQ|JgTUUcJ__mHtc9Gy_qsSB> z1Z{EzEdEzfHCe^xMpj2>CW0k%hqV`6`nbyNulE*0S)s#@XuIPk=B=qK*t zGkPyT7y~MJR}2`u@VM&SmBTr1*>kxYA>1>iVbDr3DmvEJFb)TT7w06Kr->CYNoI&} z7AjlDfL9I$v0q7uP{)CZ;jqvfd zF?{3f?xyffx+;xsj$j4~|~kgcF! zARomCfu*-vvh!ZbwIcV5*Sp`Bge?U3xf32tVPt?k^B@X0NaI5q3<VOdv1i!I}q*h!xn&0?1V4yHTLTR8Y=9Ad|3mo zp~7W&8@o=1GXugv3aODdhti7aTRRsS3Y{dNovPi^8j7Bzpe?)iRVPSWs0+>6O|sIQ z%P9vdk=VzmyP*+)am|!25i8;JCMcUp_$9rO-w0wlIPyvLe-?o;P%sL*D^qQ_uU_JZ zq}xENh;8{=1Q2CWIx=n}ei-$_qEaS;KRl^+=C_*3l5oZpv7*eF;#YRSC1C7`AZfEa z8O-^K+NFwJ%g|&=RxUQ)b8nq&Km=EbPy!K!WlH#N*b%-PMwoY=h191UB_D_u4v?wO zKtSlo+{qcJo(+MFY)JG9siBcDZ385}Fj)6fHGUUC6TR0bc3phI0=pbEaXNp>*h`BXs8vj z?j9)ph|B~Jf$@;4V6yB`81w|T5x@w`aEoe=ed*qK4sck(0G6GovEF^cEr$n+n7?3B zyRkfk$JIy`b-^#yWi5WGF08-})<3J7C-M;j8_DbD1SyN{-h$|VJgXKE|Cv8mJF5-B zkw3>e;s)iGjM+@MW5V6s$#5IFi15)e2u7O{MpY0PGrpy9F%cTV1Z)BSDel>@i%LS=HOgvz^8E3xU zP-R>JAk7Bf`vq<^+Y~(g3mk0dG-#9DkSfgmu>rn8?AoLY^45Ya#L*kl{g2vedl=#rPAm_4bcAsaZNgN$h0<|&jIKviv!qPH`RM}?hj5sWzj^^)L%vi7+ zknmFSutlhq5-ple0SZ-J!)Y!<2^7YzbucGSDMIW>!jB0FPo+ZQ=3xEv@Cy_=`2-~q zM_&9z{iUB;4a72tU;>eQ%BhSYQj#Ba8e)#I#Ei?T4%$#?t&Z8W1WV*iYA-$m^^8Sj zZMZDV%ex8W=2%!Pa=e09o6I(=J3nCv3KbpqUe)ErF1pJEZ$F})(Yj-MX> z#c$M~>;=CldNhJm{2Y%feg6GrH3OFdjoE@*(e4b6-lBMi;qbq0;q7GK2u}W;S`b~N zJAB9Q)T44o(-&S*C#su*-@T%$*`;#R=hMMyuYy@mt_rsP1^Wdae^u@3Y+4m0UsM0; zJiIFS{A;Sx{3v%`@>(@q--?yH-o)dphVOU{7wDIcsub!DCj2)pb2{_CRof@tX8(qrjU0VB z*7t#BxactATA{nMDs3bGje(oRMG-k|&SYCDK7IqELi5JRk8TJ@q3{>CH4Sl&K-iB6 z=GKgt<<0~-2_TugLHns30GCT}fsu3#P-;R_>1I}?>-KU7!Yy#R5CHxRWxQ8qgKJi2 zFneR+7v;OIwH9Ou(_*W6-jRvi85=zIS2(+&jK))gO+%OkjJCq2_(?lR&=5Wj#dKXa z5C>n4t3x_X;BquEl=re`K1hcBLYyHu_{NLdV_#dFyz}>D0WnQbzZC8+B`4L2aRSsUS$rH+Riyk7j9YH=RS2Y>#Xs#I^3={Phpl#dL#mTO33jf}F5TXdN2 zZOof7bicw<{s?Uhwa-`&_9syssf!mhrIOWY+?o`g8y(8UKeRgtMM*>$1dsn+jm>rs zh(28LtmE>dQd&8*j!>@k|KQs?Z~=c4(Oz4{^N!^N6&lxufR^pHw7ivS-fC)I#>qPr zhJfgjdY8m3J>>uap6e_}7H$oYtgJlY+1)c3m=cP8@|ob?H`RVs=Iu!iCc#{(juE60 zq*z|)24W+MJJYegrW-*K&;S zxfmuQD6&sAR)bGOHD&1mLuVw73$S`5m2G;2Qf9wYu@%$PRA~w1Pu~N9@-)j zM<|4uDGa4)h@Q2E2%HHnR`?R!^VaMnjoEp@njQ34;z4qk9v)j~mD5R@_q(>Gm=N%6 zHQ5t9aiX(V@P5ZBOv4x#WakMhilF8dA_BeT1xer&7$%Z){b9*Aehg|k%(pAEVd0V* zGJsR4oU!yED}%Ts(NT0?K`UWeJ^Ft&m77jK0V%lQZmmKK- z&n@Tw^cyQz+`YTjnIwq7uhrS!3h8xhXSf!0;)~qxj9XYGOk=Q3e`Hu@HBOiVDccUq zDs<_gih(>c!Goc4(c1mL(r0(7DT)4`3bs#}Z?1T&=t6O~};ybBUJh_6eI^g|=xL%%d4?(?3C z8>x|g%6lWW@wTnFygkiLwVWRb=S7w?Sac6IQDPz%B{E*v3RmQmt|5+igIZ~m4WIi4 zzCld~zm4DAMhvqx4O<}NPyAgPT$XiqcelwT?p91<{MwppBtjCm((i9g2fxiaUUqA` zl3Ue37|hB!A8AH|AYi!wJQB%8I@dKhXX->IL}nXC3%5kP53(RJ?5n}Aa?TW73X{t_ zADAE?VsLrUg_cn*6^KLNkL94q&p8Wngfyj;pH#`=@5!a}b!KcTO>;g948bO8XOXkWMfk`&rg%FDkT%3b zSYpF;Y>5S8oCIR8$X`9rQYmO;zz2|Uu9HWS=5TOt(dj*O5LcSzWUy*@$w`wz-p4>2 zMbSvfbQo$w^9F&^x57?=V4Oq3q!E4xozi2$ZgtKni^$-}9eU4xnMS#xgbx}FQq$a$ zZ=_IXlsC5gpv>HXRxj5%yX+i^+_q5U(r$qS<9uBj+`|bQjtx*^-+HHKzdwg|0X~4r zEu28-T@#>Vpa6O01Rv=WWtV&=ssu-Z;dCVF0maP zsUn`ip$*P~YHe_BgY!ZB{IS95n}*%^pn%1yW>B>??Y&Hw4(BBuI-t>+2(AVvHag=t zBE`MXtqXBc%j>{i;}6|qPqdV7MJR?lu~|EXflG6eEiGz}eBI9L>EO9Wr>vF*e{Xc! zpJz?}KFsj%jiZ{|IVFfD{evJOVI_q-VjUN3xYF zT$2?kbCT{zT>twK(fX-V_}f_~7hT=Mk)cE^c!?PBtuSa}MBS!_#d}KW8R7 z#v-gkEx6M92$`ukAKxH4q#dUv@*Pe?@SCwtY1&9%GGZ(Q@!iBBd+F!r28#|;Mb~KucXc{l>aO6~PGOll6t&$v4Tk1pN3HI)my_PC9sgqH`B#bo@!q0qWbsFHCZ>j(T$V<+AfzRUJVKe9%ZH zx8BwK?{EArhFR97X8XrF(@P+SNAwq=&a*|g~vE)60n4psl!r7$pXUo}O+6 z6%^2r7tNqC#>5SSTJ9ofT;mcYlej|ExEpanR1{E5UVibtr+MZ@pPGFCQ`J2ipyv1G z`%Er9eX6>aQ>V^WRi~c7xftmnX^jW?smi>G>} z2GdQtjSW7|Vml-6Sr*&3&&JrD`LM;V)BYlkvq2kjWcC#QYXg*?iY;Y?s2Ux!!!=+YFiu(&}u=dN!vjz6QOj}=h@<2A2%}|#fV2uc|OR6Cs)b$8j z4T6{@{b&c`AbD}epv+Fm)eA@%kzD@)gy7_4>hsFPgV~96U&$qhvN@28|9L3evwZhj z&ivLxc)?C_E^80eOTEJ@!1vGK8 zW=o>*AXQLpOmpt*8&co8j2bhcTGRQp)H0CvVZ&uw=YM50K5W22bG6NVyrm)c#r1Eg zt#WY6?Wy>XzXRJX85Y>(KilSNlnt*R#h%c1tou~% zpUxI(&X+X&C=Yuwl&wNb?&H|h(S2!y)%6Y3sBW0S9s=CN@|_v%r&vS!!wj%Z ziN`=okpgA7`1LU?p9tDs-(o$D62|`)n+mCQClagzja%^rFoKk_$b;_Wdqd~i+;1%1;Ea-S-?&#`R7cB3iX#+>^1EL@$?C7m-NfT z7HB;qQCnZBd~pKnt${=H+3a2IRq@_z*3hc+^yMPN zJx%S`6Ca1Q&<5pSHz4(@<0wY23}xybQEWslR?^YxnR-{-TFsLfJw zuhx=a;LXb_hn~r>WSHn9n@?wx>t@uLGuTz=!oz3OcOm)smCApe0kKQp(n42dpG8ed z^I{f&=!TrhM%9Qe`S_{IA!jnPq2gXboW;(o)n4iOE^A}jpTwTuV{5g|mDLwA+&BW^ zPdAQK9y^=8*=MBeJG^Y91!3PyZRM^7*E@;_&u8*lRLu7w;veU;pX{mb>|}*CNmQ-v zII*fUCszLmdj4NllKmj>;)7YzUCCd-R%+TubSKVu(dR;T$?jD$+&*WoT|8BJ^g?z5 zqY|kL?2=t87hJ?P^#-Ske#WjU_aKO^bY2jD$iPsf&G)sfWq@Em3S1M(rU=S|jW+Vc zg6cUz2oY5`rL<0I&q@YGQbZN-vbJg+1i;p&_y9Ck3S}0UzqLv!ORBa5S>=Gni9-^q zN^-Jf96qg}$BU9+s!&k~JdOOv2r@t(7K&CLm#>1SNEr6Ou)^jz!p8*4HG&{epQw15 zWefq}jjI9>2Odt1%0tW9oZi~sD#Nd3ztsA@r%<2TQdxf;dx5hx=PrNfhc{{WiWd*j zhKV6XsN8SfBPVWGb$ub3xSQ?~KQ6LAiIInChY&Gil+~3qgQWuBYPpr zR@G`kl&u>!GH?0j^nv2bU$O~9J_X|BP_z`+)y~oIhGvom1{@ApR&4%Q_pG5_uDe&6V)=rT& z4%-%5=fR8r+>5Wif60vxNiRNaw z_;@DhRo2y8WRJxv%nc8+zPq9Lacq|Kywb)xFn>rI<;VHNY@fEf~T&nE1_VHoRj4F(?X)sHN@|n^(g-`VkgT;wej& zCJS*g7lxpYk!_H6xB8kkImqteli0V^IW`fsKt=u5g_(t4Tm-owoopb0Ms$oO9-)?H zT9ls@V_T1rW#W!sv7O5^>$X4C3i*mpVQEvP_+PxXg!m9W=sY~K5(zboV@aW!2_8!9 zfj}6#amdxV3tEI-K**2q&_ui2^z4p{ci1y|8YCHj?G81{Q)?LojTQqaq9>}_F6sy) zwQgf&@M{XzRKXn%jR{)aOFX)o4aT`)Y*N7)f&xE-f_2b&CPqG601l?!f&*Z~EIJP- zcy%U&=utf}PeL3`<&7~FHO^&99mh5!Y|OkVTc2C~>JMMqScxYyMMSmP<}!WvshR~c zYjr|zK)kypg=FVOQ;n?+HP&t1*uWujk~*>D8yXebNgFrN*v+yz8*x-ZRf>!Twtr@l zfOYt838WexOEnzjA|Fe#!i7`r8H74UAxp*d->`wx&xY^2N&#(kb7CfrtkB{^ZEVzB z25)TpiXmDie*GIZuB_Hmv972T`YA0q9X!30JSkggiUMi02^zwO6+V;zb&N;?K9K-S z@i+%(W!omcUtT+N2B2j*gju+!Y%mISC(w^qJ5wXuoVvr}*q4HetHr!N4LB zYkLEN+b}ZQMQ{==MQRq?aE-GbX5;o=)(1i>^;^|A$v~mEV5OQ^qdJczn@_q6Z4FWA z<%DlA;(Kqvq(qI$MPhFWUDM(y2M zEGst49352vvg1exr4q(uE40)`ve~c{*^3w){xN)g&Suwtqbm)aAEF3BHOh)K9ntH&Kz@mQ+hv{i9mHI@=p zZyVAbGHx5HZQl8WP%a2h!^KTcvE6q2C-7VTe}`Y%K!`4rY289*F^G`pBIdFZl$v*( zf~lho5(cA0W>Yo@Kr{>CM)+3`lr)+!S-_$He-0GZn&d#Oe45qAnU&-#2?X+~ddiH) zr_At_$H;iyDYMPh?Gw@wOMI4?1x^bVUZc%NO63C94g?f$#1ExqLovJv!x`;}gAg#A z1Q$l7y3S9+2VtrxJDGL=q}rqSn4<00g*{+sb1;AjtxGil`X9}(1LnvA1EOVqh^H48yZHCGc&OUW8zA)g5U27Oyf zeFzX<7fTk-jXaJU^*slSkM4}ss+ElkdT^t z3Y*4~-D0HukcmJR8*xuM?@p!DAyVQKWGQT=ry5U+Nc->dmHa9c#Fpg>S0^E9CDC07 zbP;6&6NHc}V(g&+j9+pZUMzc_4eX8417ep?>pvJYL<1$&HBhGF4Y6)5=PRl8NN7~o zGD^=N89Jxh#CRvwKSy%7wt{Gm4C@-r(X^=197HtHT$`l1ZAh+aV@nDH$yHf=LUL82 zRNR0x`Wne0XkbeZXl~-y5gRt!paGya8nb$OBlDb&%r&B09fhi+H+4>B8xkphBN_oM zNE&I2X#^n>B#i+7Uri%lOCnwMlSD-=)di(q&BA4rvjz*fzY3j7|(> zRNY|C-Ab;urnoZMl+IhunL+En(E^Qr2I8jMv+TS zln(eZu!pNp?Hl|~xHB4Gc=F+;RE~V`S7eAoV zXj0*|x-b$a-x4RQ)a%!%%yHg&URwC1q1Z1Pa$d2v{=4Sx+(*VsxiF@>n7_5*)0TA-mwnrfp|W>jvY(SQLnJEWq5gr(-Y4I z<6la1NX=?RerHQS#`sTtI?lGa5o=^9w}P>lS74K_D$Y5m0A zX|&y6xe-m;)*CIWvg>-Vohv2e{#KHNl6$NH29(o&`IZgcM*zd56K49Jo%)^RCcU;@ zMQ$dlW~!;ai+QiH|N%1qvl~dMBM` zXhv!!OCt(r;1gjca5(A`$hy`!3 z-un?I8Wj})fX!xCDSFf3o}kcPVEy93H`ut;GI+vebD)w-Bj>|6*qG^(6suR5LV3g) zP~1F_sX7K=N#lcWzDywe4LD^>%0@f}iXAC~M^@alBv4=aziLUqls<5n_ygjnS!TUAr#~2xypia1J%_QjLoz zaS-x^G4X86)Cliiuy#N)W3QHsD7=N;vV{q3Od0k7t?AUQ5)g?daz(bD$oCts5`f;o zBBZYdc%UO%a#AhT;P|aNY-W)+>DgmlUP}*qj<7~qAQCd~no8%KQ?u_`i zx7m1c``c`;wnC&gvYvj=tLcqE*Zbi0pz3Q9FeM3>(n1ra7H_|HCZE11~(nNZtqwAW^-IGwzV>AFaBKHu%~1mI?~s!&a0ATj{|k7r^Nmq z?-}|a)-q(&@#^lzCkc{zxbl6EkH98UarMFcz+Km?RuokBL8vI%r@2uUAR!fPDt|^3 z2h3&1h|iv21H{Bb`Rn4GdF)#8!XerK@o*2=>xeAD1+jEM`i z_#_POj80uEau96Vv*LsdH~W6j&im3yE1_liWbyY2ysh*Y$8J~PU6&3GI?}2l@!(Ep zUR`yeRG6K8Av9lZghHAiI%eUS8WeA9;x|YjtYBn%iRoG1RpwPLt#+n>5UDZ>+QY%w zV_B2zQh{Hw?mAipMH5;9t;(uozY1mvInk05;{7q?%OS=NQ-BEec;y9BtX^GVC@p6K zfSotSY8r>>lN49D9ovShJ7OqkPTi)BU*oNhINauWQ8xI=jI?$xzYU0xiZzCj8 z^rWN6&ZUl)A@}Jgw%)YuD}O6if zd52JZAly#I(J6Eb8q%-h8%(GdSUHg~IpR*Blf6AP4XeE%TqrJz(@G6ppuRVDpo5ea zd0T~8XY!#|+_tz;vVmxd3n4BYX0ipN`xiWQwf2f~%GJEB*7P}P?PC*%rXJ+X@W%53O<)8xe$YEQtps{alX z34yy%KEr*LxL%T2v^u>;SFA(HQ6r1cisLLkVobln57Z4HM7|i=z8tY9so)j8)o1uX zoNV!l;yXIuT|92_rz_7M!jGrB7{?sOuLW0oWCB0D<5EV`fBVyvj21aXaas>pth3Fz zw9Sdo)J9j(p^DT*APN!53m41KiZq~rVJh|DxHx_x1>KQDc1#A#wDDY`Y(N#h7MJY_ zUjt$kN{@qzQMhSOegcI<+-D*Wx{-u1r7h5>K!IT6GK%3ZC-VI%$A3@c=S|qAq3{jF zx2V^*OSYwQ%Ow6SO+0oOzZ4Ahh{O3p28O!kNd6ma7F$03#;(exNAbROdoC+CP2;x{ z_ohTK>uCPx8uPA9o56<>Lq6pgemaWVcnrTTevQPt$MUOtJx8)gY`Rt(TDjsl{hi_9mhp>|VsV3aByc$7g~v7ZTPEyP5LjyuF7 zV|o9PS8KFGvK50mZ;TvXL^+h#{DRK=i9e3zWA`F%jv^2{5iQR2{)N0&Gwv9zOi*uC z|A_G)uCh+0tYYdoKBkO5qDZ)*@GoW}{@nlt_@`3gK_prluY)^>6;ePT+;9|27%0IL zGK~61?T;r$D}{a#%wBPVyI_oyJ5i^OPw(1vM9_j_JG(#hrr+gHXZH z_BsT501gHa{REZEZ>q~QO;`TOX~0f)*fQGpbu}Y;0fnJ)l4}#=Eh9_;pb$M(5OhsI zaMZC1xlckatbOc#97soj+L_S>hTqdU1 zDJL{GwbE_!lA~d2qkNZ|O6ZUi7i%~K-JQEV{Z%eG0pvu8k=>iP6@}>r`ylB{L5$H$ zx>Wj72B-|PoZwlC;XQ}}$W}q+i7&LlG{to54;&As-2(CCS|J8a;J1po-{$LgTH6a3 zT*QnXA+C=&p6@+gY2DazNy>xTsK8@o8yga723CRMvJ?1_vJQ6h=N+<1WfgE53C+&8B*JUfhr|x%`vShwg!A*w1R`k zd~i7;-V}mC(pUJ0BJ-)08`)14!w%QpNEMCL=Fu>0DBvNujttMw3l!lxQPeQVTn4!2 zvGpMVN_$ZrEdmg8h6zPX8MvQIeAvY+hJ9~5C<-U72+M9_yT_p|E)O%T(DbA}|m_jlc*KionPM%K(dbpd1y3 zvkdu8RFt9GVj_wo4EIxDNvEURh_=Sao9*x;lTa3v@5H{6WLqOC&{N`UkSLxCBMy|* zr-_mf$3!*fD`*L$Brn~QqmUtDqAh!EN}~s*$nMC-R*8!GR}GKO3)sYlbVb^dRz8#f zOwvhed6*YIX`(OUC5Ho7SOO%(f{3Q!(O2}F&5eVItU*LlS`hA%RbTig)IFpiU(zjr=XMHI5kUQ9;vdrD6s$LyTu67a` zr`CziJK1bi;sQL-=u_3(a1q|cj#0md2-AvjWJkKt208@>`h+Q=T!o)%NyVgJ*4A?X%{FH}1#-n(p&#y(pqPT0hD zVdt(A=WW9HKQ3aELHhn%*i@Xg zp1Fmcqyg`1-ebcw_UDyib+t3%RJ6_*_s4)Djxcn{hhk@&|h#aaC=?*ufMQ%AVGZo-)xJvrt;1w zICrkSD-QS{Ops0D7yrYuWp&<`6xU3jnm>?6ABJ-clAH_gUCpB)Y3x{xy@*Zc!Urbj z&A;+oco}X{+I~Z))>HD-dMYy@IXg^YfRj>Ee^B^LPOG7H1CxC5Iby^_NZJw~BPI*G z2CVMrE3{X)EsBkQV+K2Kl}LRG9R74wl|0(!QAmu7S5>@E5f)y1r}ErqYJA;AdV**h9VC&i963_%^vm=<1@Ecfh{EUW+c7z_OIC?TK4)$` z+lGjpzF^DQ)vLs+FEIEkR#l$y@t+AZ{RnCi@dm+d6hzB`N)mZB3%G%z%zc%GFnmV)!1&*Z* zQ)#;3bOLx6;p$vMUN!tCY)8HZ?4LAs{Oit3JucFH`IkFBfGo!K*+s^(h+Dl{=)a1#nD3*BL(k;-t{rB-?M(jG@RqMD^zO6xAv-Q(?;r7w z%C6r9fmXEd@oSh^e>R`A!|ava&*ArKJ4zldKK}vVdDu5-P)Fs~GVf%qixw|fC`SK) zPZEch`R+R^cZ5JI2Ud>$5#LP{*ImH#Ur|K`h_um{AL4RM9BjGv`}|n(r}Mv}OJexh zd^88j#olN0sXK1M?PtUByW|4CORv3x1*K5Dbpe09{Gr~yIepZi76j+Sf2}PoQ}HnI zr{V96!7VMj;MojcfqX*&J{`{jleVWqu#ru$2{&LHH zcp(%gW0asO!N`eyT3XtWemnj!3e|ik13ne+A^r$+2}+yc|ACJQLkawS{3eX5cZ~nm z81OVQ?p94`Y56pU-w!zTFe%`(7=B$7{PP%o4&Xc2<^LjvF9pT*;CBX3WNA4C|D;iW zwP5N7wd^}cNY%kH3nhG?rh>265JjH@>6z&QO-z~dn)%P~AOP8f@XUFtqKB8Gq5 zw}mXuYC+Qg$5d}gD%u-_LEmj|SM&cqJPFmw{9lH5>Tv>3_{CA3!2bv&6gt%WoQB^t z1minfTE^7DXU6c0kdH8yfk@ZZ^Fo{$WIt3l;eso!VC52 zMtndFGx3&Gc3hmPxw1hqd@1tRH@Zh$aw(rwz7=2^&7_!tG5I8{We_lX7}AI1kC2u0 zu^GNM7#QVC;78&&^>JswX?`T|qht7oDAxcks|hpWgtbT*U-!Y>7=AP0nL7Bq7@jnA z4JsmJ(nwN6_lL}(-%IiA!84)jRQ#^!AGG``I4M<_$f2X~^+3E|4EVu#CI!EV-}R%M zz>^AphmX*sYX0T;O&C}LIAJ5ne?<)64e+Chmn8`+U1z-S|xvzlN6Ub?|#* zIPnw8pD@YfJz*s}(ut0L$<$CJ@2l}%CKi#P@Vm%JD4dKxLg6QPr?E>zf)ggr!5{S~ zp@HW7#8Igs`=H=m@O%Q_5p5+JzzZl8bG2nftfE}bF#aO}NIpz>Qj*~|B*C1jesB+d z69#%v5jAXoJTX^V4o0iw497c_m%taq@Rp7~r_P;!%G~)UarVOGmNj>2t@HiULalNa z(>|!^m-9X>6-2&i>Y*MuPRYvpmNHL^R{hA`C=I5f*_yuhKe)p;$gZJ_7lhDmtJvJG2zjjWzC++r>a#Ih^+NmD}8LJ>w-v;!lrM@4VM*xAP)Y5Av~ zx*$;hnhO@3mUT|{9U~v*qLS_4|B;#ZM*dPm&TLK;Zsl;_-N-w{va5JM5nTzz{YO{w z87V#Vt)l7pCC3f3ww)9IekH>92H7ag=Ch`oFGgA2%ZRtG=Bvf;ujKtwQItdRfnhtY zX_OpOn1YwO9Mkgkyzg73tl@`|>GkBqf}8lxgL8gpXM<3;Lo0H#LDrj?b!}%CF?~7Q zyjCglbB>VJR|8q2oXg?ZbEyoukYA=br~6&ScV*YWXPs3co5b8ck#xm?k5yh+E1wND{+ z#ml_6c=2_700Lm(6!%{ZyS&wQ|;oz%Y<$Xl=jr`IsN4KoN%IiL6iXXaxXV0o@ z(k1WkJ-bRqSju5+UDGTPGCk*bv2GQ%tQ~n1-zi(6>!DSJVy9l{7LOv}qR& z%e8egaD&MidqeZ=V_B@>{qo9$mrP(t%k7-J`D?V-SPUzDcC=t2_&}J~-K?IsecuH6 z3L)$d+xiA-c2R9F5Isl_HbhjAhG1o#p>rEBQZs7-} zbEaiu!n+tmOLy$RJ48;}bQGXnB_}j&Bj;jTdxt7ix)_$IXc>7U)Wf{xdWR|YvU4*} z0DH-s`r+ph+jC8tJ%icY1!BLS^YQdN`{#VONsg7Zbq7-%45MTgbKVgH7M{6i@$6!F z(%kv8&z%3=x${d$_LU&8)uV`2O&O3g@O3LkYJV(`dZ5SVBd4%{Q1zp;G#iRHgHhBFX88_ug=`}J z5SXAQzvP{!3I}tt1H0%4;6`8^t~Xy5UW9}#f?pVR9+F-+y#)$x_`q1vH$sEh6L`t# zsvO%kECUKeQoLKjoCNE+%mV8Bhu!C&lBdxt|WK z$c*gB)pd+O)-t@saaUctgz>MWY?dhq&}j9jy$!vsC^N?JGJt%XCWM zy>7|-u2}bT%ts&k2RMAmFZzxjh29dC-GzpPenF0BO()9bz3-{)fdyqkcU?1^gN7D) z|E97VV9`$G=F$F~6$W|l`zm|M3~b9WiaE>h^=!^NTV*enih08hqmolHa*(m!IjZp> z7)Twx7)4pv&FeYu2P%IKIv8XwW-$~cs2N^a=I;tk7XyM0plpzC)V0ct48aR%D?0uJ7t46N13IK*2$4k?n_QJtT*n3%nmo z_|OoFtBDy3%?rZP)V&L}(~0pJV)PZ*a611{J|UHdrUTNmz~c2%G0KU%ALD;XTTa%6 zbj{kBNLj}*yq}7D9^)US9Sn?xY3vt+pcIxY?;^2wE&pVAF6WpbYKSlev%aHy7i&Le zsLC)b@$vJ#OH5k>_2=cs_{CzuZ~5M0#aiA!O%xqr@`Ob*8#xeVmr!AU9R{VFl!I(G z8|8BO$h-9G%j%9G{AspAX!@lH%ED#Z0ZLhU`B~I_$x}Q%$T>L*45$*ikM_H^5r*C} zEmqH}xx@`m@~#y0yrQjVqiimMlnq?5=1G2Vw`2P-5+Ix-BL{`D?xk= zwhaTCUC9F0{ZbYzXSsG%W5!GhqD?mfD})|b(sjcTk3Plo>3rVx^I6OSa8TU|EbmJ3 z_*TAL{KppPFgk|ChJ@A8e%mgY-c^)%nRt9N->F-N0ux{!kl+YPrMxG!8RDgP_~gOn zN#SDBHy{NA3!*fuBcD+c4?PWW5Hau>o=^D^y5Kr6PlC`2U0ck4mS5K$ zK%(Saqf~@g1Gmq4H)ywrwOjc`;^nt_zcgxx*oGDiB`s%%hIgZENXmqn6Tmuv7|Mb&O{od?w z$>N1`=P#NY+$LUnkuU23y}HmxN~JJ_)fffd?OJEJBn-}692a{B6+1QUnz~(#bi)Gk z3f*Gl-6`IBiO(GxxIhQAGAQ;r7ktyZOFIVRP-lz`6PNy;cTBNLHW;cI6pc~@Ejsk> z)^>{K&admhFSPz=;kD#r$z*o0;LQ1p@6p<-kVW^3jlbs?q+xbiIz&)FQq(X_?>_P3 z2mHhl;gY$F7B2#QIffa*P_rY)3S5wrcfUpo?MN6DBgMFNJe78!vy{NpTpwm;E-<}c zQV}P0!zK+Zuy!cfAX3-#9?(uuD({!;csC3?3@{8Y*noy_LhwGQ%@+4x%SXtPPke;ju}VMW3q(w$NS!L+)r?lrGqN`__@6Vf+ah;Ycvy!R_@PEv@OhKlRMbi<#Sg}rNf z6&n7T$`Hx=5Zabr@&mh+)nPvVTD-K8Uy_a-x2VHfE@H}=#jN4|hCcGs#Q;pxhrR*j zBA*Xk?;-KrYw#z4*h=8FIVkT?_M{*vK6CRVNIL6;3RIA@k@GYYLdCbIXqCe4KI zoCVu6fa$K2=8Cqh(RQq)!@gLn9p6Y*!*_u`CW&M=H1Kc<23`kwl6C=CNd$e(@O~?v z*uWR1i486Ae812{}j8Q1g5jCMm2=C@{9;Jt^VcC>Q2i-ZWu3Ln|=6r?g38 z?H?dL_TI$X(;}+hUfy$5{mDZD=qu0?gB)z-k`;Q-Z~yzQEM&h9gCF`iv>%wKFQ_5uiXgaQnuKl+ z#s{o%??p|T$=wclKj5o@4UmU}!th>7I`-&h%qCKSfrmUg22YG{c)u5$HuH149ViW< z1IJI!2m^H5dpY^+k6Z9rF>)bupa`2f^k*%wyMEO15-VLn7F$L4w#B@Y9@0H}+ z!#}{c(mn#S3Sr;)P*%NH#S8E7gS&#P0hXY{Vn91|O#RnX7r>@raY2COing1DMD$)) z5^M6?LV)+|5g;FvMKgyD}963e^bL=hcJ4zJG$ptUQaIs9-{M8>J@NP-__%JUd?v&llyet)K{52+*K{>;cKRdl=+?nDKo1aM gB@28c^tNjIspP^R`S1bIazSVzIBOB=zG-{^2Om1oumAu6 diff --git a/substrate/primitives/src/bft.rs b/substrate/primitives/src/bft.rs deleted file mode 100644 index 43f8903aae3b3..0000000000000 --- a/substrate/primitives/src/bft.rs +++ /dev/null @@ -1,308 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Message formats for the BFT consensus layer. - -use block::{Block, HeaderHash}; -use codec::{Slicable, Input}; -use rstd::vec::Vec; -use ::{AuthorityId, Signature}; - -#[derive(Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -#[repr(i8)] -enum ActionKind { - Propose = 1, - ProposeHeader = 2, - Prepare = 3, - Commit = 4, - AdvanceRound = 5, -} - -/// Actions which can be taken during the BFT process. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum Action { - /// Proposal of a block candidate. - Propose(u32, Block), - /// Proposal header of a block candidate. Accompanies any proposal, - /// but is used for misbehavior reporting since blocks themselves are big. - ProposeHeader(u32, HeaderHash), - /// Preparation to commit for a candidate. - Prepare(u32, HeaderHash), - /// Vote to commit to a candidate. - Commit(u32, HeaderHash), - /// Vote to advance round after inactive primary. - AdvanceRound(u32), -} - -impl Slicable for Action { - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Action::Propose(ref round, ref block) => { - v.push(ActionKind::Propose as u8); - round.using_encoded(|s| v.extend(s)); - block.using_encoded(|s| v.extend(s)); - } - Action::ProposeHeader(ref round, ref hash) => { - v.push(ActionKind::ProposeHeader as u8); - round.using_encoded(|s| v.extend(s)); - hash.using_encoded(|s| v.extend(s)); - } - Action::Prepare(ref round, ref hash) => { - v.push(ActionKind::Prepare as u8); - round.using_encoded(|s| v.extend(s)); - hash.using_encoded(|s| v.extend(s)); - } - Action::Commit(ref round, ref hash) => { - v.push(ActionKind::Commit as u8); - round.using_encoded(|s| v.extend(s)); - hash.using_encoded(|s| v.extend(s)); - } - Action::AdvanceRound(ref round) => { - v.push(ActionKind::AdvanceRound as u8); - round.using_encoded(|s| v.extend(s)); - } - } - - v - } - - fn decode(value: &mut I) -> Option { - match i8::decode(value) { - Some(x) if x == ActionKind::Propose as i8 => { - let (round, block) = try_opt!(Slicable::decode(value)); - Some(Action::Propose(round, block)) - } - Some(x) if x == ActionKind::ProposeHeader as i8 => { - let (round, hash) = try_opt!(Slicable::decode(value)); - - Some(Action::ProposeHeader(round, hash)) - } - Some(x) if x == ActionKind::Prepare as i8 => { - let (round, hash) = try_opt!(Slicable::decode(value)); - - Some(Action::Prepare(round, hash)) - } - Some(x) if x == ActionKind::Commit as i8 => { - let (round, hash) = try_opt!(Slicable::decode(value)); - - Some(Action::Commit(round, hash)) - } - Some(x) if x == ActionKind::AdvanceRound as i8 => { - Slicable::decode(value).map(Action::AdvanceRound) - } - _ => None, - } - } -} - -/// Messages exchanged between participants in the BFT consensus. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct Message { - /// The parent header hash this action is relative to. - pub parent: HeaderHash, - /// The action being broadcasted. - pub action: Action, -} - -impl Slicable for Message { - fn encode(&self) -> Vec { - let mut v = self.parent.encode(); - self.action.using_encoded(|s| v.extend(s)); - v - } - - fn decode(value: &mut I) -> Option { - Some(Message { - parent: try_opt!(Slicable::decode(value)), - action: try_opt!(Slicable::decode(value)), - }) - } -} - -/// Justification of a block. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct Justification { - /// The round consensus was reached in. - pub round_number: u32, - /// The hash of the header justified. - pub hash: HeaderHash, - /// The signatures and signers of the hash. - pub signatures: Vec<(::AuthorityId, ::Signature)> -} - -impl Slicable for Justification { - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - self.round_number.using_encoded(|s| v.extend(s)); - self.hash.using_encoded(|s| v.extend(s)); - self.signatures.using_encoded(|s| v.extend(s)); - - v - } - - fn decode(value: &mut I) -> Option { - Some(Justification { - round_number: try_opt!(Slicable::decode(value)), - hash: try_opt!(Slicable::decode(value)), - signatures: try_opt!(Slicable::decode(value)), - }) - } -} - -// single-byte code to represent misbehavior kind. -#[repr(i8)] -enum MisbehaviorCode { - /// BFT: double prepare. - BftDoublePrepare = 0x11, - /// BFT: double commit. - BftDoubleCommit = 0x12, -} - -impl MisbehaviorCode { - fn from_i8(x: i8) -> Option { - match x { - 0x11 => Some(MisbehaviorCode::BftDoublePrepare), - 0x12 => Some(MisbehaviorCode::BftDoubleCommit), - _ => None, - } - } -} - -/// Misbehavior kinds. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub enum MisbehaviorKind { - /// BFT: double prepare. - BftDoublePrepare(u32, (HeaderHash, Signature), (HeaderHash, Signature)), - /// BFT: double commit. - BftDoubleCommit(u32, (HeaderHash, Signature), (HeaderHash, Signature)), -} - -/// A report of misbehavior by an authority. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct MisbehaviorReport { - /// The parent hash of the block where the misbehavior occurred. - pub parent_hash: HeaderHash, - /// The parent number of the block where the misbehavior occurred. - pub parent_number: ::block::Number, - /// The authority who misbehavior. - pub target: AuthorityId, - /// The misbehavior kind. - pub misbehavior: MisbehaviorKind, -} - -impl Slicable for MisbehaviorReport { - fn encode(&self) -> Vec { - let mut v = Vec::new(); - self.parent_hash.using_encoded(|s| v.extend(s)); - self.parent_number.using_encoded(|s| v.extend(s)); - self.target.using_encoded(|s| v.extend(s)); - - match self.misbehavior { - MisbehaviorKind::BftDoublePrepare(ref round, (ref h_a, ref s_a), (ref h_b, ref s_b)) => { - (MisbehaviorCode::BftDoublePrepare as i8).using_encoded(|s| v.extend(s)); - round.using_encoded(|s| v.extend(s)); - h_a.using_encoded(|s| v.extend(s)); - s_a.using_encoded(|s| v.extend(s)); - h_b.using_encoded(|s| v.extend(s)); - s_b.using_encoded(|s| v.extend(s)); - } - MisbehaviorKind::BftDoubleCommit(ref round, (ref h_a, ref s_a), (ref h_b, ref s_b)) => { - (MisbehaviorCode::BftDoubleCommit as i8).using_encoded(|s| v.extend(s)); - round.using_encoded(|s| v.extend(s)); - h_a.using_encoded(|s| v.extend(s)); - s_a.using_encoded(|s| v.extend(s)); - h_b.using_encoded(|s| v.extend(s)); - s_b.using_encoded(|s| v.extend(s)); - } - } - - v - } - - fn decode(input: &mut I) -> Option { - let parent_hash = HeaderHash::decode(input)?; - let parent_number = ::block::Number::decode(input)?; - let target = AuthorityId::decode(input)?; - - let misbehavior = match i8::decode(input).and_then(MisbehaviorCode::from_i8)? { - MisbehaviorCode::BftDoublePrepare => { - MisbehaviorKind::BftDoublePrepare( - u32::decode(input)?, - (HeaderHash::decode(input)?, Signature::decode(input)?), - (HeaderHash::decode(input)?, Signature::decode(input)?), - ) - } - MisbehaviorCode::BftDoubleCommit => { - MisbehaviorKind::BftDoubleCommit( - u32::decode(input)?, - (HeaderHash::decode(input)?, Signature::decode(input)?), - (HeaderHash::decode(input)?, Signature::decode(input)?), - ) - } - }; - - Some(MisbehaviorReport { - parent_hash, - parent_number, - target, - misbehavior, - }) - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn misbehavior_report_roundtrip() { - let report = MisbehaviorReport { - parent_hash: [0; 32].into(), - parent_number: 999, - target: [1; 32].into(), - misbehavior: MisbehaviorKind::BftDoubleCommit( - 511, - ([2; 32].into(), [3; 64].into()), - ([4; 32].into(), [5; 64].into()), - ), - }; - - let encoded = report.encode(); - assert_eq!(MisbehaviorReport::decode(&mut &encoded[..]).unwrap(), report); - - let report = MisbehaviorReport { - parent_hash: [0; 32].into(), - parent_number: 999, - target: [1; 32].into(), - misbehavior: MisbehaviorKind::BftDoublePrepare( - 511, - ([2; 32].into(), [3; 64].into()), - ([4; 32].into(), [5; 64].into()), - ), - }; - - let encoded = report.encode(); - assert_eq!(MisbehaviorReport::decode(&mut &encoded[..]).unwrap(), report); - } -} diff --git a/substrate/primitives/src/block.rs b/substrate/primitives/src/block.rs deleted file mode 100644 index 0a60e0dff798c..0000000000000 --- a/substrate/primitives/src/block.rs +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Block and header type definitions. - -use rstd::fmt; -use rstd::vec::Vec; -#[cfg(feature = "std")] -use bytes; -use Hash; -use codec::{Input, Slicable}; - -/// Used to refer to a block number. -pub type Number = u64; - -/// Hash used to refer to a block hash. -pub type HeaderHash = Hash; - -/// Hash used to refer to an extrinsic. -pub type ExtrinsicHash = Hash; - -/// Simple generic extrinsic type. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Extrinsic(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -impl Slicable for Extrinsic { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Extrinsic) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } -} - -/// Execution log (event) -#[derive(PartialEq, Eq, Clone, Default)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -impl Slicable for Log { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Log) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } -} - -/// The digest of a block, useful for light-clients. -#[derive(Clone, Default, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Digest { - /// All logs that have happened in the block. - pub logs: Vec, -} - -impl Slicable for Digest { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(|logs| Digest { logs }) - } - - fn using_encoded R>(&self, f: F) -> R { - self.logs.using_encoded(f) - } -} - -/// Generic types to be specialised later. -pub mod generic { - use super::{Header, Slicable, Input, Vec}; - - /// A Block - this is generic for later specialisation in particular runtimes. - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct Block { - /// The block header. - pub header: Header, - /// All relay-chain transactions. - pub transactions: Vec, - } - - impl Slicable for Block where Vec: Slicable { - fn decode(input: &mut I) -> Option { - Some(Block { - header: Slicable::decode(input)?, - transactions: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v: Vec = Vec::new(); - v.extend(self.header.encode()); - v.extend(self.transactions.encode()); - v - } - } -} - -/// The body of a block is just a bunch of extrinsics. -pub type Body = Vec; -/// The header and body of a concrete, but unspecialised, block. Used by substrate to represent a -/// block some fields of which the runtime alone knows how to interpret (e.g. the transactions). -pub type Block = generic::Block; - -/// A substrate chain block header. -// TODO: split out into light-client-specific fields and runtime-specific fields. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header { - /// Block parent's hash. - pub parent_hash: HeaderHash, - /// Block number. - pub number: Number, - /// State root after this transition. - pub state_root: Hash, - /// The root of the trie that represents this block's transactions, indexed by a 32-byte integer. - pub extrinsics_root: Hash, - // TODO... -// /// The root of the trie that represents the receipts from this block's transactions -// pub receipts_root: Hash, - /// The digest of activity on the block. - pub digest: Digest, -} - -impl Header { - /// Create a new instance with default fields except `number`, which is given as an argument. - pub fn from_block_number(number: Number) -> Self { - Header { - parent_hash: Default::default(), - number, - state_root: Default::default(), - extrinsics_root: Default::default(), - digest: Default::default(), - } - } -} - -impl Slicable for Header { - fn decode(input: &mut I) -> Option { - Some(Header { - parent_hash: Slicable::decode(input)?, - number: Slicable::decode(input)?, - state_root: Slicable::decode(input)?, - extrinsics_root: Slicable::decode(input)?, - digest: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - self.parent_hash.using_encoded(|s| v.extend(s)); - self.number.using_encoded(|s| v.extend(s)); - self.state_root.using_encoded(|s| v.extend(s)); - self.extrinsics_root.using_encoded(|s| v.extend(s)); - self.digest.using_encoded(|s| v.extend(s)); - - v - } -} - -/// Block indentification. -#[derive(Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum Id { - /// Identify by block header hash. - Hash(HeaderHash), - /// Identify by block number. - Number(Number), -} - -impl fmt::Display for Id { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - match *self { - Id::Hash(h) => h.fmt(f), - Id::Number(n) => n.fmt(f), - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use codec::Slicable; - use substrate_serializer as ser; - - #[test] - fn test_header_encoding() { - let header = Header { - parent_hash: 5.into(), - number: 67, - state_root: 3.into(), - extrinsics_root: 6.into(), - digest: Digest { logs: vec![Log(vec![1]), Log(vec![2])] }, - }; - - assert_eq!(header.encode(), vec![ - // parent_hash - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - // number - 67, 0, 0, 0, 0, 0, 0, 0, - // state_root - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - // extrinsics_root - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - // digest (length, log1, log2) - 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 2 - ]); - } - - #[test] - fn test_header_serialization() { - let header = Header { - parent_hash: 5.into(), - number: 67, - state_root: 3.into(), - extrinsics_root: 6.into(), - digest: Digest { logs: vec![Log(vec![1])] }, - }; - - assert_eq!(ser::to_string_pretty(&header), r#"{ - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000005", - "number": 67, - "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000003", - "extrinsicsRoot": "0x0000000000000000000000000000000000000000000000000000000000000006", - "digest": { - "logs": [ - "0x01" - ] - } -}"#); - - let v = header.encode(); - assert_eq!(Header::decode(&mut &v[..]).unwrap(), header); - } - - #[test] - fn test_block_encoding() { - let block = Block { - header: Header::from_block_number(12), - transactions: vec![Extrinsic(vec!(4))], - }; - - assert_eq!(block.encode(), vec![ - // parent_hash - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - // number - 12, 0, 0, 0, 0, 0, 0, 0, - // state_root - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - // extrinsics_root - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - // digest - 0, 0, 0, 0, - // transactions (length, tx...) - 1, 0, 0, 0, 1, 0, 0, 0, 4 - ]); - } -} diff --git a/substrate/primitives/src/lib.rs b/substrate/primitives/src/lib.rs index 5f6d14f3d16c6..68306b01e80c0 100644 --- a/substrate/primitives/src/lib.rs +++ b/substrate/primitives/src/lib.rs @@ -54,17 +54,6 @@ extern crate substrate_serializer; #[macro_use] extern crate pretty_assertions; -// TODO: factor out to separate crate. -#[macro_export] -macro_rules! try_opt { - ($e: expr) => { - match $e { - Some(x) => x, - None => return None, - } - } -} - #[macro_export] macro_rules! map { ($( $name:expr => $value:expr ),*) => ( @@ -82,8 +71,6 @@ pub use hashing::{blake2_256, twox_128, twox_256}; #[cfg(feature = "std")] pub mod hexdisplay; -pub mod bft; -pub mod block; pub mod hash; pub mod sandbox; pub mod storage; @@ -92,12 +79,8 @@ pub mod uint; #[cfg(test)] mod tests; -pub use self::hash::{H160, H256}; +pub use self::hash::{H160, H256, H512}; pub use self::uint::{U256, U512}; -pub use block::{Block, Header, Digest}; - -/// General hash type. -pub type Hash = H256; /// An identifier for an authority in the consensus algorithm. The same as ed25519::Public. pub type AuthorityId = [u8; 32]; diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 65e70481ed688..81d20e13bbf48 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -295,13 +295,6 @@ pub trait Digest { fn push(&mut self, item: Self::Item); } -impl Digest for substrate_primitives::Digest { - type Item = substrate_primitives::block::Log; - fn push(&mut self, item: Self::Item) { - self.logs.push(item); - } -} - /// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, /// a `Hash` and a `Digest`. It provides access to an `extrinsics_root`, `state_root` and /// `parent_hash`, as well as a `digest` and a block `number`. @@ -329,33 +322,6 @@ pub trait Header: Sized + Send + Sync + Slicable + MaybeSerializeDebug { } } -impl Header for substrate_primitives::Header { - type Number = substrate_primitives::block::Number; - type Hash = substrate_primitives::block::HeaderHash; - type Hashing = BlakeTwo256; - type Digest = substrate_primitives::block::Digest; - fn number(&self) -> &Self::Number { &self.number } - fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } - fn state_root(&self) -> &Self::Hash { &self.state_root } - fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } - fn digest(&self) -> &Self::Digest { &self.digest } - fn new( - number: Self::Number, - extrinsics_root: Self::Hash, - state_root: Self::Hash, - parent_hash: Self::Hash, - digest: Self::Digest - ) -> Self { - substrate_primitives::Header { - number: number, - extrinsics_root: extrinsics_root, - state_root: state_root, - parent_hash: parent_hash, - digest: digest, - } - } -} - /// Something which fulfills the abstract idea of a Substrate block. It has types for an /// `Extrinsic` piece of information as well as a `Header`. /// @@ -372,23 +338,6 @@ pub trait Block: Sized + Send + Sync + Slicable + MaybeSerializeDebug { } } -impl Block for substrate_primitives::Block { - type Extrinsic = substrate_primitives::block::Extrinsic; - type Header = substrate_primitives::Header; - fn header(&self) -> &Self::Header { - &self.header - } - fn extrinsics(&self) -> &[Self::Extrinsic] { - &self.transactions[..] - } - fn deconstruct(self) -> (Self::Header, Vec) { - (self.header, self.transactions) - } - fn new(header: Self::Header, extrinsics: Vec) -> Self { - substrate_primitives::Block { header, transactions: extrinsics } - } -} - /// A "checkable" piece of information, used by the standard Substrate Executive in order to /// check the validity of a piece of extrinsic information, usually by verifying the signature. pub trait Checkable: Sized + Send + Sync { From d268ca0138a9638a99cebf539d73294397646ea1 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Fri, 25 May 2018 17:51:15 +0200 Subject: [PATCH 17/60] port substrate-bft to use generic substrate types --- substrate/bft/src/error.rs | 6 +- substrate/bft/src/lib.rs | 312 +++++++++++--------- substrate/client/src/client.rs | 11 +- substrate/runtime/primitives/src/bft.rs | 14 +- substrate/runtime/primitives/src/generic.rs | 2 + substrate/runtime/primitives/src/testing.rs | 2 + substrate/runtime/primitives/src/traits.rs | 6 +- 7 files changed, 194 insertions(+), 159 deletions(-) diff --git a/substrate/bft/src/error.rs b/substrate/bft/src/error.rs index 22baeece09b00..c18528a3f1e09 100644 --- a/substrate/bft/src/error.rs +++ b/substrate/bft/src/error.rs @@ -18,10 +18,10 @@ error_chain! { errors { - /// Missing state at block with given Id. - StateUnavailable(b: ::primitives::block::Id) { + /// Missing state at block with given descriptor. + StateUnavailable(b: String) { description("State missing at given block."), - display("State unavailable at block {:?}", b), + display("State unavailable at block {}", b), } /// I/O terminated unexpectedly diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index df2f3f9e1b6a2..72ab254dd488c 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -42,9 +42,9 @@ use std::sync::atomic::{AtomicBool, Ordering}; use codec::Slicable; use ed25519::LocalizedSignature; -use runtime_support::Hashable; -use primitives::bft::{Message as PrimitiveMessage, Action as PrimitiveAction, Justification as PrimitiveJustification}; -use primitives::block::{Block, Id as BlockId, Header, HeaderHash}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::{Block, Header}; +use runtime_primitives::bft::{Message as PrimitiveMessage, Action as PrimitiveAction, Justification as PrimitiveJustification}; use primitives::AuthorityId; use futures::{task, Async, Stream, Sink, Future, IntoFuture}; @@ -57,27 +57,27 @@ pub use error::{Error, ErrorKind}; /// Messages over the proposal. /// Each message carries an associated round number. -pub type Message = generic::Message; +pub type Message = generic::Message::Hash>; /// Localized message type. -pub type LocalizedMessage = generic::LocalizedMessage< - Block, - HeaderHash, +pub type LocalizedMessage = generic::LocalizedMessage< + B, + ::Hash, AuthorityId, LocalizedSignature >; /// Justification of some hash. -pub type Justification = generic::Justification; +pub type Justification = generic::Justification; /// Justification of a prepare message. -pub type PrepareJustification = generic::PrepareJustification; +pub type PrepareJustification = generic::PrepareJustification; /// Unchecked justification. -pub type UncheckedJustification = generic::UncheckedJustification; +pub type UncheckedJustification = generic::UncheckedJustification; -impl From for UncheckedJustification { - fn from(just: PrimitiveJustification) -> Self { +impl From> for UncheckedJustification { + fn from(just: PrimitiveJustification) -> Self { UncheckedJustification { round_number: just.round_number as usize, digest: just.hash, @@ -89,46 +89,46 @@ impl From for UncheckedJustification { } } -impl From for PrimitiveJustification { - fn from(just: UncheckedJustification) -> Self { +impl Into> for UncheckedJustification { + fn into(self) -> PrimitiveJustification { PrimitiveJustification { - round_number: just.round_number as u32, - hash: just.digest, - signatures: just.signatures.into_iter().map(|s| (s.signer.into(), s.signature)).collect(), + round_number: self.round_number as u32, + hash: self.digest, + signatures: self.signatures.into_iter().map(|s| (s.signer.into(), s.signature)).collect(), } } } /// Result of a committed round of BFT -pub type Committed = generic::Committed; +pub type Committed = generic::Committed::Hash, LocalizedSignature>; /// Communication between BFT participants. -pub type Communication = generic::Communication; +pub type Communication = generic::Communication::Hash, AuthorityId, LocalizedSignature>; /// Misbehavior observed from BFT participants. -pub type Misbehavior = generic::Misbehavior; +pub type Misbehavior = generic::Misbehavior; /// Proposer factory. Can be used to create a proposer instance. -pub trait ProposerFactory { +pub trait ProposerFactory { /// The proposer type this creates. - type Proposer: Proposer; + type Proposer: Proposer; /// Error which can occur upon creation. type Error: From; /// Initialize the proposal logic on top of a specific header. // TODO: provide state context explicitly? - fn init(&self, parent_header: &Header, authorities: &[AuthorityId], sign_with: Arc) -> Result; + fn init(&self, parent_header: &B::Header, authorities: &[AuthorityId], sign_with: Arc) -> Result; } /// Logic for a proposer. /// /// This will encapsulate creation and evaluation of proposals at a specific /// block. -pub trait Proposer { +pub trait Proposer { /// Error type which can occur when proposing or evaluating. type Error: From + From + 'static; - /// Future that resolves to a created proposal. - type Create: IntoFuture; + /// Future that resolves to a committed proposal. + type Create: IntoFuture; /// Future that resolves when a proposal is evaluated. type Evaluate: IntoFuture; @@ -136,10 +136,10 @@ pub trait Proposer { fn propose(&self) -> Self::Create; /// Evaluate proposal. True means valid. - fn evaluate(&self, proposal: &Block) -> Self::Evaluate; + fn evaluate(&self, proposal: &B) -> Self::Evaluate; /// Import witnessed misbehavior. - fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, Misbehavior)>); + fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, Misbehavior)>); /// Determine the proposer for a given round. This should be a deterministic function /// with consistent results across all authorities. @@ -147,33 +147,37 @@ pub trait Proposer { } /// Block import trait. -pub trait BlockImport { +pub trait BlockImport { /// Import a block alongside its corresponding justification. - fn import_block(&self, block: Block, justification: Justification); + fn import_block(&self, block: B, justification: Justification); } /// Trait for getting the authorities at a given block. -pub trait Authorities { +pub trait Authorities { /// Get the authorities at the given block. - fn authorities(&self, at: &BlockId) -> Result, Error>; + fn authorities(&self, at: &BlockId) -> Result, Error>; } /// Instance of BFT agreement. -struct BftInstance

{ +struct BftInstance { key: Arc, authorities: Vec, - parent_hash: HeaderHash, + parent_hash: B::Hash, timer: Timer, round_timeout_multiplier: u64, proposer: P, } -impl generic::Context for BftInstance

{ +impl> generic::Context for BftInstance + where + B: Clone + Eq, + B::Hash: ::std::hash::Hash, +{ type Error = P::Error; type AuthorityId = AuthorityId; - type Digest = HeaderHash; + type Digest = B::Hash; type Signature = LocalizedSignature; - type Candidate = Block; + type Candidate = B; type RoundTimeout = Box + Send>; type CreateProposal = ::Future; type EvaluateProposal = ::Future; @@ -186,11 +190,11 @@ impl generic::Context for BftInstance

{ self.proposer.propose().into_future() } - fn candidate_digest(&self, proposal: &Block) -> HeaderHash { - proposal.header.blake2_256().into() + fn candidate_digest(&self, proposal: &B) -> B::Hash { + proposal.hash() } - fn sign_local(&self, message: Message) -> LocalizedMessage { + fn sign_local(&self, message: Message) -> LocalizedMessage { sign_message(message, &*self.key, self.parent_hash.clone()) } @@ -198,7 +202,7 @@ impl generic::Context for BftInstance

{ self.proposer.round_proposer(round, &self.authorities[..]) } - fn proposal_valid(&self, proposal: &Block) -> Self::EvaluateProposal { + fn proposal_valid(&self, proposal: &B) -> Self::EvaluateProposal { self.proposer.evaluate(proposal).into_future() } @@ -218,23 +222,27 @@ impl generic::Context for BftInstance

{ /// A future that resolves either when canceled (witnessing a block from the network at same height) /// or when agreement completes. -pub struct BftFuture where - P: Proposer, - InStream: Stream, - OutSink: Sink, +pub struct BftFuture where + B: Block + Clone + Eq, + B::Hash: ::std::hash::Hash, + P: Proposer, + InStream: Stream, Error=P::Error>, + OutSink: Sink, SinkError=P::Error>, { - inner: generic::Agreement, InStream, OutSink>, + inner: generic::Agreement, InStream, OutSink>, cancel: Arc, send_task: Option>, import: Arc, } -impl Future for BftFuture where - P: Proposer, +impl Future for BftFuture where + B: Block + Clone + Eq, + B::Hash: ::std::hash::Hash, + P: Proposer, P::Error: ::std::fmt::Display, - I: BlockImport, - InStream: Stream, - OutSink: Sink, + I: BlockImport, + InStream: Stream, Error=P::Error>, + OutSink: Sink, SinkError=P::Error>, { type Item = (); type Error = (); @@ -259,7 +267,7 @@ impl Future for BftFuture wher // we will get the block from the network later. if let Some(justified_block) = committed.candidate { info!(target: "bft", "Importing block #{} ({}) directly from BFT consensus", - justified_block.header.number, HeaderHash::from(justified_block.header.blake2_256())); + justified_block.header().number(), justified_block.hash()); self.import.import_block(justified_block, committed.justification) } @@ -268,10 +276,12 @@ impl Future for BftFuture wher } } -impl Drop for BftFuture where - P: Proposer, - InStream: Stream, - OutSink: Sink, +impl Drop for BftFuture where + B: Block + Clone + Eq, + B::Hash: ::std::hash::Hash, + P: Proposer, + InStream: Stream, Error=P::Error>, + OutSink: Sink, SinkError=P::Error>, { fn drop(&mut self) { // TODO: have a trait member to pass misbehavior reports into. @@ -302,24 +312,26 @@ impl Drop for AgreementHandle { /// The BftService kicks off the agreement process on top of any blocks it /// is notified of. -pub struct BftService { +pub struct BftService { client: Arc, - live_agreement: Mutex>, + live_agreement: Mutex>, timer: Timer, round_timeout_multiplier: u64, key: Arc, // TODO: key changing over time. factory: P, } -impl BftService +impl BftService where - P: ProposerFactory, - ::Error: ::std::fmt::Display, - I: BlockImport + Authorities, + B: Block + Clone + Eq, + B::Hash: ::std::hash::Hash, + P: ProposerFactory, + >::Error: ::std::fmt::Display, + I: BlockImport + Authorities, { /// Create a new service instance. - pub fn new(client: Arc, key: Arc, factory: P) -> BftService { + pub fn new(client: Arc, key: Arc, factory: P) -> BftService { BftService { client: client, live_agreement: Mutex::new(None), @@ -341,17 +353,17 @@ impl BftService /// If the local signing key is an authority, this will begin the consensus process to build a /// block on top of it. If the executor fails to run the future, an error will be returned. /// Returns `None` if the agreement on the block with given parent is already in progress. - pub fn build_upon(&self, header: &Header, input: InStream, output: OutSink) - -> Result::Proposer, I, InStream, OutSink>>, P::Error> where - InStream: Stream::Proposer as Proposer>::Error>, - OutSink: Sink::Proposer as Proposer>::Error>, + pub fn build_upon(&self, header: &B::Header, input: InStream, output: OutSink) + -> Result>::Proposer, I, InStream, OutSink>>, P::Error> where + InStream: Stream, Error=<

>::Proposer as Proposer>::Error>, + OutSink: Sink, SinkError=<

>::Proposer as Proposer>::Error>, { - let hash = header.blake2_256().into(); - if self.live_agreement.lock().as_ref().map_or(false, |&(h, _)| h == hash) { + let hash = header.hash(); + if self.live_agreement.lock().as_ref().map_or(false, |&(ref h, _)| h == &hash) { return Ok(None); } - let authorities = self.client.authorities(&BlockId::Hash(hash))?; + let authorities = self.client.authorities(&BlockId::Hash(hash.clone()))?; let n = authorities.len(); let max_faulty = max_faulty_of(n); @@ -369,7 +381,7 @@ impl BftService let bft_instance = BftInstance { proposer, - parent_hash: hash, + parent_hash: hash.clone(), round_timeout_multiplier: self.round_timeout_multiplier, timer: self.timer.clone(), key: self.key.clone(), @@ -410,8 +422,8 @@ impl BftService } /// Get current agreement parent hash if any. - pub fn live_agreement(&self) -> Option { - self.live_agreement.lock().as_ref().map(|&(h, _)| h.clone()) + pub fn live_agreement(&self) -> Option { + self.live_agreement.lock().as_ref().map(|&(ref h, _)| h.clone()) } } @@ -428,8 +440,8 @@ pub fn bft_threshold(n: usize) -> usize { n - max_faulty_of(n) } -fn check_justification_signed_message(authorities: &[AuthorityId], message: &[u8], just: UncheckedJustification) - -> Result +fn check_justification_signed_message(authorities: &[AuthorityId], message: &[u8], just: UncheckedJustification) + -> Result, UncheckedJustification> { // TODO: return additional error information. just.check(authorities.len() - max_faulty_of(authorities.len()), |_, _, sig| { @@ -448,12 +460,12 @@ fn check_justification_signed_message(authorities: &[AuthorityId], message: &[u8 /// Provide all valid authorities. /// /// On failure, returns the justification back. -pub fn check_justification(authorities: &[AuthorityId], parent: HeaderHash, just: UncheckedJustification) - -> Result +pub fn check_justification(authorities: &[AuthorityId], parent: B::Hash, just: UncheckedJustification) + -> Result, UncheckedJustification> { - let message = Slicable::encode(&PrimitiveMessage { + let message = Slicable::encode(&PrimitiveMessage:: { parent, - action: PrimitiveAction::Commit(just.round_number as u32, just.digest), + action: PrimitiveAction::Commit(just.round_number as u32, just.digest.clone()), }); check_justification_signed_message(authorities, &message[..], just) @@ -463,12 +475,12 @@ pub fn check_justification(authorities: &[AuthorityId], parent: HeaderHash, just /// Provide all valid authorities. /// /// On failure, returns the justification back. -pub fn check_prepare_justification(authorities: &[AuthorityId], parent: HeaderHash, just: UncheckedJustification) - -> Result +pub fn check_prepare_justification(authorities: &[AuthorityId], parent: B::Hash, just: UncheckedJustification) + -> Result, UncheckedJustification> { - let message = Slicable::encode(&PrimitiveMessage { + let message = Slicable::encode(&PrimitiveMessage:: { parent, - action: PrimitiveAction::Prepare(just.round_number as u32, just.digest), + action: PrimitiveAction::Prepare(just.round_number as u32, just.digest.clone()), }); check_justification_signed_message(authorities, &message[..], just) @@ -476,10 +488,10 @@ pub fn check_prepare_justification(authorities: &[AuthorityId], parent: HeaderHa /// Check proposal message signatures and authority. /// Provide all valid authorities. -pub fn check_proposal( +pub fn check_proposal( authorities: &[AuthorityId], - parent_hash: &HeaderHash, - propose: &::generic::LocalizedProposal) + parent_hash: &B::Hash, + propose: &::generic::LocalizedProposal) -> Result<(), Error> { if !authorities.contains(&propose.sender) { @@ -488,16 +500,16 @@ pub fn check_proposal( let action_header = PrimitiveAction::ProposeHeader(propose.round_number as u32, propose.digest.clone()); let action_propose = PrimitiveAction::Propose(propose.round_number as u32, propose.proposal.clone()); - check_action(action_header, parent_hash, &propose.digest_signature)?; - check_action(action_propose, parent_hash, &propose.full_signature) + check_action::(action_header, parent_hash, &propose.digest_signature)?; + check_action::(action_propose, parent_hash, &propose.full_signature) } /// Check vote message signatures and authority. /// Provide all valid authorities. -pub fn check_vote( +pub fn check_vote( authorities: &[AuthorityId], - parent_hash: &HeaderHash, - vote: &::generic::LocalizedVote) + parent_hash: &B::Hash, + vote: &::generic::LocalizedVote) -> Result<(), Error> { if !authorities.contains(&vote.sender) { @@ -505,14 +517,14 @@ pub fn check_vote( } let action = match vote.vote { - ::generic::Vote::Prepare(r, h) => PrimitiveAction::Prepare(r as u32, h), - ::generic::Vote::Commit(r, h) => PrimitiveAction::Commit(r as u32, h), + ::generic::Vote::Prepare(r, ref h) => PrimitiveAction::Prepare(r as u32, h.clone()), + ::generic::Vote::Commit(r, ref h) => PrimitiveAction::Commit(r as u32, h.clone()), ::generic::Vote::AdvanceRound(r) => PrimitiveAction::AdvanceRound(r as u32), }; - check_action(action, parent_hash, &vote.signature) + check_action::(action, parent_hash, &vote.signature) } -fn check_action(action: PrimitiveAction, parent_hash: &HeaderHash, sig: &LocalizedSignature) -> Result<(), Error> { +fn check_action(action: PrimitiveAction, parent_hash: &B::Hash, sig: &LocalizedSignature) -> Result<(), Error> { let primitive = PrimitiveMessage { parent: parent_hash.clone(), action, @@ -527,12 +539,12 @@ fn check_action(action: PrimitiveAction, parent_hash: &HeaderHash, sig: &Localiz } /// Sign a BFT message with the given key. -pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: HeaderHash) -> LocalizedMessage { +pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: B::Hash) -> LocalizedMessage { let signer = key.public(); - let sign_action = |action| { - let primitive = PrimitiveMessage { - parent: parent_hash, + let sign_action = |action: PrimitiveAction| { + let primitive: PrimitiveMessage = PrimitiveMessage { + parent: parent_hash.clone(), action, }; @@ -545,7 +557,7 @@ pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: HeaderHa match message { ::generic::Message::Propose(r, proposal) => { - let header_hash: HeaderHash = proposal.header.blake2_256().into(); + let header_hash = proposal.hash(); let action_header = PrimitiveAction::ProposeHeader(r as u32, header_hash.clone()); let action_propose = PrimitiveAction::Propose(r as u32, proposal.clone()); @@ -560,8 +572,8 @@ pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: HeaderHa } ::generic::Message::Vote(vote) => { let action = match vote { - ::generic::Vote::Prepare(r, h) => PrimitiveAction::Prepare(r as u32, h), - ::generic::Vote::Commit(r, h) => PrimitiveAction::Commit(r as u32, h), + ::generic::Vote::Prepare(r, ref h) => PrimitiveAction::Prepare(r as u32, h.clone()), + ::generic::Vote::Commit(r, ref h) => PrimitiveAction::Commit(r as u32, h.clone()), ::generic::Vote::AdvanceRound(r) => PrimitiveAction::AdvanceRound(r as u32), }; @@ -578,7 +590,8 @@ pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: HeaderHa mod tests { use super::*; use std::collections::HashSet; - use primitives::block; + use runtime_primitives::testing::{Block as GenericTestBlock, Header as TestHeader}; + use primitives::H256; use self::tokio_core::reactor::{Core}; use self::keyring::Keyring; use futures::stream; @@ -587,19 +600,21 @@ mod tests { extern crate substrate_keyring as keyring; extern crate tokio_core; + type TestBlock = GenericTestBlock<()>; + struct FakeClient { authorities: Vec, - imported_heights: Mutex> + imported_heights: Mutex> } - impl BlockImport for FakeClient { - fn import_block(&self, block: Block, _justification: Justification) { + impl BlockImport for FakeClient { + fn import_block(&self, block: TestBlock, _justification: Justification) { assert!(self.imported_heights.lock().insert(block.header.number)) } } - impl Authorities for FakeClient { - fn authorities(&self, _at: &BlockId) -> Result, Error> { + impl Authorities for FakeClient { + fn authorities(&self, _at: &BlockId) -> Result, Error> { Ok(self.authorities.clone()) } } @@ -608,10 +623,10 @@ mod tests { struct Output(::std::marker::PhantomData); impl Sink for Output { - type SinkItem = Communication; + type SinkItem = Communication; type SinkError = E; - fn start_send(&mut self, _item: Communication) -> ::futures::StartSend { + fn start_send(&mut self, _item: Communication) -> ::futures::StartSend, E> { Ok(::futures::AsyncSink::Ready) } @@ -621,34 +636,35 @@ mod tests { } struct DummyFactory; - struct DummyProposer(block::Number); + struct DummyProposer(u64); - impl ProposerFactory for DummyFactory { + impl ProposerFactory for DummyFactory { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &Header, _authorities: &[AuthorityId], _sign_with: Arc) -> Result { + fn init(&self, parent_header: &TestHeader, _authorities: &[AuthorityId], _sign_with: Arc) -> Result { Ok(DummyProposer(parent_header.number + 1)) } } - impl Proposer for DummyProposer { + impl Proposer for DummyProposer { type Error = Error; - type Create = Result; + type Create = Result; type Evaluate = Result; - fn propose(&self) -> Result { - Ok(Block { - header: Header::from_block_number(self.0), - transactions: Default::default() + fn propose(&self) -> Result { + + Ok(TestBlock { + header: from_block_number(self.0), + extrinsics: Default::default() }) } - fn evaluate(&self, proposal: &Block) -> Result { + fn evaluate(&self, proposal: &TestBlock) -> Result { Ok(proposal.header.number == self.0) } - fn import_misbehavior(&self, _misbehavior: Vec<(AuthorityId, Misbehavior)>) {} + fn import_misbehavior(&self, _misbehavior: Vec<(AuthorityId, Misbehavior)>) {} fn round_proposer(&self, round_number: usize, authorities: &[AuthorityId]) -> AuthorityId { authorities[round_number % authorities.len()].clone() @@ -656,7 +672,7 @@ mod tests { } fn make_service(client: FakeClient) - -> BftService + -> BftService { BftService { client: Arc::new(client), @@ -668,13 +684,23 @@ mod tests { } } - fn sign_vote(vote: ::generic::Vote, key: &ed25519::Pair, parent_hash: HeaderHash) -> LocalizedSignature { - match sign_message(vote.into(), key, parent_hash) { + fn sign_vote(vote: ::generic::Vote, key: &ed25519::Pair, parent_hash: H256) -> LocalizedSignature { + match sign_message::(vote.into(), key, parent_hash) { ::generic::LocalizedMessage::Vote(vote) => vote.signature, _ => panic!("signing vote leads to signed vote"), } } + fn from_block_number(num: u64) -> TestHeader { + TestHeader::new( + num, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ) + } + #[test] fn future_gets_preempted() { let client = FakeClient { @@ -691,12 +717,12 @@ mod tests { let service = make_service(client); - let first = Header::from_block_number(2); - let first_hash = first.blake2_256().into(); + let first = from_block_number(2); + let first_hash = first.hash(); - let mut second = Header::from_block_number(3); + let mut second = from_block_number(3); second.parent_hash = first_hash; - let second_hash = second.blake2_256().into(); + let second_hash = second.hash(); let bft = service.build_upon(&first, stream::empty(), Output(Default::default())).unwrap(); assert!(service.live_agreement.lock().as_ref().unwrap().0 == first_hash); @@ -750,7 +776,7 @@ mod tests { }).collect(), }; - assert!(check_justification(&authorities, parent_hash, unchecked).is_ok()); + assert!(check_justification::(&authorities, parent_hash, unchecked).is_ok()); let unchecked = UncheckedJustification { digest: hash, @@ -760,7 +786,7 @@ mod tests { }).collect(), }; - assert!(check_justification(&authorities, parent_hash, unchecked).is_err()); + assert!(check_justification::(&authorities, parent_hash, unchecked).is_err()); // not enough signatures. let unchecked = UncheckedJustification { @@ -771,7 +797,7 @@ mod tests { }).collect(), }; - assert!(check_justification(&authorities, parent_hash, unchecked).is_err()); + assert!(check_justification::(&authorities, parent_hash, unchecked).is_err()); // wrong hash. let unchecked = UncheckedJustification { @@ -782,7 +808,7 @@ mod tests { }).collect(), }; - assert!(check_justification(&authorities, parent_hash, unchecked).is_err()); + assert!(check_justification::(&authorities, parent_hash, unchecked).is_err()); } #[test] @@ -794,9 +820,9 @@ mod tests { Keyring::Eve.to_raw_public(), ]; - let block = Block { - header: Header::from_block_number(1), - transactions: Default::default() + let block = TestBlock { + header: from_block_number(1), + extrinsics: Default::default() }; let proposal = sign_message(::generic::Message::Propose(1, block.clone()), &Keyring::Alice.pair(), parent_hash);; @@ -813,7 +839,7 @@ mod tests { } // Not an authority - let proposal = sign_message(::generic::Message::Propose(1, block), &Keyring::Bob.pair(), parent_hash);; + let proposal = sign_message::(::generic::Message::Propose(1, block), &Keyring::Bob.pair(), parent_hash);; if let ::generic::LocalizedMessage::Propose(proposal) = proposal { assert!(check_proposal(&authorities, &parent_hash, &proposal).is_err()); } else { @@ -823,28 +849,28 @@ mod tests { #[test] fn vote_check_works() { - let parent_hash = Default::default(); - let hash = [0xff; 32].into(); + let parent_hash: H256 = Default::default(); + let hash: H256 = [0xff; 32].into(); let authorities = vec![ Keyring::Alice.to_raw_public(), Keyring::Eve.to_raw_public(), ]; - let vote = sign_message(::generic::Message::Vote(::generic::Vote::Prepare(1, hash)), &Keyring::Alice.pair(), parent_hash);; + let vote = sign_message::(::generic::Message::Vote(::generic::Vote::Prepare(1, hash)), &Keyring::Alice.pair(), parent_hash);; if let ::generic::LocalizedMessage::Vote(vote) = vote { - assert!(check_vote(&authorities, &parent_hash, &vote).is_ok()); + assert!(check_vote::(&authorities, &parent_hash, &vote).is_ok()); let mut invalid_sender = vote.clone(); invalid_sender.signature.signer = Keyring::Eve.into(); - assert!(check_vote(&authorities, &parent_hash, &invalid_sender).is_err()); + assert!(check_vote::(&authorities, &parent_hash, &invalid_sender).is_err()); } else { assert!(false); } // Not an authority - let vote = sign_message(::generic::Message::Vote(::generic::Vote::Prepare(1, hash)), &Keyring::Bob.pair(), parent_hash);; + let vote = sign_message::(::generic::Message::Vote(::generic::Vote::Prepare(1, hash)), &Keyring::Bob.pair(), parent_hash);; if let ::generic::LocalizedMessage::Vote(vote) = vote { - assert!(check_vote(&authorities, &parent_hash, &vote).is_err()); + assert!(check_vote::(&authorities, &parent_hash, &vote).is_err()); } else { assert!(false); } diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 3fadb596e36fc..c50e44f7c8fda 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -393,14 +393,14 @@ impl Client where } } -impl bft::BlockImport for Client +impl bft::BlockImport for Client where B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, error::Error: From<::Error> { - fn import_block(&self, block: Block, justification: bft::Justification) { + fn import_block(&self, block: Block, justification: bft::Justification) { let justified_header = JustifiedHeader { header: block.header(), justification, @@ -410,14 +410,17 @@ impl bft::BlockImport for Client } } -impl bft::Authorities for Client where +impl bft::Authorities for Client where B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, error::Error: From<::Error>, { fn authorities(&self, at: &BlockId) -> Result, bft::Error> { - self.authorities_at(at).map_err(|_| bft::ErrorKind::StateUnavailable(*at).into()) + self.authorities_at(at).map_err(|_| { + let descriptor = format!("{:?}", at); + bft::ErrorKind::StateUnavailable(descriptor).into() + }) } } diff --git a/substrate/runtime/primitives/src/bft.rs b/substrate/runtime/primitives/src/bft.rs index 3ec779738ff9d..a0fa240d3ba33 100644 --- a/substrate/runtime/primitives/src/bft.rs +++ b/substrate/runtime/primitives/src/bft.rs @@ -40,11 +40,11 @@ pub enum Action { Propose(u32, Block), /// Proposal header of a block candidate. Accompanies any proposal, /// but is used for misbehavior reporting since blocks themselves are big. - ProposeHeader(u32, <::Header as HeaderT>::Hash), + ProposeHeader(u32, Block::Hash), /// Preparation to commit for a candidate. - Prepare(u32, <::Header as HeaderT>::Hash), + Prepare(u32, Block::Hash), /// Vote to commit to a candidate. - Commit(u32, <::Header as HeaderT>::Hash), + Commit(u32, Block::Hash), /// Vote to advance round after inactive primary. AdvanceRound(u32), } @@ -113,7 +113,7 @@ impl Slicable for Action { #[cfg_attr(feature = "std", derive(Debug))] pub struct Message { /// The parent header hash this action is relative to. - pub parent: <::Header as HeaderT>::Hash, + pub parent: Block::Hash, /// The action being broadcasted. pub action: Action, } @@ -136,17 +136,17 @@ impl Slicable for Message { /// Justification of a block. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] -pub struct Justification +pub struct Justification { /// The round consensus was reached in. pub round_number: u32, /// The hash of the header justified. - pub hash:

::Hash, + pub hash: H, /// The signatures and signers of the hash. pub signatures: Vec<(AuthorityId, Signature)> } -impl Slicable for Justification
{ +impl Slicable for Justification { fn encode(&self) -> Vec { let mut v = Vec::new(); diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index e024b3e53e6d4..91ee1f3a86c4f 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -429,6 +429,8 @@ where { type Extrinsic = UncheckedExtrinsic; type Header = Header; + type Hash = ::Hash; + fn header(&self) -> &Self::Header { &self.header } diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index fa383d6950581..46c4462afc6f8 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -118,6 +118,8 @@ impl impl traits::Block for Block { type Extrinsic = Xt; type Header = Header; + type Hash =
::Hash; + fn header(&self) -> &Self::Header { &self.header } diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 81d20e13bbf48..55fb0bb0a46f3 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -328,12 +328,14 @@ pub trait Header: Sized + Send + Sync + Slicable + MaybeSerializeDebug { /// You can get an iterator over each of the `extrinsics` and retrieve the `header`. pub trait Block: Sized + Send + Sync + Slicable + MaybeSerializeDebug { type Extrinsic: Member + Slicable; - type Header: Header; + type Header: Header; + type Hash: Member + MaybeDisplay + Default + SimpleBitOps + Slicable; + fn header(&self) -> &Self::Header; fn extrinsics(&self) -> &[Self::Extrinsic]; fn deconstruct(self) -> (Self::Header, Vec); fn new(header: Self::Header, extrinsics: Vec) -> Self; - fn hash(&self) -> ::Hash { + fn hash(&self) -> Self::Hash { <::Hashing as Hashing>::hash_of(self) } } From 647aa7e3427e8420e9afbf3b323d0651f2fc28e0 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Fri, 25 May 2018 19:47:13 +0200 Subject: [PATCH 18/60] port client --- substrate/client/src/backend.rs | 11 +- substrate/client/src/block_builder.rs | 19 +++- substrate/client/src/blockchain.rs | 4 +- substrate/client/src/client.rs | 73 ++++++------ substrate/client/src/error.rs | 14 +-- substrate/client/src/genesis.rs | 2 +- substrate/client/src/in_mem.rs | 119 +++++++++++++------- substrate/runtime-std/with_std.rs | 1 + substrate/runtime-std/without_std.rs | 1 + substrate/runtime/primitives/src/generic.rs | 20 +++- substrate/runtime/primitives/src/testing.rs | 11 ++ substrate/runtime/primitives/src/traits.rs | 35 ++++-- 12 files changed, 209 insertions(+), 101 deletions(-) diff --git a/substrate/client/src/backend.rs b/substrate/client/src/backend.rs index b3fd450567fb2..b37af73603cf1 100644 --- a/substrate/client/src/backend.rs +++ b/substrate/client/src/backend.rs @@ -18,7 +18,7 @@ use state_machine::backend::Backend as StateBackend; use error; -use primitives::bft::Justification; +use runtime_primitives::bft::Justification; use runtime_primitives::traits::Block as BlockT; use runtime_primitives::generic::BlockId; @@ -30,7 +30,14 @@ pub trait BlockImportOperation { /// Returns pending state. fn state(&self) -> error::Result<&Self::State>; /// Append block data to the transaction. - fn set_block_data(&mut self, header: Block::Header, body: Option>, justification: Option, is_new_best: bool) -> error::Result<()>; + fn set_block_data( + &mut self, + header: Block::Header, + body: Option>, + justification: Option>, + is_new_best: bool + ) -> error::Result<()>; + /// Inject storage data into the database. fn update_storage(&mut self, update: ::Transaction) -> error::Result<()>; /// Inject storage data into the database replacing any existing data. diff --git a/substrate/client/src/block_builder.rs b/substrate/client/src/block_builder.rs index 76cec8ea98913..190226021e9d5 100644 --- a/substrate/client/src/block_builder.rs +++ b/substrate/client/src/block_builder.rs @@ -19,7 +19,7 @@ use std::vec::Vec; use codec::{Joiner, Slicable}; use state_machine::{self, CodeExecutor}; -use runtime_primitives::traits::{Header as HeaderT, Hashing as HashingT, Block as BlockT}; +use runtime_primitives::traits::{Header as HeaderT, Hashing as HashingT, Block as BlockT, One, HashingFor}; use runtime_primitives::generic::BlockId; use {backend, error, Client}; @@ -45,18 +45,25 @@ impl BlockBuilder where { /// Create a new instance of builder from the given client, building on the latest block. pub fn new(client: &Client) -> error::Result { - client.info().and_then(|i| Self::at_block(&BlockId::::Hash(i.chain.best_hash), client)) + client.info().and_then(|i| Self::at_block(&BlockId::Hash(i.chain.best_hash), client)) } /// Create a new instance of builder from the given client using a particular block's ID to /// build upon. pub fn at_block(block_id: &BlockId, client: &Client) -> error::Result { + let number = client.block_number_from_id(block_id)? + .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{}", block_id)))? + + One::one(); + + let parent_hash = client.block_hash_from_id(block_id)? + .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{}", block_id)))?; + Ok(BlockBuilder { header: <::Header as HeaderT>::new( - client.block_number_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(Box::new(block_id.clone())))? + 1, + number, Default::default(), Default::default(), - client.block_hash_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(Box::new(block_id.clone())))?, + parent_hash, Default::default() ), extrinsics: Default::default(), @@ -79,7 +86,9 @@ impl BlockBuilder where /// Consume the builder to return a valid `Block` containing all pushed extrinsics. pub fn bake(mut self) -> error::Result { - self.header.extrinsics_root = <<::Header as HeaderT>::Hashing as HashingT>::ordered_trie_root(self.extrinsics.iter().map(Slicable::encode)); + let new_extrinsics_root = HashingFor::::ordered_trie_root(self.extrinsics.iter().map(Slicable::encode)); + self.header.set_extrinsics_root(new_extrinsics_root); + let (output, _) = state_machine::execute(&self.state, &mut self.changes, &self.executor, "finalise_block", &self.header.encode())?; self.header = <::Header as Slicable>::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); diff --git a/substrate/client/src/blockchain.rs b/substrate/client/src/blockchain.rs index d6f618c8b0c8b..73c7107b30ee2 100644 --- a/substrate/client/src/blockchain.rs +++ b/substrate/client/src/blockchain.rs @@ -18,7 +18,7 @@ use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; use runtime_primitives::generic::BlockId; -use primitives::bft::Justification; +use runtime_primitives::bft::Justification; use error::Result; @@ -29,7 +29,7 @@ pub trait Backend: Send + Sync { /// Get block body. Returns `None` if block is not found. fn body(&self, id: BlockId) -> Result::Extrinsic>>>; /// Get block justification. Returns `None` if justification does not exist. - fn justification(&self, id: BlockId) -> Result>; + fn justification(&self, id: BlockId) -> Result>>; /// Get blockchain info. fn info(&self) -> Result>; /// Get block status. diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index c50e44f7c8fda..c445705112754 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -19,9 +19,9 @@ use futures::sync::mpsc; use parking_lot::Mutex; use std::hash; -use primitives::{self, AuthorityId}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing as HashingT, Zero}; +use primitives::AuthorityId; +use runtime_primitives::{bft::Justification, generic::BlockId}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, One}; use primitives::storage::{StorageKey, StorageData}; use codec::{KeyedVec, Slicable}; use state_machine::{self, Ext, OverlayedChanges, Backend as StateBackend, CodeExecutor}; @@ -60,7 +60,7 @@ pub struct ClientInfo { /// Best block number in the queue. pub best_queued_number: Option<<::Header as HeaderT>::Number>, /// Best queued block hash. - pub best_queued_hash: Option<<::Header as HeaderT>::Hash>, + pub best_queued_hash: Option, } /// Information regarding the result of a call. @@ -120,11 +120,11 @@ pub enum BlockOrigin { #[derive(Clone, Debug)] pub struct BlockImportNotification { /// Imported block header hash. - pub hash: <::Header as HeaderT>::Hash, + pub hash: Block::Hash, /// Imported block origin. pub origin: BlockOrigin, /// Imported block header. - pub header: ::Header, + pub header: Block::Header, /// Is this the new best block. pub is_new_best: bool, } @@ -133,12 +133,12 @@ pub struct BlockImportNotification { #[derive(Debug, PartialEq, Eq, Clone)] pub struct JustifiedHeader { header: ::Header, - justification: bft::Justification, + justification: ::bft::Justification, } impl JustifiedHeader { /// Deconstruct the justified header into parts. - pub fn into_inner(self) -> (::Header, bft::Justification) { + pub fn into_inner(self) -> (::Header, ::bft::Justification) { (self.header, self.justification) } } @@ -152,7 +152,6 @@ pub fn new_in_mem( E: CodeExecutor, F: FnOnce() -> (::Header, Vec<(Vec, Vec)>), Block: BlockT, - <::Header as HeaderT>::Hash: hash::Hash, { Client::new(in_mem::Backend::new(), executor, build_genesis) } @@ -161,8 +160,8 @@ impl Client where B: backend::Backend, E: CodeExecutor, Block: BlockT, + Block::Hash: hash::Hash, error::Error: From<<>::State as StateBackend>::Error>, - <::Header as HeaderT>::Hash: hash::Hash, { /// Creates new Polkadot Client with given blockchain and code executor. pub fn new( @@ -274,11 +273,16 @@ impl Client where pub fn check_justification( &self, header: ::Header, - justification: bft::UncheckedJustification, + justification: ::bft::UncheckedJustification, ) -> error::Result> { - let authorities = self.authorities_at(&BlockId::Hash(header.parent_hash))?; - let just = bft::check_justification(&authorities[..], header.parent_hash, justification) - .map_err(|_| error::ErrorKind::BadJustification(Box::new(BlockId::Hash(<<::Header as HeaderT>::Hashing as HashingT>::hash_of(header)))))?; + let parent_hash = header.parent_hash().clone(); + let authorities = self.authorities_at(&BlockId::Hash(parent_hash))?; + let just = ::bft::check_justification::(&authorities[..], parent_hash, justification) + .map_err(|_| + error::ErrorKind::BadJustification( + format!("{}", header.hash()) + ) + )?; Ok(JustifiedHeader { header, justification: just, @@ -295,12 +299,13 @@ impl Client where // TODO: import lock // TODO: import justification. let (header, justification) = header.into_inner(); - match self.backend.blockchain().status(BlockId::Hash(header.parent_hash))? { + let parent_hash = header.parent_hash().clone(); + match self.backend.blockchain().status(BlockId::Hash(parent_hash))? { blockchain::BlockStatus::InChain => (), blockchain::BlockStatus::Unknown => return Ok(ImportResult::UnknownParent), } - let mut transaction = self.backend.begin_operation(BlockId::Hash(header.parent_hash))?; + let mut transaction = self.backend.begin_operation(BlockId::Hash(parent_hash))?; let mut overlay = OverlayedChanges::default(); let (_out, storage_update) = state_machine::execute( @@ -311,9 +316,9 @@ impl Client where &::new(header.clone(), body.clone().unwrap_or_default()).encode() )?; - let is_new_best = header.number == self.backend.blockchain().info()?.best_number + 1; - let hash = <<::Header as HeaderT>::Hashing as HashingT>::hash_of(header); - trace!("Imported {}, (#{}), best={}, origin={:?}", hash, header.number, is_new_best, origin); + let is_new_best = header.number() == &(self.backend.blockchain().info()?.best_number + One::one()); + let hash = header.hash(); + trace!("Imported {}, (#{}), best={}, origin={:?}", hash, header.number(), is_new_best, origin); transaction.set_block_data(header.clone(), body, Some(justification.uncheck().into()), is_new_best)?; transaction.update_storage(storage_update)?; self.backend.commit_operation(transaction)?; @@ -351,12 +356,12 @@ impl Client where } /// Get block hash by number. - pub fn block_hash(&self, block_number: <::Header as HeaderT>::Number) -> error::Result::Header as HeaderT>::Hash>> { + pub fn block_hash(&self, block_number: <::Header as HeaderT>::Number) -> error::Result> { self.backend.blockchain().hash(block_number) } /// Convert an arbitrary block ID into a block hash. - pub fn block_hash_from_id(&self, id: &BlockId) -> error::Result::Header as HeaderT>::Hash>> { + pub fn block_hash_from_id(&self, id: &BlockId) -> error::Result> { match *id { BlockId::Hash(h) => Ok(Some(h)), BlockId::Number(n) => self.block_hash(n), @@ -366,7 +371,7 @@ impl Client where /// Convert an arbitrary block ID into a block hash. pub fn block_number_from_id(&self, id: &BlockId) -> error::Result::Header as HeaderT>::Number>> { match *id { - BlockId::Hash(_) => Ok(self.header(id)?.map(|h| h.number)), + BlockId::Hash(_) => Ok(self.header(id)?.map(|h| h.number().clone())), BlockId::Number(n) => Ok(Some(n)), } } @@ -382,7 +387,7 @@ impl Client where } /// Get block justification set by id. - pub fn justification(&self, id: &BlockId) -> error::Result> { + pub fn justification(&self, id: &BlockId) -> error::Result>> { self.backend.blockchain().justification(*id) } @@ -393,28 +398,32 @@ impl Client where } } -impl bft::BlockImport for Client +impl bft::BlockImport for Client where B: backend::Backend, E: state_machine::CodeExecutor, Block: BlockT, + Block::Hash: hash::Hash, error::Error: From<::Error> { - fn import_block(&self, block: Block, justification: bft::Justification) { + fn import_block(&self, block: Block, justification: ::bft::Justification) { + let (header, extrinsics) = block.deconstruct(); let justified_header = JustifiedHeader { - header: block.header(), + header: header, justification, }; - let _ = self.import_block(BlockOrigin::ConsensusBroadcast, justified_header, Some(block.transactions)); + let _ = self.import_block(BlockOrigin::ConsensusBroadcast, justified_header, Some(extrinsics)); } } -impl bft::Authorities for Client where - B: backend::Backend, - E: state_machine::CodeExecutor, - Block: BlockT, - error::Error: From<::Error>, +impl bft::Authorities for Client + where + B: backend::Backend, + E: state_machine::CodeExecutor, + Block: BlockT, + Block::Hash: hash::Hash, + error::Error: From<::Error>, { fn authorities(&self, at: &BlockId) -> Result, bft::Error> { self.authorities_at(at).map_err(|_| { diff --git a/substrate/client/src/error.rs b/substrate/client/src/error.rs index 58052220a2047..e59bcee388e1e 100644 --- a/substrate/client/src/error.rs +++ b/substrate/client/src/error.rs @@ -16,7 +16,7 @@ //! Polkadot client possible errors. -use std::{self, fmt}; +use std; use state_machine; use primitives::hexdisplay::HexDisplay; @@ -29,9 +29,9 @@ error_chain! { } /// Unknown block. - UnknownBlock(h: Box) { + UnknownBlock(h: String) { description("unknown block"), - display("UnknownBlock: {}", h), + display("UnknownBlock: {}", &*h), } /// Execution error. @@ -77,9 +77,9 @@ error_chain! { } /// Bad justification for header. - BadJustification(h: Box) { + BadJustification(h: String) { description("bad justification for header"), - display("bad justification for header: {}", h), + display("bad justification for header: {}", &*h), } } } @@ -92,8 +92,8 @@ impl From> for Error { } impl From for Error { - fn from(_e: state_machine::backend::Void) -> Self { - unreachable!() + fn from(e: state_machine::backend::Void) -> Self { + match e {} } } diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index d62fb216c18de..d25b08947bc48 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -26,7 +26,7 @@ pub fn construct_genesis_block< storage: &HashMap, Vec> ) -> Block { let state_root = <<::Header as HeaderT>::Hashing as HashingT>::trie_root(storage.clone().into_iter()); - let extrinsics_root = <<::Header as HeaderT>::Hashing as HashingT>::trie_root(vec![].into_iter()); + let extrinsics_root = <<::Header as HeaderT>::Hashing as HashingT>::trie_root(::std::iter::empty::<(&[u8], &[u8])>()); Block::new( <::Header as HeaderT>::new( Zero::zero(), diff --git a/substrate/client/src/in_mem.rs b/substrate/client/src/in_mem.rs index abadff9c89774..53cf062443e90 100644 --- a/substrate/client/src/in_mem.rs +++ b/substrate/client/src/in_mem.rs @@ -17,36 +17,72 @@ //! In memory client backend use std::collections::HashMap; -use std::hash; -use std::marker::PhantomData; use parking_lot::RwLock; use error; use backend; -use primitives; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing as HashingT, Zero}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero}; +use runtime_primitives::bft::Justification; use blockchain::{self, BlockStatus}; use state_machine::backend::{Backend as StateBackend, InMemory}; struct PendingBlock { - block: B, + block: StoredBlock, is_best: bool, } #[derive(PartialEq, Eq, Clone)] -struct Block { - header: B::Header, - justification: Option, - body: Option>, +enum StoredBlock { + Header(B::Header, Option>), + Full(B, Option>), +} + +impl StoredBlock { + fn new(header: B::Header, body: Option>, just: Option>) -> Self { + match body { + Some(body) => StoredBlock::Full(B::new(header, body), just), + None => StoredBlock::Header(header, just), + } + } + + fn header(&self) -> &B::Header { + match *self { + StoredBlock::Header(ref h, _) => h, + StoredBlock::Full(ref b, _) => b.header(), + } + } + + fn justification(&self) -> Option<&Justification> { + match *self { + StoredBlock::Header(_, ref j) | StoredBlock::Full(_, ref j) => j.as_ref() + } + } + + fn extrinsics(&self) -> Option<&[B::Extrinsic]> { + match *self { + StoredBlock::Header(_, _) => None, + StoredBlock::Full(ref b, _) => Some(b.extrinsics()) + } + } + + fn into_inner(self) -> (B::Header, Option>, Option>) { + match self { + StoredBlock::Header(header, just) => (header, None, just), + StoredBlock::Full(block, just) => { + let (header, body) = block.deconstruct(); + (header, Some(body), just) + } + } + } } #[derive(Clone)] struct BlockchainStorage { - blocks: HashMap<<::Header as HeaderT>::Hash, Block>, - hashes: HashMap<<::Header as HeaderT>::Number, <::Header as HeaderT>::Hash>, - best_hash: <::Header as HeaderT>::Hash, + blocks: HashMap>, + hashes: HashMap<<::Header as HeaderT>::Number, Block::Hash>, + best_hash: Block::Hash, best_number: <::Header as HeaderT>::Number, - genesis_hash: <::Header as HeaderT>::Hash, + genesis_hash: Block::Hash, } /// In-memory blockchain. Supports concurrent reads. @@ -54,7 +90,7 @@ pub struct Blockchain { storage: RwLock>, } -impl Clone for Blockchain { +impl Clone for Blockchain { fn clone(&self) -> Self { Blockchain { storage: RwLock::new(self.storage.read().clone()), @@ -63,7 +99,7 @@ impl Clone for Blockchain { } impl Blockchain { - fn id(&self, id: BlockId) -> Option<<::Header as HeaderT>::Hash> { + fn id(&self, id: BlockId) -> Option { match id { BlockId::Hash(h) => Some(h), BlockId::Number(n) => self.storage.read().hashes.get(&n).cloned(), @@ -85,21 +121,21 @@ impl Blockchain { fn insert( &self, - hash: <::Header as HeaderT>::Hash, + hash: Block::Hash, header: ::Header, - justification: Option, + justification: Option>, body: Option::Extrinsic>>, is_new_best: bool ) { - let number = header.number; + let number = header.number().clone(); let mut storage = self.storage.write(); - storage.blocks.insert(hash, ::new(header, body, justification)); - storage.hashes.insert(number, hash); + storage.blocks.insert(hash.clone(), StoredBlock::new(header, body, justification)); + storage.hashes.insert(number, hash.clone()); if is_new_best { - storage.best_hash = hash; - storage.best_number = number; + storage.best_hash = hash.clone(); + storage.best_number = number.clone(); } - if number == 0 { + if number == Zero::zero() { storage.genesis_hash = hash; } } @@ -122,15 +158,22 @@ impl Blockchain { impl blockchain::Backend for Blockchain { fn header(&self, id: BlockId) -> error::Result::Header>> { - Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).map(|b| b.header.clone()))) + Ok(self.id(id).and_then(|hash| { + self.storage.read().blocks.get(&hash).map(|b| b.header().clone()) + })) } fn body(&self, id: BlockId) -> error::Result::Extrinsic>>> { - Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).and_then(|b| b.body.clone()))) + Ok(self.id(id).and_then(|hash| { + self.storage.read().blocks.get(&hash) + .and_then(|b| b.extrinsics().map(|x| x.to_vec())) + })) } - fn justification(&self, id: BlockId) -> error::Result> { - Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).and_then(|b| b.justification.clone()))) + fn justification(&self, id: BlockId) -> error::Result>> { + Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).and_then(|b| + b.justification().map(|x| x.clone())) + )) } fn info(&self) -> error::Result> { @@ -149,7 +192,7 @@ impl blockchain::Backend for Blockchain { } } - fn hash(&self, number: <::Header as HeaderT>::Number) -> error::Result::Header as HeaderT>::Hash>> { + fn hash(&self, number: <::Header as HeaderT>::Number) -> error::Result> { Ok(self.id(BlockId::Number(number))) } } @@ -172,12 +215,12 @@ impl backend::BlockImportOperation for BlockImportOperatio &mut self, header: ::Header, body: Option::Extrinsic>>, - justification: Option, + justification: Option>, is_new_best: bool ) -> error::Result<()> { assert!(self.pending_block.is_none(), "Only one block per operation is allowed"); self.pending_block = Some(PendingBlock { - block: ::new(header, body, justification), + block: StoredBlock::new(header, body, justification), is_best: is_new_best, }); Ok(()) @@ -197,29 +240,25 @@ impl backend::BlockImportOperation for BlockImportOperatio /// In-memory backend. Keeps all states and blocks in memory. Useful for testing. pub struct Backend where Block: BlockT, - <::Header as HeaderT>::Hash: hash::Hash, { - states: RwLock::Header as HeaderT>::Hash, InMemory>>, + states: RwLock>, blockchain: Blockchain, } impl Backend where Block: BlockT, - <::Header as HeaderT>::Hash: hash::Hash, { /// Create a new instance of in-mem backend. pub fn new() -> Backend { Backend { states: RwLock::new(HashMap::new()), blockchain: Blockchain::new(), - dummy: PhantomData::new(), } } } impl backend::Backend for Backend where Block: BlockT, - <::Header as HeaderT>::Hash: hash::Hash, { type BlockImportOperation = BlockImportOperation; type Blockchain = Blockchain; @@ -227,7 +266,7 @@ impl backend::Backend for Backend where fn begin_operation(&self, block: BlockId) -> error::Result { let state = match block { - BlockId::Hash(h) if h.is_zero() => Self::State::default(), + BlockId::Hash(ref h) if h.clone() == Default::default() => Self::State::default(), _ => self.state_at(block)?, }; @@ -240,10 +279,12 @@ impl backend::Backend for Backend where fn commit_operation(&self, operation: Self::BlockImportOperation) -> error::Result<()> { if let Some(pending_block) = operation.pending_block { - let hash = <<::Header as HeaderT>::Hashing as HashingT>::hash_of(&pending_block.block.header); let old_state = &operation.old_state; + let (header, body, justification) = pending_block.block.into_inner(); + let hash = header.hash(); + self.states.write().insert(hash, operation.new_state.unwrap_or_else(|| old_state.clone())); - self.blockchain.insert(hash, pending_block.block.header, pending_block.block.justification, pending_block.block.body, pending_block.is_best); + self.blockchain.insert(hash, header, justification, body, pending_block.is_best); } Ok(()) } @@ -255,7 +296,7 @@ impl backend::Backend for Backend where fn state_at(&self, block: BlockId) -> error::Result { match self.blockchain.id(block).and_then(|id| self.states.read().get(&id).cloned()) { Some(state) => Ok(state), - None => Err(error::ErrorKind::UnknownBlock(Box::new(block)).into()), + None => Err(error::ErrorKind::UnknownBlock(format!("{}", block)).into()), } } } diff --git a/substrate/runtime-std/with_std.rs b/substrate/runtime-std/with_std.rs index 92f6654bbb94e..cec1b51014c56 100644 --- a/substrate/runtime-std/with_std.rs +++ b/substrate/runtime-std/with_std.rs @@ -20,6 +20,7 @@ pub use std::cell; pub use std::clone; pub use std::cmp; pub use std::fmt; +pub use std::hash; pub use std::iter; pub use std::marker; pub use std::mem; diff --git a/substrate/runtime-std/without_std.rs b/substrate/runtime-std/without_std.rs index 5e2c45bde1704..f502eac444ac5 100644 --- a/substrate/runtime-std/without_std.rs +++ b/substrate/runtime-std/without_std.rs @@ -29,6 +29,7 @@ pub use core::cell; pub use core::clone; pub use core::cmp; pub use core::fmt; +pub use core::hash; pub use core::intrinsics; pub use core::iter; pub use core::marker; diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 91ee1f3a86c4f..21a70741b1869 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -294,7 +294,7 @@ impl Slicable for Header::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, + Hashing::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, { fn decode(input: &mut I) -> Option { Some(Header { @@ -317,10 +317,10 @@ impl Slicable for Header traits::Header for Header where - Number: Member + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, + Number: Member + ::rstd::hash::Hash + Copy + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, Hashing: HashingT, DigestItem: Member + Default + Slicable, - ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, + Hashing::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Slicable, { type Number = Number; type Hash = ::Output; @@ -328,10 +328,20 @@ impl traits::Header for Header; fn number(&self) -> &Self::Number { &self.number } + fn set_number(&mut self, num: Self::Number) { self.number = num } + fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } + fn set_extrinsics_root(&mut self, root: Self::Hash) { self.extrinsics_root = root } + fn state_root(&self) -> &Self::Hash { &self.state_root } + fn set_state_root(&mut self, root: Self::Hash) { self.state_root = root } + fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } + fn set_parent_hash(&mut self, hash: Self::Hash) { self.parent_hash = hash } + fn digest(&self) -> &Self::Digest { &self.digest } + fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } + fn new( number: Self::Number, extrinsics_root: Self::Hash, @@ -357,6 +367,9 @@ pub enum BlockId where { Number(<::Header as HeaderT>::Number), } +impl Copy for BlockId {} + + #[cfg(feature = "std")] impl fmt::Display for BlockId { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { @@ -418,6 +431,7 @@ impl traits::Blo where Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, Hashing: HashingT, + Hashing::Output: ::rstd::hash::Hash, DigestItem: Member + Default, ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, AccountId: Member + MaybeDisplay, diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index 46c4462afc6f8..bb1c85bf61918 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -78,11 +78,22 @@ impl traits::Header for Header { type Hashing = BlakeTwo256; type Hash = H256; type Digest = Digest; + fn number(&self) -> &Self::Number { &self.number } + fn set_number(&mut self, num: Self::Number) { self.number = num } + fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } + fn set_extrinsics_root(&mut self, root: Self::Hash) { self.extrinsics_root = root } + fn state_root(&self) -> &Self::Hash { &self.state_root } + fn set_state_root(&mut self, root: Self::Hash) { self.state_root = root } + fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } + fn set_parent_hash(&mut self, hash: Self::Hash) { self.parent_hash = hash } + fn digest(&self) -> &Self::Digest { &self.digest } + fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } + fn new( number: Self::Number, extrinsics_root: Self::Hash, diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 55fb0bb0a46f3..20164e5b0b6b8 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -300,16 +300,12 @@ pub trait Digest { /// `parent_hash`, as well as a `digest` and a block `number`. /// /// You can also create a `new` one from those fields. -pub trait Header: Sized + Send + Sync + Slicable + MaybeSerializeDebug { - type Number: Member + MaybeDisplay + SimpleArithmetic + Slicable; - type Hash: Member + MaybeDisplay + Default + SimpleBitOps + Slicable; +pub trait Header: Clone + Send + Sync + Slicable + Eq + MaybeSerializeDebug { + type Number: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Slicable; + type Hash: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Slicable; type Hashing: Hashing; type Digest: Member + Default; - fn number(&self) -> &Self::Number; - fn extrinsics_root(&self) -> &Self::Hash; - fn state_root(&self) -> &Self::Hash; - fn parent_hash(&self) -> &Self::Hash; - fn digest(&self) -> &Self::Digest; + fn new( number: Self::Number, extrinsics_root: Self::Hash, @@ -317,6 +313,22 @@ pub trait Header: Sized + Send + Sync + Slicable + MaybeSerializeDebug { parent_hash: Self::Hash, digest: Self::Digest ) -> Self; + + fn number(&self) -> &Self::Number; + fn set_number(&mut self, Self::Number); + + fn extrinsics_root(&self) -> &Self::Hash; + fn set_extrinsics_root(&mut self, Self::Hash); + + fn state_root(&self) -> &Self::Hash; + fn set_state_root(&mut self, Self::Hash); + + fn parent_hash(&self) -> &Self::Hash; + fn set_parent_hash(&mut self, Self::Hash); + + fn digest(&self) -> &Self::Digest; + fn set_digest(&mut self, Self::Digest); + fn hash(&self) -> Self::Hash { ::hash_of(self) } @@ -326,10 +338,10 @@ pub trait Header: Sized + Send + Sync + Slicable + MaybeSerializeDebug { /// `Extrinsic` piece of information as well as a `Header`. /// /// You can get an iterator over each of the `extrinsics` and retrieve the `header`. -pub trait Block: Sized + Send + Sync + Slicable + MaybeSerializeDebug { +pub trait Block: Clone + Send + Sync + Slicable + Eq + MaybeSerializeDebug { type Extrinsic: Member + Slicable; type Header: Header; - type Hash: Member + MaybeDisplay + Default + SimpleBitOps + Slicable; + type Hash: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Slicable; fn header(&self) -> &Self::Header; fn extrinsics(&self) -> &[Self::Extrinsic]; @@ -340,6 +352,9 @@ pub trait Block: Sized + Send + Sync + Slicable + MaybeSerializeDebug { } } +/// Extract the hashing type for a block. +pub type HashingFor = <::Header as Header>::Hashing; + /// A "checkable" piece of information, used by the standard Substrate Executive in order to /// check the validity of a piece of extrinsic information, usually by verifying the signature. pub trait Checkable: Sized + Send + Sync { From fedbaba0b11f08aaecc7a289341ded102fbe888d Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 29 May 2018 15:56:42 +0200 Subject: [PATCH 19/60] port substrate-test-runtime --- Cargo.lock | 3 ++ substrate/client/src/block_builder.rs | 2 +- substrate/test-runtime/Cargo.toml | 6 ++++ substrate/test-runtime/src/genesismap.rs | 11 ++---- substrate/test-runtime/src/lib.rs | 36 +++++++++++++------ substrate/test-runtime/src/system.rs | 13 +++---- substrate/test-runtime/src/transaction.rs | 2 +- .../test-runtime/src/unchecked_transaction.rs | 2 +- 8 files changed, 48 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3155d9fa54aef..3c85e1cf724d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2253,10 +2253,13 @@ dependencies = [ "ed25519 0.1.0", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", ] diff --git a/substrate/client/src/block_builder.rs b/substrate/client/src/block_builder.rs index 190226021e9d5..d645400d40c89 100644 --- a/substrate/client/src/block_builder.rs +++ b/substrate/client/src/block_builder.rs @@ -77,7 +77,7 @@ impl BlockBuilder where /// can be validly executed (by executing it); if it is invalid, it'll be returned along with /// the error. Otherwise, it will return a mutable reference to self (in order to chain). pub fn push(&mut self, xt: ::Extrinsic) -> error::Result<()> { - let (output, _) = state_machine::execute(&self.state, &mut self.changes, &self.executor, "execute_transaction", + let (output, _) = state_machine::execute(&self.state, &mut self.changes, &self.executor, "apply_extrinsic", &vec![].and(&self.header).and(&xt))?; self.header = <::Header as Slicable>::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); self.extrinsics.push(xt); diff --git a/substrate/test-runtime/Cargo.toml b/substrate/test-runtime/Cargo.toml index 577d435b6df83..bd0654e2ef945 100644 --- a/substrate/test-runtime/Cargo.toml +++ b/substrate/test-runtime/Cargo.toml @@ -7,12 +7,15 @@ authors = ["Parity Technologies "] log = { version = "0.3", optional = true } hex-literal = { version = "0.1.0", optional = true } ed25519 = { path = "../ed25519", optional = true } +serde = { version = "1.0", optional = true } +serde_derive = { version = "1.0", optional = true } substrate-keyring = { path = "../keyring", optional = true } substrate-codec = { path = "../codec", default-features = false } substrate-runtime-std = { path = "../runtime-std", default-features = false } substrate-runtime-io = { path = "../runtime-io", default-features = false } substrate-runtime-support = { path = "../runtime-support", default-features = false } substrate-primitives = { path = "../primitives", default-features = false } +substrate-runtime-primitives = { path = "../runtime/primitives", default-features = false } [features] default = ["std"] @@ -20,10 +23,13 @@ std = [ "log", "hex-literal", "ed25519", + "serde", + "serde_derive", "substrate-keyring", "substrate-codec/std", "substrate-runtime-std/std", "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-primitives/std", + "substrate-runtime-primitives/std" ] diff --git a/substrate/test-runtime/src/genesismap.rs b/substrate/test-runtime/src/genesismap.rs index 1bc24d265763e..10bf1751f4c99 100644 --- a/substrate/test-runtime/src/genesismap.rs +++ b/substrate/test-runtime/src/genesismap.rs @@ -18,10 +18,9 @@ use std::collections::HashMap; use runtime_io::twox_128; -use runtime_support::Hashable; use codec::{KeyedVec, Joiner}; use primitives::AuthorityId; -use primitives::block::Block; +use runtime_primitives::traits::Block; /// Configuration of a general Substrate test genesis block. pub struct GenesisConfig { @@ -60,12 +59,8 @@ macro_rules! map { ) } -pub fn additional_storage_with_genesis(genesis_block: &Block) -> HashMap, Vec> { - use codec::Slicable; - use primitives::hexdisplay::HexDisplay; - println!("genesis hash {}", HexDisplay::from(&genesis_block.header.blake2_256())); - println!("genesis {}", HexDisplay::from(&genesis_block.header.encode())); +pub fn additional_storage_with_genesis(genesis_block: &::Block) -> HashMap, Vec> { map![ - twox_128(&b"latest"[..]).to_vec() => genesis_block.header.blake2_256().to_vec() + twox_128(&b"latest"[..]).to_vec() => genesis_block.hash().0.to_vec() ] } diff --git a/substrate/test-runtime/src/lib.rs b/substrate/test-runtime/src/lib.rs index fb09970820225..92fc370a4e418 100644 --- a/substrate/test-runtime/src/lib.rs +++ b/substrate/test-runtime/src/lib.rs @@ -19,13 +19,29 @@ #![cfg_attr(not(feature = "std"), no_std)] extern crate substrate_runtime_std as rstd; -#[macro_use] extern crate substrate_runtime_io as runtime_io; extern crate substrate_runtime_support as runtime_support; extern crate substrate_codec as codec; -#[cfg(test)] #[macro_use] extern crate hex_literal; -#[cfg(test)] extern crate ed25519; -#[cfg(test)] extern crate substrate_keyring as keyring; -#[cfg_attr(test, macro_use)] extern crate substrate_primitives as primitives; +extern crate substrate_runtime_primitives as runtime_primitives; + +#[cfg(feature = "std")] +extern crate serde; + +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + +#[cfg(test)] +#[macro_use] +extern crate hex_literal; +#[cfg(test)] +extern crate ed25519; +#[cfg(test)] +extern crate substrate_keyring as keyring; +#[cfg_attr(test, macro_use)] +extern crate substrate_primitives as primitives; +#[macro_use] +extern crate substrate_runtime_io as runtime_io; + #[cfg(feature = "std")] pub mod genesismap; pub mod system; @@ -37,14 +53,14 @@ use codec::Slicable; use primitives::AuthorityId; use primitives::hash::H512; -use primitives::block::generic; pub use primitives::hash::H256; -pub use primitives::block::{Header, Number as BlockNumber, Digest}; pub use transaction::Transaction; pub use unchecked_transaction::UncheckedTransaction; /// A test block. -pub type Block = generic::Block; +pub type Block = runtime_primitives::testing::Block; +/// A test block's header. +pub type Header = runtime_primitives::testing::Header; /// An identifier for an account on this system. pub type AccountId = AuthorityId; /// Signature for our transactions. @@ -59,7 +75,7 @@ pub fn run_tests(mut input: &[u8]) -> Vec { print("run_tests..."); let block = Block::decode(&mut input).unwrap(); print("deserialised block."); - let stxs = block.transactions.iter().map(Slicable::encode).collect::>(); + let stxs = block.extrinsics.iter().map(Slicable::encode).collect::>(); print("reserialised transactions."); [stxs.len() as u8].encode() } @@ -69,7 +85,7 @@ pub mod api { impl_stubs!( execute_block => |block| system::execute_block(block), - execute_transaction => |(header, utx)| system::execute_transaction(utx, header), + apply_extrinsic => |(header, utx)| system::execute_transaction(utx, header), finalise_block => |header| system::finalise_block(header) ); } diff --git a/substrate/test-runtime/src/system.rs b/substrate/test-runtime/src/system.rs index eaa741fa3387e..ad7cf92303200 100644 --- a/substrate/test-runtime/src/system.rs +++ b/substrate/test-runtime/src/system.rs @@ -50,14 +50,14 @@ pub fn execute_block(block: Block) { ); // check transaction trie root represents the transactions. - let txs = block.transactions.iter().map(Slicable::encode).collect::>(); + let txs = block.extrinsics.iter().map(Slicable::encode).collect::>(); let txs = txs.iter().map(Vec::as_slice).collect::>(); let txs_root = enumerated_trie_root(&txs).into(); info_expect_equal_hash(&header.extrinsics_root, &txs_root); assert!(header.extrinsics_root == txs_root, "Transaction trie root must be valid."); // execute transactions - block.transactions.iter().for_each(execute_transaction_backend); + block.extrinsics.iter().for_each(execute_transaction_backend); // check storage root. let storage_root = storage_root().into(); @@ -133,7 +133,8 @@ mod tests { use runtime_io::{with_externalities, twox_128, TestExternalities}; use codec::{Joiner, KeyedVec}; use keyring::Keyring; - use ::{Header, Digest, Transaction, UncheckedTransaction}; + use runtime_primitives::testing::Digest; + use ::{Header, Transaction, UncheckedTransaction}; fn new_test_ext() -> TestExternalities { map![ @@ -165,7 +166,7 @@ mod tests { let b = Block { header: h, - transactions: vec![], + extrinsics: vec![], }; with_externalities(&mut t, || { @@ -190,7 +191,7 @@ mod tests { extrinsics_root: hex!("5e44188712452f900acfa1b4bf4084753122ea1856d58187dd33374a2ca653b1").into(), digest: Digest { logs: vec![], }, }, - transactions: vec![ + extrinsics: vec![ construct_signed_tx(Transaction { from: Keyring::Alice.to_raw_public(), to: Keyring::Bob.to_raw_public(), @@ -215,7 +216,7 @@ mod tests { extrinsics_root: hex!("9ac45fbcc93fa6a8b5a3c44f04d936d53569c72a53fbc12eb58bf884f6dbfae5").into(), digest: Digest { logs: vec![], }, }, - transactions: vec![ + extrinsics: vec![ construct_signed_tx(Transaction { from: Keyring::Bob.to_raw_public(), to: Keyring::Alice.to_raw_public(), diff --git a/substrate/test-runtime/src/transaction.rs b/substrate/test-runtime/src/transaction.rs index 19ddba99e4ef3..4e5a65a9b1c7a 100644 --- a/substrate/test-runtime/src/transaction.rs +++ b/substrate/test-runtime/src/transaction.rs @@ -22,7 +22,7 @@ use super::AccountId; /// An instruction to do something. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub struct Transaction { /// Who is sending. pub from: AccountId, diff --git a/substrate/test-runtime/src/unchecked_transaction.rs b/substrate/test-runtime/src/unchecked_transaction.rs index 0aff8d472738e..69a5f61c2da7d 100644 --- a/substrate/test-runtime/src/unchecked_transaction.rs +++ b/substrate/test-runtime/src/unchecked_transaction.rs @@ -22,7 +22,7 @@ use super::{Signature, Transaction}; /// A transactions right from the external world. Unchecked. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub struct UncheckedTransaction { /// The actual transaction information. pub tx: Transaction, From 089367d01c6c55996cdf4efaa97f1185be01d220 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 29 May 2018 17:29:16 +0200 Subject: [PATCH 20/60] mostly port test-runtime to get compiling for std --- Cargo.lock | 1 + .../release/demo_runtime.compact.wasm | Bin 236579 -> 238470 bytes .../release/demo_runtime.wasm | Bin 258367 -> 260135 bytes substrate/client/src/client.rs | 16 +-- substrate/client/src/genesis.rs | 19 ++-- .../release/runtime_test.compact.wasm | Bin 11122 -> 11129 bytes .../release/runtime_test.wasm | Bin 11790 -> 11797 bytes substrate/runtime/executive/src/lib.rs | 2 +- substrate/runtime/system/src/lib.rs | 4 +- substrate/test-client/Cargo.toml | 1 + substrate/test-client/src/client_ext.rs | 26 ++--- substrate/test-client/src/lib.rs | 5 +- substrate/test-runtime/src/lib.rs | 52 +++++++--- substrate/test-runtime/src/system.rs | 55 +++++----- substrate/test-runtime/src/transaction.rs | 83 --------------- .../test-runtime/src/unchecked_transaction.rs | 97 ------------------ substrate/test-runtime/wasm/Cargo.lock | 28 +++++ substrate/test-runtime/wasm/Cargo.toml | 2 + 18 files changed, 134 insertions(+), 257 deletions(-) delete mode 100644 substrate/test-runtime/src/transaction.rs delete mode 100644 substrate/test-runtime/src/unchecked_transaction.rs diff --git a/Cargo.lock b/Cargo.lock index 3c85e1cf724d8..5560fee2b08ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2242,6 +2242,7 @@ dependencies = [ "substrate-executor 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", "substrate-test-runtime 0.1.0", ] diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 9867a123434674abbaa9a29e5c2c064b17fc9940..ec2a25162238b218ebc80a238a12954f458f783f 100644 GIT binary patch delta 70044 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

r(HymmF#$Eh!v3~5#>CV1x2>!UBOHXO1pYm+ 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 diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index 24a2fb9a4402c8cd485ae65a4ed21936deb5c907..1e72b77bd431dfea33d8d36cffd54337f456aa6c 100755 GIT binary patch delta 73712 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 delta 71458 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 d*K{<9C&aMCe diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index c445705112754..6c20bbbf2272a 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -465,7 +465,6 @@ mod tests { use super::*; use codec::Slicable; use keyring::Keyring; - use primitives::block::Extrinsic as PrimitiveExtrinsic; use test_client::{self, TestClient}; use test_client::client::BlockOrigin; use test_client::runtime as test_runtime; @@ -505,14 +504,9 @@ mod tests { assert_eq!(client.using_environment(|| test_runtime::system::latest_block_hash()).unwrap(), client.block_hash(1).unwrap().unwrap()); } - trait Signable { - fn signed(self) -> PrimitiveExtrinsic; - } - impl Signable for Transaction { - fn signed(self) -> PrimitiveExtrinsic { - let signature = Keyring::from_raw_public(self.from.clone()).unwrap().sign(&self.encode()); - PrimitiveExtrinsic::decode(&mut UncheckedTransaction { signature, tx: self }.encode().as_ref()).unwrap() - } + fn sign_tx(tx: Transaction) -> UncheckedTransaction { + let signature = Keyring::from_raw_public(tx.from.clone()).unwrap().sign(&tx.encode()); + UncheckedTransaction { tx, signature } } #[test] @@ -521,12 +515,12 @@ mod tests { let mut builder = client.new_block().unwrap(); - builder.push(Transaction { + builder.push(sign_tx(Transaction { from: Keyring::Alice.to_raw_public(), to: Keyring::Ferdie.to_raw_public(), amount: 42, nonce: 0 - }.signed()).unwrap(); + })).unwrap(); client.justify_and_import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index d25b08947bc48..775c86609b842 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -43,7 +43,6 @@ pub fn construct_genesis_block< mod tests { use super::*; use codec::{Slicable, Joiner}; - use runtime_support::Hashable; use keyring::Keyring; use executor::WasmExecutor; use state_machine::{execute, OverlayedChanges}; @@ -75,7 +74,7 @@ mod tests { extrinsics_root, digest: Digest { logs: vec![], }, }; - let hash = header.blake2_256(); + let hash = header.hash(); let mut overlay = OverlayedChanges::default(); @@ -84,7 +83,7 @@ mod tests { backend, &mut overlay, &Executor::new(), - "execute_transaction", + "apply_extrinsic", &vec![].and(&header).and(tx) ).unwrap(); header = Header::decode(&mut &ret_data[..]).unwrap(); @@ -99,7 +98,7 @@ mod tests { ).unwrap(); header = Header::decode(&mut &ret_data[..]).unwrap(); - (vec![].and(&Block { header, transactions }), hash.into()) + (vec![].and(&Block { header, extrinsics: transactions }), hash) } fn block1(genesis_hash: Hash, backend: &InMemory) -> (Vec, Hash) { @@ -122,8 +121,8 @@ mod tests { let mut storage = GenesisConfig::new_simple( vec![Keyring::One.to_raw_public(), Keyring::Two.to_raw_public()], 1000 ).genesis_map(); - let block = construct_genesis_block(&storage); - let genesis_hash = block.header.blake2_256().into(); + let block = construct_genesis_block::(&storage); + let genesis_hash = block.header.hash(); storage.extend(additional_storage_with_genesis(&block).into_iter()); let backend = InMemory::from(storage); @@ -144,8 +143,8 @@ mod tests { let mut storage = GenesisConfig::new_simple( vec![Keyring::One.to_raw_public(), Keyring::Two.to_raw_public()], 1000 ).genesis_map(); - let block = construct_genesis_block(&storage); - let genesis_hash = block.header.blake2_256().into(); + let block = construct_genesis_block::(&storage); + let genesis_hash = block.header.hash(); storage.extend(additional_storage_with_genesis(&block).into_iter()); let backend = InMemory::from(storage); @@ -167,8 +166,8 @@ mod tests { let mut storage = GenesisConfig::new_simple( vec![Keyring::One.to_raw_public(), Keyring::Two.to_raw_public()], 68 ).genesis_map(); - let block = construct_genesis_block(&storage); - let genesis_hash = block.header.blake2_256().into(); + let block = construct_genesis_block::(&storage); + let genesis_hash = block.header.hash(); storage.extend(additional_storage_with_genesis(&block).into_iter()); let backend = InMemory::from(storage); diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index 419bf1b2cb8036f0bbac2698a687f3fde12b8421..2fa0b4b8bda8f3083376982bf4a47f5f82d11104 100644 GIT binary patch delta 1178 zcmY+B-)kII6vywK-E6X1+uYeCZPTR5>?Uq@lcu>pX71eCzGMmwij`KR(I?HlGk4mi z*=&fRpr|SM<57#(w<0S30V(W5-%5QDY*Fw-J-QWw9b2i}X-5cW| zz6mZ?^Ao_C^WZ)ZZ*?ZRcOX3Y$waZxwI7raGL61>pWiB0KnyCd6n|TcOUQ|TD#l$N z@F41n?-t{356oXmtM(^?6tYEVl@K&!mhh~R9FQKY^Og|{)!3kLE0%&@7oI7R{oq^l$xx;X) zGvbawxMfD%d9zXe+D2#lKeO`izzY!Wm{$fj-EVriQ@1bu&JtUG-)SDW;n>Othv>dL zy>SjrT2(B?KN>NlplhxUE&flxYkCgPL$`DK@DF+TM~9BR3gI=g>Ahe4FmH#y+*8^% zrz)5F*V;<2t0V{?e>oKW}bVo-w1mb!3pa;ks$Du)isGS%&;gITDq02zT7_{mzUc~v$=Nq;pXiILn2g6 z*t0T*Bb7v{xz(s6!ZS%#D22?p#3D6t>Nyt+VmFd8MiLdOfF3ombI@F#`T(iG{*JRy Yh7k#|;$~(#Kt9D`s-#bStpyIn-*0>?^Z)<= delta 1179 zcmZuuJ!~9B7@gTW+qXVK=FWDEW5>C(9sABE_WbPZ&Nvdv@?!;o6etKZfM;fRO%mIY zQn)|~ra`1Zkupd`im0HVGw3ABkcN(*1Ibb(XhMOIfXJeWA{5}WV+tgyH}8G#`{sQ! z_s{%s=F{H;yyNc%3;slT*4r^|q9(4U--T(F1nG}q+S5P{ zOnTBgVcJK6Mv$U7Ko)A5LFN_gt zptO80MGNT9@WdYL1$G=g2>l9K7`as?6A)$qRmC9m4+3^84|yBJUEj6R zL%sy{7VvezQ-BqWPzd-J@HxPL{ii`60=@|S{eVyJV-vvxkN;0$3N)C3&?9}TXV=f4 zU0*2$SIX!eQeHP}IeyT&G$}BlGBdnjjHxK2nkN2>sp&eUQBhEB4QGYqijwC%oo@Ky zW25yrj)c@1?WB>hlw3If z8JH83M-ht{v}93X>B!<`BXM&vFNetYKGhIWZdw02A~p;)Aj_O6-L)eEjsE-vPI^QwQMmCxl7%@o&^6W4=#QOKzg0O@}CXOJfkUTcjciSx@ z;S&l5Np@Gsl=GF@murP)QaeKnDQ&b5peKaRYtW`{b K7D8Aha{Uh>UluC> diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm index cb9c1fab1bf4833ac35deba2d914f9a825d93a17..7a9b06afaf2e4a2f46a573a5b5d525e3dfac54a8 100755 GIT binary patch delta 1101 zcmY+BTWDNG7{}-AZZ5m4WcJca5@~l6V>a1b=62@H=tDWdQ>lm-d?-k}PXjeP+#lX5hJ85K$c0GeQ1}~k@KEiJ z>yKiXZ{)XKf5EF*@7XL$gc>L;%!gd9iYj=dHuV%6|B}`i+aeu6^p{3-zZxZxe3sxKjDHBy%m- z)pw4>@%!$FJFn)Pb7hd-eZ3Us@w8LbeE1W5FlfCx>>ld;Prn6chxU8*?w3P97Q8>Z zSN1;dd22A$e7*Q~!3}!4zq|pTH&<#)i#AdZ!| ze8KYz2vrb5BaSu4n>mDf96xb+-SMmbe{%}+qr=gYPU-g$DmwN$TicO3ZoTlB(|0(| zxxD1~$Q?Fayyw3mV1C_CZ#^psWsM`7=9Ul z5U0KsQgF?vuau1g*w->R352oKPb_CP-4fSY(SXcEW~3H2Ad2xA3KN|w&6uBLTxt_g zPOOOxak<3yOP&b|w zSu}I}_{xbHC5e*0P+Bq`5Y5~+TT_RhdQ`-VOQ}9-7LLWw99uZzZ$~sZ%CuW%Muj$# zDn(=1*B-&daw^>(4GA>YiH2v}lbA>m_;I4FyJ8Ya;r;f#m@<-)SY&}RS_f3Z4{e22 zV7YR?#5vJ6)(MPH&0#7t!)#!b$)q7Ffm2fpRidcdLdH3bZD4&CF?cJt3-I*2HS4>2 jk_RTxG$2++_aA^4r^n#u=~_iF5+v3LCel=qKt=xmJa!^m delta 1134 zcmZuuPiS049G8lXW0(#!P$R(Q^k$e2;zFa4qPT$4UwjwW zYxi8ghH0@;+;aWl-^6P7Mi?X1KxyejissQ@;r=bQ4cIKY9r~Z~{MeTjJOy)iqDl!J z2r2^z)2)0re7pJ#yyCU$IHbH#-4z6D{z7%Z|2=#iPS&FKcdS@AQ$m+UN=KR4oB7z>GE8YOlRE6 z&Y1sd@@S1Jon;XrFx4bX(@uSB;3y0fGL}wRp+zhN?4XlLmM21Ko#)&+6Z!4a-Qi5|#42iXr4ubI?KC#8!-6nss3nwY?rg^W z@6&dNvWZQUvQ$tmY2=U2%oNTA_qWt?5y>P|gyu>nisYTS#l_{5bCf13iaCMcET)QZ z0vjJ|J%lss7=ht}vMfuY#4ofaurXX~Xc0LfO7h6R+?v78FlND}v@<#Un*X@97spO9 zo->x^vEe2${#Hw3nvh7x5v1dS#hUoJ_5m#57jg<2Hsfc~`jvJM=ZXqtHHm1F2x+yy i)BYU8c4U@FVKPZ1SHfSN-CvEBj0w=3b0fJ^oqquX$shdy diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 66615d877c06d..764cfca60af9f 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -60,7 +60,7 @@ pub struct Executive< impl< System: system::Trait, - Block: traits::Block

, + Block: traits::Block
, Payment: MakePayment, Finalisation: Executable, > Executive where diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index bf14ab1dff942..cc790246e0a18 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -60,8 +60,8 @@ pub fn extrinsics_data_root(xts: Vec>) -> H::Output { pub trait Trait { type Index: Parameter + Member + Default + SimpleArithmetic + Copy; - type BlockNumber: Parameter + Member + MaybeDisplay + SimpleArithmetic + Default + Bounded + Copy; - type Hash: Parameter + Member + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual; + type BlockNumber: Parameter + Member + MaybeDisplay + SimpleArithmetic + Default + Bounded + Copy + rstd::hash::Hash; + type Hash: Parameter + Member + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual + rstd::hash::Hash; type Hashing: Hashing; type Digest: Parameter + Member + Default + traits::Digest; type AccountId: Parameter + Member + Ord + Default; diff --git a/substrate/test-client/Cargo.toml b/substrate/test-client/Cargo.toml index e12149fc2c547..bec520419f48e 100644 --- a/substrate/test-client/Cargo.toml +++ b/substrate/test-client/Cargo.toml @@ -12,3 +12,4 @@ substrate-keyring = { path = "../../substrate/keyring" } substrate-primitives = { path = "../primitives" } substrate-runtime-support = { path = "../runtime-support" } substrate-test-runtime = { path = "../test-runtime" } +substrate-runtime-primitives = { path = "../runtime/primitives" } diff --git a/substrate/test-client/src/client_ext.rs b/substrate/test-client/src/client_ext.rs index 3af87c4db4fcc..a5301a01b2f65 100644 --- a/substrate/test-client/src/client_ext.rs +++ b/substrate/test-client/src/client_ext.rs @@ -19,9 +19,9 @@ use codec::Slicable; use client::{self, Client}; use keyring::Keyring; -use runtime_support::Hashable; use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; -use primitives::block; +use runtime_primitives::traits::Header; +use runtime; use bft; use {Backend, Executor, NativeExecutor}; @@ -31,26 +31,26 @@ pub trait TestClient { fn new_for_tests() -> Self; /// Justify and import block to the chain. - fn justify_and_import(&self, origin: client::BlockOrigin, block: block::Block) -> client::error::Result<()>; + fn justify_and_import(&self, origin: client::BlockOrigin, block: runtime::Block) -> client::error::Result<()>; /// Returns hash of the genesis block. - fn genesis_hash(&self) -> block::HeaderHash; + fn genesis_hash(&self) -> runtime::Hash; } -impl TestClient for Client { +impl TestClient for Client { fn new_for_tests() -> Self { client::new_in_mem(NativeExecutor::new(), prepare_genesis).unwrap() } - fn justify_and_import(&self, origin: client::BlockOrigin, block: block::Block) -> client::error::Result<()> { + fn justify_and_import(&self, origin: client::BlockOrigin, block: runtime::Block) -> client::error::Result<()> { let justification = fake_justify(&block.header); let justified = self.check_justification(block.header, justification)?; - self.import_block(origin, justified, Some(block.transactions))?; + self.import_block(origin, justified, Some(block.extrinsics))?; Ok(()) } - fn genesis_hash(&self) -> block::HeaderHash { + fn genesis_hash(&self) -> runtime::Hash { self.block_hash(0).unwrap().unwrap() } } @@ -61,8 +61,8 @@ impl TestClient for Client { /// headers. /// TODO: remove this in favor of custom verification pipelines for the /// client -fn fake_justify(header: &block::Header) -> bft::UncheckedJustification { - let hash = header.blake2_256().into(); +fn fake_justify(header: &runtime::Header) -> bft::UncheckedJustification { + let hash = header.hash(); let authorities = vec![ Keyring::Alice.into(), Keyring::Bob.into(), @@ -72,7 +72,7 @@ fn fake_justify(header: &block::Header) -> bft::UncheckedJustification { bft::UncheckedJustification { digest: hash, signatures: authorities.iter().map(|key| { - let msg = bft::sign_message( + let msg = bft::sign_message::( bft::generic::Vote::Commit(1, hash).into(), key, header.parent_hash @@ -95,13 +95,13 @@ fn genesis_config() -> GenesisConfig { ], 1000) } -fn prepare_genesis() -> (block::Header, Vec<(Vec, Vec)>) { +fn prepare_genesis() -> (runtime::Header, Vec<(Vec, Vec)>) { let mut storage = genesis_config().genesis_map(); let block = client::genesis::construct_genesis_block(&storage); storage.extend(additional_storage_with_genesis(&block)); ( - block::Header::decode(&mut block.header.encode().as_ref()) + runtime::Header::decode(&mut block.header.encode().as_ref()) .expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect() ) diff --git a/substrate/test-client/src/lib.rs b/substrate/test-client/src/lib.rs index 123a8a6398699..4055ea6182c83 100644 --- a/substrate/test-client/src/lib.rs +++ b/substrate/test-client/src/lib.rs @@ -23,6 +23,7 @@ extern crate substrate_codec as codec; extern crate substrate_keyring as keyring; extern crate substrate_primitives as primitives; extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as runtime_primitives; #[macro_use] extern crate substrate_executor as executor; pub extern crate substrate_test_runtime as runtime; @@ -43,12 +44,12 @@ mod native_executor { pub use self::native_executor::NativeExecutor; /// Test client database backend. -pub type Backend = client::in_mem::Backend; +pub type Backend = client::in_mem::Backend; /// Test client executor. pub type Executor = executor::NativeExecutor; /// Creates new client instance used for tests. -pub fn new() -> client::Client { +pub fn new() -> client::Client { TestClient::new_for_tests() } diff --git a/substrate/test-runtime/src/lib.rs b/substrate/test-runtime/src/lib.rs index 92fc370a4e418..36ce2698748e3 100644 --- a/substrate/test-runtime/src/lib.rs +++ b/substrate/test-runtime/src/lib.rs @@ -45,28 +45,54 @@ extern crate substrate_runtime_io as runtime_io; #[cfg(feature = "std")] pub mod genesismap; pub mod system; -mod transaction; -mod unchecked_transaction; use rstd::prelude::*; use codec::Slicable; -use primitives::AuthorityId; -use primitives::hash::H512; +use runtime_primitives::traits::BlakeTwo256; +use runtime_primitives::Ed25519Signature; pub use primitives::hash::H256; -pub use transaction::Transaction; -pub use unchecked_transaction::UncheckedTransaction; -/// A test block. -pub type Block = runtime_primitives::testing::Block; -/// A test block's header. -pub type Header = runtime_primitives::testing::Header; +/// Calls in transactions. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Call { + pub to: AccountId, + pub amount: u64, +} + +impl Slicable for Call { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + self.to.using_encoded(|s| v.extend(s)); + self.amount.using_encoded(|s| v.extend(s)); + v + } + + fn decode(input: &mut I) -> Option { + Slicable::decode(input).map(|(to, amount)| Call { to, amount }) + } +} + /// An identifier for an account on this system. -pub type AccountId = AuthorityId; -/// Signature for our transactions. -pub type Signature = H512; +pub type AccountId = H256; /// A simple hash type for all our hashing. pub type Hash = H256; +/// The block number type used in this runtime. +pub type BlockNumber = u64; +/// Index of a transaction. +pub type Index = u64; +/// The digest of a block. +pub type Digest = runtime_primitives::generic::Digest>; +/// A test block. +pub type Block = runtime_primitives::generic::Block, AccountId, Index, Call, Ed25519Signature>; +/// A test block's header. +pub type Header = runtime_primitives::generic::Header>; +/// Extrinsic +pub type Extrinsic = runtime_primitives::generic::Extrinsic; +/// Signed extrinsic. +pub type UncheckedExtrinsic = runtime_primitives::generic::UncheckedExtrinsic; + /// Run whatever tests we have. pub fn run_tests(mut input: &[u8]) -> Vec { diff --git a/substrate/test-runtime/src/system.rs b/substrate/test-runtime/src/system.rs index ad7cf92303200..d962fa6cdb943 100644 --- a/substrate/test-runtime/src/system.rs +++ b/substrate/test-runtime/src/system.rs @@ -21,7 +21,7 @@ use rstd::prelude::*; use runtime_io::{storage_root, enumerated_trie_root, ed25519_verify}; use runtime_support::{Hashable, storage}; use codec::{KeyedVec, Slicable}; -use super::{AccountId, UncheckedTransaction, H256 as Hash, Block, Header}; +use super::{AccountId, Call, UncheckedExtrinsic, H256 as Hash, Block, Header}; const NONCE_OF: &[u8] = b"nonce:"; const BALANCE_OF: &[u8] = b"balance:"; @@ -70,7 +70,7 @@ pub fn execute_block(block: Block) { /// Execute a transaction outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. -pub fn execute_transaction(utx: UncheckedTransaction, header: Header) -> Header { +pub fn execute_transaction(utx: UncheckedExtrinsic, header: Header) -> Header { execute_transaction_backend(&utx); header } @@ -82,31 +82,36 @@ pub fn finalise_block(mut header: Header) -> Header { header } -fn execute_transaction_backend(utx: &UncheckedTransaction) { +fn execute_transaction_backend(utx: &UncheckedExtrinsic) { + use runtime_primitives::traits::Checkable; + // check signature - let ref tx = utx.tx; - let msg = ::codec::Slicable::encode(tx); - assert!(ed25519_verify(&utx.signature.0, &msg, &tx.from), - "All transactions should be properly signed"); + let utx = match utx.clone().check() { + Ok(tx) => tx, + Err(_) => panic!("All transactions should be properly signed"), + }; + + let ref tx = utx.as_unchecked().extrinsic; // check nonce - let nonce_key = tx.from.to_keyed_vec(NONCE_OF); + let nonce_key = tx.signed.to_keyed_vec(NONCE_OF); let expected_nonce: u64 = storage::get_or(&nonce_key, 0); - assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); + assert!(tx.index == expected_nonce, "All transactions should have the correct nonce"); // increment nonce in storage storage::put(&nonce_key, &(expected_nonce + 1)); // check sender balance - let from_balance_key = tx.from.to_keyed_vec(BALANCE_OF); + let from_balance_key = tx.signed.to_keyed_vec(BALANCE_OF); let from_balance: u64 = storage::get_or(&from_balance_key, 0); - assert!(tx.amount <= from_balance, "All transactions should transfer at most the sender balance"); // enact transfer - let to_balance_key = tx.to.to_keyed_vec(BALANCE_OF); + let Call { to, amount } = tx.function.clone(); + assert!(amount <= from_balance, "All transactions should transfer at most the sender balance"); + let to_balance_key = to.to_keyed_vec(BALANCE_OF); let to_balance: u64 = storage::get_or(&to_balance_key, 0); - storage::put(&from_balance_key, &(from_balance - tx.amount)); - storage::put(&to_balance_key, &(to_balance + tx.amount)); + storage::put(&from_balance_key, &(from_balance - amount)); + storage::put(&to_balance_key, &(to_balance + amount)); } #[cfg(feature = "std")] @@ -134,7 +139,7 @@ mod tests { use codec::{Joiner, KeyedVec}; use keyring::Keyring; use runtime_primitives::testing::Digest; - use ::{Header, Transaction, UncheckedTransaction}; + use ::{Header, Extrinsic, UncheckedExtrinsic}; fn new_test_ext() -> TestExternalities { map![ @@ -147,9 +152,9 @@ mod tests { ] } - fn construct_signed_tx(tx: Transaction) -> UncheckedTransaction { - let signature = Keyring::from_raw_public(tx.from).unwrap().sign(&tx.encode()); - UncheckedTransaction { tx, signature } + fn construct_signed_tx(tx: Extrinsic) -> UncheckedExtrinsic { + let signature = Keyring::from_raw_public(tx.signed).unwrap().sign(&tx.encode()); + UncheckedExtrinsic { tx, signature } } #[test] @@ -192,7 +197,7 @@ mod tests { digest: Digest { logs: vec![], }, }, extrinsics: vec![ - construct_signed_tx(Transaction { + construct_signed_tx(Extrinsic { from: Keyring::Alice.to_raw_public(), to: Keyring::Bob.to_raw_public(), amount: 69, @@ -217,17 +222,17 @@ mod tests { digest: Digest { logs: vec![], }, }, extrinsics: vec![ - construct_signed_tx(Transaction { - from: Keyring::Bob.to_raw_public(), + construct_signed_tx(Extrinsic { + signed: Keyring::Bob.to_raw_public().into(), to: Keyring::Alice.to_raw_public(), amount: 27, - nonce: 0, + index: 0, }), - construct_signed_tx(Transaction { - from: Keyring::Alice.to_raw_public(), + construct_signed_tx(Extrinsic { + signed: Keyring::Alice.to_raw_public(), to: Keyring::Charlie.to_raw_public(), amount: 69, - nonce: 1, + index: 1, }) ], }; diff --git a/substrate/test-runtime/src/transaction.rs b/substrate/test-runtime/src/transaction.rs deleted file mode 100644 index 4e5a65a9b1c7a..0000000000000 --- a/substrate/test-runtime/src/transaction.rs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! A toy transaction. - -use rstd::prelude::*; -use codec::{Input, Slicable, Joiner}; -use super::AccountId; - -/// An instruction to do something. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct Transaction { - /// Who is sending. - pub from: AccountId, - /// Who to send to. - pub to: AccountId, - /// How much to send. - pub amount: u64, - /// How many transactions `self.from` already sent. - pub nonce: u64, -} - -impl Slicable for Transaction { - fn decode(input: &mut I) -> Option { - Some(Transaction { - from: Slicable::decode(input)?, - to: Slicable::decode(input)?, - amount: Slicable::decode(input)?, - nonce: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - Vec::new() - .and(&self.from) - .and(&self.to) - .and(&self.amount) - .and(&self.nonce) - } -} - - - -#[cfg(test)] -mod tests { - use super::*; - use keyring::Keyring; - - #[test] - fn test_tx_encoding() { - let tx = Transaction { - from: Keyring::Alice.to_raw_public(), - to: Keyring::Bob.to_raw_public(), - amount: 69, - nonce: 33, - }; - - assert_eq!(tx.encode(), vec![ - // from - 209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79, - // to - 215, 86, 142, 95, 10, 126, 218, 103, 168, 38, 145, 255, 55, 154, 196, 187, 164, 249, 201, 184, 89, 254, 119, 155, 93, 70, 54, 59, 97, 173, 45, 185, - // amount - 69, 0, 0, 0, 0, 0, 0, 0, - // nonce - 33, 0, 0, 0, 0, 0, 0, 0 - ]); - } -} diff --git a/substrate/test-runtime/src/unchecked_transaction.rs b/substrate/test-runtime/src/unchecked_transaction.rs deleted file mode 100644 index 69a5f61c2da7d..0000000000000 --- a/substrate/test-runtime/src/unchecked_transaction.rs +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! A toy unchecked transaction complete with signature. - -use rstd::prelude::*; -use codec::{Input, Slicable}; -use super::{Signature, Transaction}; - -/// A transactions right from the external world. Unchecked. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct UncheckedTransaction { - /// The actual transaction information. - pub tx: Transaction, - /// The signature; should be an Ed25519 signature applied to the serialised `transaction` field. - pub signature: Signature, -} - -impl Slicable for UncheckedTransaction { - fn decode(input: &mut I) -> Option { - // This is a little more complicated than usua since the binary format must be compatible - // with substrate's generic `Vec` type. Basically this just means accepting that there - // will be a prefix of u32, which has the total number of bytes following (we don't need - // to use this). - let _length_do_not_remove_me_see_above: u32 = Slicable::decode(input)?; - Some(UncheckedTransaction { - tx: Slicable::decode(input)?, - signature: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - // need to prefix with the total length as u32 to ensure it's binary comptible with - // Vec. we'll make room for it here, then overwrite once we know the length. - v.extend(&[0u8; 4]); - - self.tx.using_encoded(|s| v.extend(s)); - self.signature.using_encoded(|s| v.extend(s)); - - let length = (v.len() - 4) as u32; - length.using_encoded(|s| v[0..4].copy_from_slice(s)); - - v - } -} - - - -#[cfg(test)] -mod tests { - use super::*; - use keyring::Keyring; - use ::Transaction; - - #[test] - fn test_unchecked_encoding() { - let tx = Transaction { - from: Keyring::Alice.to_raw_public(), - to: Keyring::Bob.to_raw_public(), - amount: 69, - nonce: 34, - }; - let signature = Keyring::from_raw_public(tx.from).unwrap().sign(&tx.encode()); - let signed = UncheckedTransaction { tx, signature }; - - assert_eq!(signed.encode(), vec![ - // length - 144, 0, 0, 0, - // from - 209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79, - // to - 215, 86, 142, 95, 10, 126, 218, 103, 168, 38, 145, 255, 55, 154, 196, 187, 164, 249, 201, 184, 89, 254, 119, 155, 93, 70, 54, 59, 97, 173, 45, 185, - // amount - 69, 0, 0, 0, 0, 0, 0, 0, - // nonce - 34, 0, 0, 0, 0, 0, 0, 0, - // signature - 207, 69, 156, 55, 7, 227, 202, 3, 114, 111, 43, 46, 227, 38, 39, 122, 245, 69, 195, 117, 190, 154, 89, 76, 134, 91, 251, 230, 31, 221, 1, 194, 144, 34, 33, 58, 220, 154, 205, 135, 224, 52, 248, 198, 12, 17, 96, 53, 110, 160, 194, 10, 9, 60, 40, 133, 57, 112, 151, 200, 105, 198, 245, 10 - ]); - } -} diff --git a/substrate/test-runtime/wasm/Cargo.lock b/substrate/test-runtime/wasm/Cargo.lock index a51ab7129cfc5..b24b94b209b9f 100644 --- a/substrate/test-runtime/wasm/Cargo.lock +++ b/substrate/test-runtime/wasm/Cargo.lock @@ -179,6 +179,11 @@ dependencies = [ "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "integer-sqrt" +version = "0.1.0" +source = "git+https://github.com/paritytech/integer-sqrt-rs.git#886e9cb983c46498003878afe965d55caa762025" + [[package]] name = "keccak-hash" version = "0.1.1" @@ -225,6 +230,11 @@ name = "nodrop" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "num-traits" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "num_cpus" version = "1.8.0" @@ -473,6 +483,21 @@ dependencies = [ "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-runtime-primitives" +version = "0.1.0" +dependencies = [ + "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", + "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", +] + [[package]] name = "substrate-runtime-std" version = "0.1.0" @@ -516,6 +541,7 @@ dependencies = [ "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", ] @@ -645,6 +671,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" "checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" +"checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" "checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" @@ -652,6 +679,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" +"checksum num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775393e285254d2f5004596d69bb8bc1149754570dcc08cf30cabeba67955e28" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4dc02a80a0315b109e48992c46942c79bcdb8fac416dd575d330ed9ced6cbd" diff --git a/substrate/test-runtime/wasm/Cargo.toml b/substrate/test-runtime/wasm/Cargo.toml index 3d6a1de63ce41..99d86cd6a4c5b 100644 --- a/substrate/test-runtime/wasm/Cargo.toml +++ b/substrate/test-runtime/wasm/Cargo.toml @@ -12,6 +12,7 @@ substrate-runtime-std = { path = "../../runtime-std", default-features = false } substrate-runtime-io = { path = "../../runtime-io", default-features = false } substrate-runtime-support = { path = "../../runtime-support", default-features = false } substrate-primitives = { path = "../../primitives", default-features = false } +substrate-runtime-primitives = { path = "../../runtime/primitives", default-features = false } [features] default = [] @@ -24,6 +25,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-primitives/std", + "substrate-runtime-primitives/std" ] [lib] From 2a02f5381a92bdf5a2defc7534c3a7368086c633 Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 29 May 2018 17:57:27 +0200 Subject: [PATCH 21/60] Ensure `AccountId` has a `Default`. --- substrate/runtime/primitives/src/generic.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 21a70741b1869..64cfbb947e789 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -68,7 +68,7 @@ impl Slicable for Extrinsic wher #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize))] pub struct UncheckedExtrinsic where - AccountId: Member + MaybeDisplay, + AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member, // TODO: should be Option From 33bc80f8cb3f6f6095d2ec9940eefebe052ec688 Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 29 May 2018 18:25:06 +0200 Subject: [PATCH 22/60] Fix type deps. --- substrate/primitives/src/hash.rs | 10 ++- substrate/runtime/primitives/src/generic.rs | 86 +++++++++++---------- substrate/runtime/primitives/src/lib.rs | 6 +- 3 files changed, 57 insertions(+), 45 deletions(-) diff --git a/substrate/primitives/src/hash.rs b/substrate/primitives/src/hash.rs index 5503aa4198e13..48f84cf27fa94 100644 --- a/substrate/primitives/src/hash.rs +++ b/substrate/primitives/src/hash.rs @@ -48,6 +48,12 @@ macro_rules! impl_rest { self.0.using_encoded(f) } } +/* + impl Default for $name { + fn default() -> Self { + Self::new() + } + }*/ } } @@ -66,7 +72,7 @@ mod tests { #[test] fn test_h160() { let tests = vec![ - (H160::from(0), "0x0000000000000000000000000000000000000000"), + (Default::default(), "0x0000000000000000000000000000000000000000"), (H160::from(2), "0x0000000000000000000000000000000000000002"), (H160::from(15), "0x000000000000000000000000000000000000000f"), (H160::from(16), "0x0000000000000000000000000000000000000010"), @@ -84,7 +90,7 @@ mod tests { #[test] fn test_h256() { let tests = vec![ - (H256::from(0), "0x0000000000000000000000000000000000000000000000000000000000000000"), + (Default::default(), "0x0000000000000000000000000000000000000000000000000000000000000000"), (H256::from(2), "0x0000000000000000000000000000000000000000000000000000000000000002"), (H256::from(15), "0x000000000000000000000000000000000000000000000000000000000000000f"), (H256::from(16), "0x0000000000000000000000000000000000000000000000000000000000000010"), diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 64cfbb947e789..35a35f93c6183 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -28,7 +28,7 @@ use rstd::ops; #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct Extrinsic where - AccountId: Member + MaybeDisplay, + AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, { @@ -41,7 +41,7 @@ pub struct Extrinsic where } impl Slicable for Extrinsic where - AccountId: Member + Slicable + MaybeDisplay, + AccountId: Member + Default + Slicable + MaybeDisplay, Index: Member + Slicable + MaybeDisplay + SimpleArithmetic, Call: Member + Slicable { @@ -79,11 +79,36 @@ pub struct UncheckedExtrinsic where pub signature: Signature, } +impl traits::Checkable for UncheckedExtrinsic where + AccountId: Member + Default + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, + Call: Member, + Signature: Member + Default + traits::Verify, + Extrinsic: Slicable, +{ + type Checked = CheckedExtrinsic; + + fn check(self) -> Result { + if !self.is_signed() { + Ok(CheckedExtrinsic(self)) + } else { + if ::codec::Slicable::using_encoded(&self.extrinsic, |msg| + self.signature.verify(msg, &self.extrinsic.signed) + ) { + Ok(CheckedExtrinsic(self)) + } else { + Err(self) + } + } + } +} + impl UncheckedExtrinsic where AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, - Signature: Member + Default, + Signature: Member + Default + traits::Verify, + Extrinsic: Slicable, { /// Is this extrinsic signed? pub fn is_signed(&self) -> bool { @@ -93,7 +118,7 @@ impl UncheckedExtrinsic Slicable for UncheckedExtrinsic where - AccountId: Member + MaybeDisplay, + AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member + Slicable, @@ -135,7 +160,7 @@ impl Slicable for UncheckedExtrinsic fmt::Debug for UncheckedExtrinsic where - AccountId: Member + MaybeDisplay, + AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member, @@ -145,44 +170,20 @@ impl fmt::Debug for UncheckedExtrinsic traits::Checkable for UncheckedExtrinsic where - AccountId: Member + Default + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, - Signature: Member + Default + traits::Verify + Slicable, - Extrinsic: Slicable, -{ - type Checked = CheckedExtrinsic; - - fn check(self) -> Result { - if !self.is_signed() { - Ok(CheckedExtrinsic(self)) - } else { - if ::codec::Slicable::using_encoded(&self.extrinsic, |msg| - self.signature.verify(msg, &self.extrinsic.signed) - ) { - Ok(CheckedExtrinsic(self)) - } else { - Err(self) - } - } - } -} - /// A type-safe indicator that a extrinsic has been checked. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct CheckedExtrinsic (UncheckedExtrinsic) where - AccountId: Member + MaybeDisplay, + AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member; impl CheckedExtrinsic where - AccountId: Member + MaybeDisplay, + AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member @@ -206,7 +207,7 @@ where impl ops::Deref for CheckedExtrinsic where - AccountId: Member + MaybeDisplay, + AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member @@ -221,7 +222,7 @@ where impl traits::Applyable for CheckedExtrinsic where - AccountId: Member + MaybeDisplay, + AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member + AuxDispatchable, Signature: Member @@ -387,10 +388,13 @@ pub struct Block Hashing: HashingT, DigestItem: Member + Default, ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, - AccountId: Member + MaybeDisplay, + AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, - Signature: Member + Signature: Member + Default + traits::Verify, + Header: traits::Header, + UncheckedExtrinsic: Slicable, + Extrinsic: Slicable, { /// The block header. pub header: Header, @@ -405,12 +409,13 @@ where Hashing: HashingT, DigestItem: Member + Default, ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, - AccountId: Member + MaybeDisplay, + AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, - Signature: Member, - Header: Slicable, + Signature: Member + Default + traits::Verify, + Header: traits::Header, UncheckedExtrinsic: Slicable, + Extrinsic: Slicable, { fn decode(input: &mut I) -> Option { Some(Block { @@ -434,12 +439,13 @@ where Hashing::Output: ::rstd::hash::Hash, DigestItem: Member + Default, ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, - AccountId: Member + MaybeDisplay, + AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, - Signature: Member, + Signature: Member + Default + traits::Verify, Header: traits::Header, UncheckedExtrinsic: Slicable, + Extrinsic: Slicable, { type Extrinsic = UncheckedExtrinsic; type Header = Header; diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 5f1c05cf912be..670afefe44b53 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -37,7 +37,7 @@ extern crate substrate_primitives; #[cfg(feature = "std")] use std::collections::HashMap; -use substrate_primitives::hash::H512; +use substrate_primitives::hash::{H256, H512}; #[cfg(feature = "std")] pub mod testing; @@ -59,9 +59,9 @@ pub trait BuildExternalities { #[cfg_attr(feature = "std", derive(Debug, Serialize))] pub struct Ed25519Signature(H512); impl traits::Verify for Ed25519Signature { - type Signer = [u8; 32]; + type Signer = H256; fn verify(&self, msg: &[u8], signer: &Self::Signer) -> bool { - runtime_io::ed25519_verify(&(self.0).0, msg, &signer[..]) + runtime_io::ed25519_verify(&(self.0).0, msg, &signer.0[..]) } } impl codec::Slicable for Ed25519Signature { From 096150a9e9fcdbb3e2d200afbd472daf6af71bf4 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 29 May 2018 19:25:30 +0200 Subject: [PATCH 23/60] finish porting --- substrate/test-runtime/src/lib.rs | 1 - substrate/test-runtime/src/system.rs | 44 +++++++++++++--------------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/substrate/test-runtime/src/lib.rs b/substrate/test-runtime/src/lib.rs index 36ce2698748e3..28e010dc653d6 100644 --- a/substrate/test-runtime/src/lib.rs +++ b/substrate/test-runtime/src/lib.rs @@ -93,7 +93,6 @@ pub type Extrinsic = runtime_primitives::generic::Extrinsic; - /// Run whatever tests we have. pub fn run_tests(mut input: &[u8]) -> Vec { use runtime_io::print; diff --git a/substrate/test-runtime/src/system.rs b/substrate/test-runtime/src/system.rs index d962fa6cdb943..de3a9cda2d921 100644 --- a/substrate/test-runtime/src/system.rs +++ b/substrate/test-runtime/src/system.rs @@ -18,7 +18,7 @@ //! and depositing logs. use rstd::prelude::*; -use runtime_io::{storage_root, enumerated_trie_root, ed25519_verify}; +use runtime_io::{storage_root, enumerated_trie_root}; use runtime_support::{Hashable, storage}; use codec::{KeyedVec, Slicable}; use super::{AccountId, Call, UncheckedExtrinsic, H256 as Hash, Block, Header}; @@ -138,8 +138,7 @@ mod tests { use runtime_io::{with_externalities, twox_128, TestExternalities}; use codec::{Joiner, KeyedVec}; use keyring::Keyring; - use runtime_primitives::testing::Digest; - use ::{Header, Extrinsic, UncheckedExtrinsic}; + use ::{Header, Digest, Extrinsic, UncheckedExtrinsic}; fn new_test_ext() -> TestExternalities { map![ @@ -153,8 +152,8 @@ mod tests { } fn construct_signed_tx(tx: Extrinsic) -> UncheckedExtrinsic { - let signature = Keyring::from_raw_public(tx.signed).unwrap().sign(&tx.encode()); - UncheckedExtrinsic { tx, signature } + let signature = Keyring::from_raw_public(tx.signed.0).unwrap().sign(&tx.encode()).into(); + UncheckedExtrinsic { extrinsic: tx, signature } } #[test] @@ -184,8 +183,8 @@ mod tests { let mut t = new_test_ext(); with_externalities(&mut t, || { - assert_eq!(balance_of(Keyring::Alice.to_raw_public()), 111); - assert_eq!(balance_of(Keyring::Bob.to_raw_public()), 0); + assert_eq!(balance_of(Keyring::Alice.to_raw_public().into()), 111); + assert_eq!(balance_of(Keyring::Bob.to_raw_public().into()), 0); }); let b = Block { @@ -193,15 +192,14 @@ mod tests { parent_hash: [69u8; 32].into(), number: 1, state_root: hex!("0dd8210adaf581464cc68555814a787ed491f8c608d0a0dbbf2208a6d44190b1").into(), - extrinsics_root: hex!("5e44188712452f900acfa1b4bf4084753122ea1856d58187dd33374a2ca653b1").into(), + extrinsics_root: hex!("65ed452ee5c22a1b3527658f921f9a052d5942762f6363a5ed6525bc017bad44").into(), digest: Digest { logs: vec![], }, }, extrinsics: vec![ construct_signed_tx(Extrinsic { - from: Keyring::Alice.to_raw_public(), - to: Keyring::Bob.to_raw_public(), - amount: 69, - nonce: 0, + signed: Keyring::Alice.to_raw_public().into(), + function: Call { to: Keyring::Bob.to_raw_public().into(), amount: 69 }, + index: 0, }) ], }; @@ -209,29 +207,27 @@ mod tests { with_externalities(&mut t, || { execute_block(b.clone()); - assert_eq!(balance_of(Keyring::Alice.to_raw_public()), 42); - assert_eq!(balance_of(Keyring::Bob.to_raw_public()), 69); + assert_eq!(balance_of(Keyring::Alice.to_raw_public().into()), 42); + assert_eq!(balance_of(Keyring::Bob.to_raw_public().into()), 69); }); let b = Block { header: Header { parent_hash: b.header.blake2_256().into(), number: 2, - state_root: hex!("aea7c370a9fa4075b703742c22cc4fb12759bdd7d5aa5cdd85895447f838b81b").into(), - extrinsics_root: hex!("9ac45fbcc93fa6a8b5a3c44f04d936d53569c72a53fbc12eb58bf884f6dbfae5").into(), + state_root: hex!("1bd77fc89d5380aad314df357f265a94a051be6b1f137bc9882d6b9edcbbd810").into(), + extrinsics_root: hex!("f6ba96c4df7fcfbcdf58d4ad6ca360dbf7894f17a7136894edb518c0c06829e6").into(), digest: Digest { logs: vec![], }, }, extrinsics: vec![ construct_signed_tx(Extrinsic { signed: Keyring::Bob.to_raw_public().into(), - to: Keyring::Alice.to_raw_public(), - amount: 27, + function: Call { to: Keyring::Alice.to_raw_public().into(), amount: 27 }, index: 0, }), construct_signed_tx(Extrinsic { - signed: Keyring::Alice.to_raw_public(), - to: Keyring::Charlie.to_raw_public(), - amount: 69, + signed: Keyring::Alice.to_raw_public().into(), + function: Call { to: Keyring::Charlie.to_raw_public().into(), amount: 69 }, index: 1, }) ], @@ -240,9 +236,9 @@ mod tests { with_externalities(&mut t, || { execute_block(b); - assert_eq!(balance_of(Keyring::Alice.to_raw_public()), 0); - assert_eq!(balance_of(Keyring::Bob.to_raw_public()), 42); - assert_eq!(balance_of(Keyring::Charlie.to_raw_public()), 69); + assert_eq!(balance_of(Keyring::Alice.to_raw_public().into()), 0); + assert_eq!(balance_of(Keyring::Bob.to_raw_public().into()), 42); + assert_eq!(balance_of(Keyring::Charlie.to_raw_public().into()), 69); }); } } From 4e49ef7bab4f13b79302f574eb5e31f8ed074e66 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 29 May 2018 20:04:43 +0200 Subject: [PATCH 24/60] initialize test_runtime from genesis correctly --- substrate/client/src/client.rs | 25 +++++++++--------- substrate/client/src/genesis.rs | 20 +++++++------- substrate/runtime/primitives/src/traits.rs | 2 +- substrate/test-client/src/client_ext.rs | 6 ++--- substrate/test-runtime/wasm/genesis.wasm | Bin 32296 -> 17627 bytes .../substrate_test_runtime.compact.wasm | Bin 16187 -> 17627 bytes .../release/substrate_test_runtime.wasm | Bin 17933 -> 19475 bytes 7 files changed, 24 insertions(+), 29 deletions(-) diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 6c20bbbf2272a..4efff29197050 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -468,7 +468,7 @@ mod tests { use test_client::{self, TestClient}; use test_client::client::BlockOrigin; use test_client::runtime as test_runtime; - use test_client::runtime::{UncheckedTransaction, Transaction}; + use test_client::runtime::{Call, UncheckedExtrinsic, Extrinsic}; #[test] fn client_initialises_from_genesis_ok() { @@ -476,8 +476,8 @@ mod tests { let genesis_hash = client.block_hash(0).unwrap().unwrap(); assert_eq!(client.using_environment(|| test_runtime::system::latest_block_hash()).unwrap(), genesis_hash); - assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Alice.to_raw_public())).unwrap(), 1000); - assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Ferdie.to_raw_public())).unwrap(), 0); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Alice.to_raw_public().into())).unwrap(), 1000); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Ferdie.to_raw_public().into())).unwrap(), 0); } #[test] @@ -504,9 +504,9 @@ mod tests { assert_eq!(client.using_environment(|| test_runtime::system::latest_block_hash()).unwrap(), client.block_hash(1).unwrap().unwrap()); } - fn sign_tx(tx: Transaction) -> UncheckedTransaction { - let signature = Keyring::from_raw_public(tx.from.clone()).unwrap().sign(&tx.encode()); - UncheckedTransaction { tx, signature } + fn sign_tx(tx: Extrinsic) -> UncheckedExtrinsic { + let signature = Keyring::from_raw_public(tx.signed.0.clone()).unwrap().sign(&tx.encode()).into(); + UncheckedExtrinsic { extrinsic: tx, signature } } #[test] @@ -515,18 +515,17 @@ mod tests { let mut builder = client.new_block().unwrap(); - builder.push(sign_tx(Transaction { - from: Keyring::Alice.to_raw_public(), - to: Keyring::Ferdie.to_raw_public(), - amount: 42, - nonce: 0 + builder.push(sign_tx(Extrinsic { + signed: Keyring::Alice.to_raw_public().into(), + function: Call { to: Keyring::Ferdie.to_raw_public().into(), amount: 42 }, + index: 0, })).unwrap(); client.justify_and_import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); assert_eq!(client.info().unwrap().chain.best_number, 1); assert!(client.state_at(&BlockId::Number(1)).unwrap() != client.state_at(&BlockId::Number(0)).unwrap()); - assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Alice.to_raw_public())).unwrap(), 958); - assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Ferdie.to_raw_public())).unwrap(), 42); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Alice.to_raw_public().into())).unwrap(), 958); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Ferdie.to_raw_public().into())).unwrap(), 42); } } diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index 775c86609b842..5aacf5e247a40 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -49,20 +49,19 @@ mod tests { use state_machine::backend::InMemory; use test_client; use test_client::runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; - use test_client::runtime::{Hash, Block, BlockNumber, Header, Digest, Transaction, - UncheckedTransaction}; + use test_client::runtime::{Hash, Call, Block, BlockNumber, Header, Digest, Extrinsic, UncheckedExtrinsic}; use ed25519::{Public, Pair}; native_executor_instance!(Executor, test_client::runtime::api::dispatch, include_bytes!("../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm")); - fn construct_block(backend: &InMemory, number: BlockNumber, parent_hash: Hash, state_root: Hash, txs: Vec) -> (Vec, Hash) { + fn construct_block(backend: &InMemory, number: BlockNumber, parent_hash: Hash, state_root: Hash, txs: Vec) -> (Vec, Hash) { use triehash::ordered_trie_root; let transactions = txs.into_iter().map(|tx| { - let signature = Pair::from(Keyring::from_public(Public::from_raw(tx.from)).unwrap()) - .sign(&tx.encode()); + let signature = Pair::from(Keyring::from_public(Public::from_raw(tx.signed.0)).unwrap()) + .sign(&tx.encode()).into(); - UncheckedTransaction { tx, signature } + UncheckedExtrinsic { extrinsic: tx, signature } }).collect::>(); let extrinsics_root = ordered_trie_root(transactions.iter().map(Slicable::encode)).0.into(); @@ -107,11 +106,10 @@ mod tests { 1, genesis_hash, hex!("25e5b37074063ab75c889326246640729b40d0c86932edc527bc80db0e04fe5c").into(), - vec![Transaction { - from: Keyring::One.to_raw_public(), - to: Keyring::Two.to_raw_public(), - amount: 69, - nonce: 0, + vec![Extrinsic { + signed: Keyring::One.to_raw_public().into(), + function: Call { to: Keyring::Two.to_raw_public().into(), amount: 69 }, + index: 0, }] ) } diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 20164e5b0b6b8..b675fb915439d 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -348,7 +348,7 @@ pub trait Block: Clone + Send + Sync + Slicable + Eq + MaybeSerializeDebug { fn deconstruct(self) -> (Self::Header, Vec); fn new(header: Self::Header, extrinsics: Vec) -> Self; fn hash(&self) -> Self::Hash { - <::Hashing as Hashing>::hash_of(self) + <::Hashing as Hashing>::hash_of(self.header()) } } diff --git a/substrate/test-client/src/client_ext.rs b/substrate/test-client/src/client_ext.rs index a5301a01b2f65..bc03054f6a441 100644 --- a/substrate/test-client/src/client_ext.rs +++ b/substrate/test-client/src/client_ext.rs @@ -16,7 +16,6 @@ //! Client extension for tests. -use codec::Slicable; use client::{self, Client}; use keyring::Keyring; use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; @@ -97,12 +96,11 @@ fn genesis_config() -> GenesisConfig { fn prepare_genesis() -> (runtime::Header, Vec<(Vec, Vec)>) { let mut storage = genesis_config().genesis_map(); - let block = client::genesis::construct_genesis_block(&storage); + let block: runtime::Block = client::genesis::construct_genesis_block(&storage); storage.extend(additional_storage_with_genesis(&block)); ( - runtime::Header::decode(&mut block.header.encode().as_ref()) - .expect("to_vec() always gives a valid serialisation; qed"), + block.header, storage.into_iter().collect() ) } diff --git a/substrate/test-runtime/wasm/genesis.wasm b/substrate/test-runtime/wasm/genesis.wasm index 7daba8a15c5866dd375c889a8eeb5f9cec8e7dbe..7b0503bb21b077966ff2c9feab1a16a35b23340e 100644 GIT binary patch literal 17627 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 literal 32296 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 delta 7205 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 literal 17933 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 Av;Y7A From 85a818f11ff0be767ab2472403101626da7ceece Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 29 May 2018 20:10:57 +0200 Subject: [PATCH 25/60] remove commented code --- substrate/primitives/src/hash.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/substrate/primitives/src/hash.rs b/substrate/primitives/src/hash.rs index 48f84cf27fa94..8556f649bba67 100644 --- a/substrate/primitives/src/hash.rs +++ b/substrate/primitives/src/hash.rs @@ -48,12 +48,6 @@ macro_rules! impl_rest { self.0.using_encoded(f) } } -/* - impl Default for $name { - fn default() -> Self { - Self::new() - } - }*/ } } From bf11a29f8044a42093d97c20209eedc80c820a2a Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 30 May 2018 19:03:15 +0200 Subject: [PATCH 26/60] maybe unsigned signatures --- demo/runtime/wasm/Cargo.lock | 380 +++++++++++--------- substrate/runtime/primitives/src/generic.rs | 57 +-- substrate/runtime/primitives/src/lib.rs | 50 ++- substrate/runtime/primitives/src/traits.rs | 19 +- 4 files changed, 300 insertions(+), 206 deletions(-) diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index 7a8b9ec36ad25..d464af8df1c0f 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -7,18 +7,13 @@ dependencies = [ ] [[package]] -name = "bigint" -version = "4.2.0" +name = "base58" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "bitflags" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -32,32 +27,54 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.4" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "coco" -version = "0.1.1" +name = "constant_time_eq" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crossbeam-deque" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "constant_time_eq" -version = "0.1.3" +name = "crossbeam-utils" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "crunchy" @@ -68,8 +85,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "demo-primitives" version = "0.1.0" dependencies = [ - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -103,17 +120,14 @@ dependencies = [ name = "ed25519" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "either" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "elastic-array" version = "0.10.0" @@ -131,11 +145,33 @@ name = "ethbloom" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ethereum-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ethereum-types-serialize" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -153,7 +189,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -163,7 +199,7 @@ name = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -187,16 +223,16 @@ dependencies = [ [[package]] name = "hex-literal" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -212,9 +248,9 @@ name = "keccak-hash" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -224,12 +260,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "lazy_static" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.36" +version = "0.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -245,9 +281,14 @@ name = "log" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memoffset" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memory_units" version = "0.3.0" @@ -268,7 +309,7 @@ name = "num_cpus" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -284,9 +325,9 @@ name = "parity-wasm" version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -294,37 +335,29 @@ name = "parity-wasm" version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot_core" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "plain_hasher" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "proc-macro-hack" version = "0.4.0" @@ -338,12 +371,20 @@ name = "proc-macro-hack-impl" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "proc-macro2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pwasm-alloc" version = "0.1.0" dependencies = [ "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -355,15 +396,18 @@ name = "pwasm-utils" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quote" -version = "0.3.15" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "rand" @@ -371,7 +415,7 @@ version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -381,7 +425,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -390,19 +434,19 @@ name = "rayon" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -412,7 +456,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -422,7 +466,7 @@ name = "rlp" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -440,17 +484,17 @@ source = "git+https://github.com/rphmeier/rustc-hex.git#ee2ec40b9062ac7769ccb9dc [[package]] name = "rustc_version" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "safe-mix" version = "0.1.0" dependencies = [ - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -460,7 +504,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "semver" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -473,31 +517,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.27" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" -version = "1.0.27" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_derive_internals" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "smallvec" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -514,8 +549,8 @@ name = "substrate-keyring" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -523,25 +558,25 @@ name = "substrate-primitives" version = "0.1.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", "rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-std 0.1.0", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", - "wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-runtime-consensus" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -555,10 +590,10 @@ dependencies = [ name = "substrate-runtime-council" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -577,9 +612,9 @@ dependencies = [ name = "substrate-runtime-democracy" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", @@ -596,8 +631,8 @@ dependencies = [ name = "substrate-runtime-executive" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -612,7 +647,7 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "environmental 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-std 0.1.0", @@ -626,8 +661,8 @@ version = "0.1.0" dependencies = [ "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -639,21 +674,21 @@ dependencies = [ name = "substrate-runtime-sandbox" version = "0.1.0" dependencies = [ - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", - "wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-runtime-session" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -669,11 +704,11 @@ dependencies = [ name = "substrate-runtime-staking" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -693,7 +728,7 @@ version = "0.1.0" dependencies = [ "pwasm-alloc 0.1.0", "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -701,9 +736,9 @@ name = "substrate-runtime-support" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -714,9 +749,9 @@ dependencies = [ name = "substrate-runtime-system" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -729,8 +764,8 @@ dependencies = [ name = "substrate-runtime-timestamp" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -744,35 +779,30 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "syn" -version = "0.11.11" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "synom" -version = "0.11.3" +name = "tiny-keccak" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tiny-keccak" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "triehash" version = "0.1.2" @@ -797,14 +827,25 @@ name = "uint" version = "0.1.2" source = "git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm#8dc457899afdaf968ff7f16140b03d1e37b01d71" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "uint" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-xid" -version = "0.0.4" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -814,10 +855,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -843,32 +884,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" -"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" +"checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" +"checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" -"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" -"checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" -"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" -"checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd" +"checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" +"checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" +"checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" +"checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" +"checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" -"checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" -"checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" +"checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" +"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" +"checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6" +"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" "checksum fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" "checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" -"checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" -"checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" +"checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" +"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" "checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" -"checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" +"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" -"checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" +"checksum libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)" = "ac8ebf8343a981e2fa97042b14768f02ed3e1d602eac06cae6166df3c8ced206" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" +"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775393e285254d2f5004596d69bb8bc1149754570dcc08cf30cabeba67955e28" @@ -876,40 +922,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4dc02a80a0315b109e48992c46942c79bcdb8fac416dd575d330ed9ced6cbd" "checksum parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41083957b80abb8a01fac4d2773d5f92653aed8f0b740c8d3da1da62c7857abe" -"checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd" -"checksum parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f35048d735bb93dd115a0030498785971aab3234d311fbe273d020084d26bd8" -"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995" +"checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" +"checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" +"checksum proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1fa93823f53cfd0f5ac117b189aed6cfdfb2cfc0a9d82e956dd7927595ed7d46" "checksum pwasm-utils 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3a822d2a1624b10c46572c231c149575bcc261c37d84fd3f1a2f5ae1f65515" -"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" +"checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" -"checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" +"checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" "checksum rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "89db7f8dfdd5eb7ab3ac3ece7a07fd273a680b4b224cb231181280e8996f9f0b" "checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" "checksum rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)" = "" -"checksum rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9743a7670d88d5d52950408ecdb7c71d8986251ab604d4689dd2ca25c9bca69" +"checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526" -"checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0" -"checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5" -"checksum smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44db0ecb22921ef790d17ae13a3f6d15784183ff5f2a01aa32098c7498d2b4b9" +"checksum serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "fba5be06346c5200249c8c8ca4ccba4a09e8747c71c16e420bd359a0db4d8f91" +"checksum serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "79e4620ba6fbe051fc7506fab6f84205823564d55da18d55b695160fb3479cd8" +"checksum smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03dab98ab5ded3a8b43b2c80751194608d0b2aa0f1d46cf95d1c35e192844aa7" "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b" -"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e9241752647ca572f12c9b520a5d360d9099360c527770647e694001646a1d0" +"checksum syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6dfd71b2be5a58ee30a6f8ea355ba8290d397131c00dfa55c3d34e6e13db5101" +"checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" "checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" -"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" -"checksum wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26b20dbeb7caee04597a5d2c93e2b3e64872c6ea2af732d7ad49dbec44067c35" +"checksum wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19da510b59247935ad5f598357b3cc739912666d75d3d28318026478d95bbdb" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 35a35f93c6183..384f047fe6794 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -28,7 +28,7 @@ use rstd::ops; #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct Extrinsic where - AccountId: Member + Default + MaybeDisplay, + AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, { @@ -41,7 +41,7 @@ pub struct Extrinsic where } impl Slicable for Extrinsic where - AccountId: Member + Default + Slicable + MaybeDisplay, + AccountId: Member + Slicable + MaybeDisplay, Index: Member + Slicable + MaybeDisplay + SimpleArithmetic, Call: Member + Slicable { @@ -68,7 +68,7 @@ impl Slicable for Extrinsic wher #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize))] pub struct UncheckedExtrinsic where - AccountId: Member + Default + MaybeDisplay, + AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member, // TODO: should be Option @@ -80,30 +80,44 @@ pub struct UncheckedExtrinsic where } impl traits::Checkable for UncheckedExtrinsic where - AccountId: Member + Default + MaybeDisplay, + AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, - Signature: Member + Default + traits::Verify, + Signature: Member + traits::Verify, Extrinsic: Slicable, { type Checked = CheckedExtrinsic; fn check(self) -> Result { - if !self.is_signed() { + // TODO: unfortunately this is a lifetime relationship that can't + // be expressed without higher-kinded lifetimes. + struct LazyEncode { + inner: F, + encoded: Option>, + } + + impl Vec> traits::Lazy<[u8]> for LazyEncode { + fn get(&mut self) -> &[u8] { + self.encoded.get_or_insert_with(&self.inner).as_slice() + } + } + + let sig_ok = { + self.signature.verify( + LazyEncode { inner: || self.extrinsic.encode(), encoded: None }, + &self.extrinsic.signed, + ) + }; + + if sig_ok { Ok(CheckedExtrinsic(self)) } else { - if ::codec::Slicable::using_encoded(&self.extrinsic, |msg| - self.signature.verify(msg, &self.extrinsic.signed) - ) { - Ok(CheckedExtrinsic(self)) - } else { - Err(self) - } + Err(self) } } } -impl UncheckedExtrinsic where +impl UncheckedExtrinsic> where AccountId: Member + Default + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, @@ -112,13 +126,12 @@ impl UncheckedExtrinsic bool { - // TODO: should be Option and Option - self.signature != Signature::default() || self.extrinsic.signed != AccountId::default() + self.signature.is_signed(&self.extrinsic.signed) } } impl Slicable for UncheckedExtrinsic where - AccountId: Member + Default + MaybeDisplay, + AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member + Slicable, @@ -160,7 +173,7 @@ impl Slicable for UncheckedExtrinsic fmt::Debug for UncheckedExtrinsic where - AccountId: Member + Default + MaybeDisplay, + AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member, @@ -176,14 +189,14 @@ impl fmt::Debug for UncheckedExtrinsic (UncheckedExtrinsic) where - AccountId: Member + Default + MaybeDisplay, + AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member; impl CheckedExtrinsic where - AccountId: Member + Default + MaybeDisplay, + AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member @@ -207,7 +220,7 @@ where impl ops::Deref for CheckedExtrinsic where - AccountId: Member + Default + MaybeDisplay, + AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member @@ -222,7 +235,7 @@ where impl traits::Applyable for CheckedExtrinsic where - AccountId: Member + Default + MaybeDisplay, + AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member + AuxDispatchable, Signature: Member diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 670afefe44b53..fc792ac3ce87f 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -46,6 +46,8 @@ pub mod traits; pub mod generic; pub mod bft; +use traits::{Verify, Lazy}; + #[cfg(feature = "std")] pub type BuiltExternalities = HashMap, Vec>; @@ -58,22 +60,64 @@ pub trait BuildExternalities { #[derive(Eq, PartialEq, Clone, Default)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] pub struct Ed25519Signature(H512); -impl traits::Verify for Ed25519Signature { + +impl Verify for Ed25519Signature { type Signer = H256; - fn verify(&self, msg: &[u8], signer: &Self::Signer) -> bool { - runtime_io::ed25519_verify(&(self.0).0, msg, &signer.0[..]) + fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { + runtime_io::ed25519_verify(&(self.0).0, msg.get(), &signer.0[..]) } } + impl codec::Slicable for Ed25519Signature { fn decode(input: &mut I) -> Option { Some(Ed25519Signature(codec::Slicable::decode(input)?,)) } fn using_encoded R>(&self, f: F) -> R { self.0.using_encoded(f) } } + impl From for Ed25519Signature { fn from(h: H512) -> Ed25519Signature { Ed25519Signature(h) } } +/// Potentially "unsigned" signature verification. +#[derive(Eq, PartialEq, Clone, Default)] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] +pub struct MaybeUnsigned(T); + +impl MaybeUnsigned where + T: Default + Eq, + ::Signer: Default + Eq, +{ + fn is_signed(&self, signer: &::Signer) -> bool { + self.0 != T::default() || signer != &::Signer::default() + } +} + +impl Verify for MaybeUnsigned where + T: Default + Eq, + ::Signer: Default + Eq, +{ + type Signer = T::Signer; + fn verify>(&self, msg: L, signer: &Self::Signer) -> bool { + if !self.is_signed(signer) { + true + } else { + self.0.verify(msg, signer) + } + } +} + +impl codec::Slicable for MaybeUnsigned { + fn decode(input: &mut I) -> Option { Some(MaybeUnsigned(codec::Slicable::decode(input)?)) } + fn using_encoded R>(&self, f: F) -> R { self.0.using_encoded(f) } +} + +impl From for MaybeUnsigned { + fn from(t: T) -> Self { + MaybeUnsigned(t) + } +} + #[macro_export] macro_rules! __impl_outer_config_types { ($concrete:ident $config:ident $snake:ident $($rest:ident)*) => { diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index ad290bbcf31e4..0a44f66337098 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -27,12 +27,17 @@ pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{Zero, One, Bounded}; use rstd::ops::{Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; +/// A lazy value. +pub trait Lazy { + fn get(&mut self) -> &T; +} + /// Means of signature verification. pub trait Verify { /// Type of the signer. type Signer; /// Verify a signature. - fn verify(&self, msg: &[u8], signer: &Self::Signer) -> bool; + fn verify>(&self, msg: L, signer: &Self::Signer) -> bool; } /// Simple payment making trait, operating on a single generic `AccountId` type. @@ -138,15 +143,6 @@ impl Clear for T { fn clear() -> Self { Default::default() } } -/*impl Clear for T { - fn is_clear(&self) -> bool { self.is_zero() } - fn clear() -> Self { Self::zero() } -} - -impl Clear for substrate_primitives::H256 { - fn clear() -> Self { substrate_primitives::H256::new() } -}*/ - pub trait SimpleBitOps: Sized + Clear + rstd::ops::BitOr + @@ -238,7 +234,6 @@ impl Hashing for BlakeTwo256 { } } - /// Something that can be checked for equality and printed out to a debug channel if bad. pub trait CheckEqual { fn check_equal(&self, other: &Self); @@ -263,8 +258,6 @@ impl CheckEqual for substrate_primitives::H256 { } } - - #[cfg(feature = "std")] pub trait MaybeSerializeDebug: Serialize + Debug {} #[cfg(feature = "std")] From b1379de69ebc4523aaf7eec017437200f22ea860 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 30 May 2018 19:38:34 +0200 Subject: [PATCH 27/60] runtimes compile --- Cargo.lock | 1 - demo/primitives/src/lib.rs | 2 +- demo/runtime/src/lib.rs | 12 +- .../release/demo_runtime.compact.wasm | Bin 238470 -> 415561 bytes .../release/demo_runtime.wasm | Bin 260135 -> 452471 bytes polkadot/primitives/src/lib.rs | 54 +-- polkadot/primitives/src/parachain.rs | 316 -------------- polkadot/runtime/Cargo.toml | 2 - polkadot/runtime/src/lib.rs | 32 +- polkadot/runtime/src/parachains.rs | 6 +- polkadot/runtime/src/primitives.rs | 413 ++++++++++++++++++ polkadot/runtime/wasm/Cargo.lock | 389 +++++++++-------- polkadot/runtime/wasm/Cargo.toml | 2 - .../release/polkadot_runtime.compact.wasm | Bin 233550 -> 419575 bytes .../release/polkadot_runtime.wasm | Bin 255853 -> 465094 bytes .../release/runtime_test.compact.wasm | Bin 11129 -> 11200 bytes .../release/runtime_test.wasm | Bin 11797 -> 11868 bytes substrate/runtime/system/src/lib.rs | 4 +- substrate/test-runtime/wasm/Cargo.lock | 345 +++++++++------ .../substrate_test_runtime.compact.wasm | Bin 17627 -> 18636 bytes .../release/substrate_test_runtime.wasm | Bin 19475 -> 20609 bytes 21 files changed, 862 insertions(+), 716 deletions(-) create mode 100644 polkadot/runtime/src/primitives.rs diff --git a/Cargo.lock b/Cargo.lock index 5eabd1f6329c0..16affd8552931 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1375,7 +1375,6 @@ version = "0.1.0" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "polkadot-primitives 0.1.0", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index 86945c733f528..d9b4f66e58e4b 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -33,7 +33,7 @@ pub type BlockNumber = u64; /// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost /// certainly continue to be the same as the substrate's `AuthorityId`. -pub type AccountId = primitives::AuthorityId; +pub type AccountId = ::primitives::H256; /// Balance of an account. pub type Balance = u64; diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 3a8fb8e931296..8ff61faf1b6c0 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -41,7 +41,7 @@ extern crate demo_primitives; use rstd::prelude::*; use demo_primitives::{AccountId, Balance, BlockNumber, Hash, Index, SessionKey, Signature}; use runtime_primitives::generic; -use runtime_primitives::traits::{Identity, HasPublicAux, BlakeTwo256}; +use runtime_primitives::traits::{Convert, HasPublicAux, BlakeTwo256}; #[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildExternalities; @@ -83,8 +83,16 @@ impl timestamp::Trait for Concrete { /// Timestamp module for this concrete runtime. pub type Timestamp = timestamp::Module; +/// Session key conversion. +pub struct SessionKeyConversion; +impl Convert for SessionKeyConversion { + fn convert(a: AccountId) -> SessionKey { + a.0 + } +} + impl session::Trait for Concrete { - type ConvertAccountIdToSessionKey = Identity; + type ConvertAccountIdToSessionKey = SessionKeyConversion; } /// Session module for this concrete runtime. diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index ec2a25162238b218ebc80a238a12954f458f783f..54fc2e5bb26ccee6b498c13b0a974f19546f4b07 100644 GIT binary patch literal 415561 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

    6YNS~vE#fS9Ru?W{B36;ckd3pq9r&Ij9( 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

    jYxH(t8YK(ALl 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 Oh|>+IO?ri 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 aYzSsuA#cnpoFWMg%QO^8v29IgX#W5q1DnkN diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm index 7a9b06afaf2e4a2f46a573a5b5d525e3dfac54a8..6b9fd2905255a9bb2b9625f41a96fdf2c020b6d2 100755 GIT binary patch delta 1843 zcmaJ?S!^3s6n$^TTRe6=USd0rV~<;9u^lI~d6u+AovJQS3Zhg(2vVFGdj^s=PDq?K zK`N zx}Y~t*^4vIDpJXPYG6`}c($!{knZoA)=3+qo*s-0%+Qm2YTgO7K(VsH#s$dTYs zvf!QjJi}Hz<^y2Jx#0KU^K$4Vpz9$G=$(+8jN0S!3q3p@AeVax?j!Z^BpxIS;U_Rh zu7$4wZ89sFbdK}0I1*ww-zeoPQJl};S@jg9t1iNtHJ(H$A*BPkEMskkmrP0%zCU_aWsq>mAsVGnJ~yaBx!nXQ z6l2&?QeZE@Ic~6aKeXTV^q~XTEw$)X^)|zn$wYh%FjMi}xJ=H*H-O)hFmVR>Ciy$@ z%8tB|JOjLzI)pRpYpIVg2&3uA-YOjDwwn$x(D#M(r;u|oGY#}?W&-H-OcN-Z9RaFk zKLfYlvr8fOMnTuVBToO5(Q!ytn>Bt48v%BlZ1f+;{Un>SxAnh<4F>e@y|8_tEp3Xm4OP7LNjKy4#!?PUA^+Jg`YLwa=#Sx0(!i{K<3-6f7TlpGX zj8F0x!TZ1<^pJcp_+cUqjSoYN0EcEFP!9_oEEK``e!;!5R|?0o?lut@QewE^t_T;J z<$B$Il6 z*QZK#3Ma{h-LEoVrFo z2ut;ELws>ZZ>h2%)pgNQ^_JAg0jQa@Te?*@MP8~qvf5Vl#(?M1C#bJGnj<)(qshGB z=&EBj@}5UalLSk#OjXk@TeO|V;0s<7_eS%@!sAbFG333%^Ye4uPGnI~6j5rcwr*RZ z>4=Sz8<{l~QR8(4gVR<|{?v4?z9)8j2DfoTaU-7fa5Z4rohitJfDk>pGTuE)qw$9#ILqx+6x%GMA4Lnzv_| zhiyazgD6kvi1t+HrbDN86ukr!C+Gm7{}o~i1nnGgfLefSEmAYNA%bR71RWw+f<-LJ zP>#X2M`mlDJzysIinL>v*#b}C@2E0p?ouOkf6B+$k5w*ZS~js)C!An0rO{mjdeGE3@OOaDEj`;P2X1x8Sqq}hKqoCs> z8X?2bCxQ*Oph-TCVMC(>PwCwN15SW{<@m>K`_oQJVaFXuv;NUA8)$(Aj0K+0XCUHR z`8?2f^Hvn;Cw9aAP{gZKoR8l4BR}rcKE-KK_$Kws(9(XZb$p(i*f`B8BnsdwV{g-+ z4N@JWZKHF8&u@%9mqln5e^^j)pfnSgo0=iZ0&m(4UZ_Z7Esk%DSINYdMM9AqYD2X6 zhS@M0k|Nax_X2vyh){V)P!!n&r7cvOyu@p@q_1ta8!N|$@NW|Zl)~$UdO}hRNz)YD zkjJ`;_>$rgDB%z;DeJfGV2PH;M7)3S(T-#C@7j{HY&AY$0%-9WWy8`%alaZ zcEmZ1rWW!evFw%dEElKn_2N2wCq}6Z|Emv50xIIoQWcf( z!;*xi@$9r3*D9u@L8&B(ubPdjRV(AQ>Af>E{lB?o^o;saXZG1O!#}ZQ1pHw7btJ;7 zN$ryUyK0`?EU(xts: Vec>) -> H::Output { } pub trait Trait { - type Index: Parameter + Member + Default + SimpleArithmetic + Copy; + type Index: Parameter + Member + Default + MaybeDisplay + SimpleArithmetic + Copy; type BlockNumber: Parameter + Member + MaybeDisplay + SimpleArithmetic + Default + Bounded + Copy + rstd::hash::Hash; type Hash: Parameter + Member + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual + rstd::hash::Hash; type Hashing: Hashing; type Digest: Parameter + Member + Default + traits::Digest; - type AccountId: Parameter + Member + Ord + Default; + type AccountId: Parameter + Member + MaybeDisplay + Ord + Default; type Header: Parameter + traits::Header< Number = Self::BlockNumber, Hashing = Self::Hashing, diff --git a/substrate/test-runtime/wasm/Cargo.lock b/substrate/test-runtime/wasm/Cargo.lock index 722c6733531ca..a57d2e899b0bb 100644 --- a/substrate/test-runtime/wasm/Cargo.lock +++ b/substrate/test-runtime/wasm/Cargo.lock @@ -7,18 +7,13 @@ dependencies = [ ] [[package]] -name = "bigint" -version = "4.2.0" +name = "base58" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "bitflags" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -32,32 +27,54 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.4" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "coco" -version = "0.1.1" +name = "constant_time_eq" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crossbeam-deque" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "constant_time_eq" -version = "0.1.3" +name = "crossbeam-utils" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "crunchy" @@ -68,17 +85,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "ed25519" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "either" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "elastic-array" version = "0.10.0" @@ -96,11 +110,33 @@ name = "ethbloom" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ethereum-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ethereum-types-serialize" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -118,7 +154,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -128,7 +164,7 @@ name = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -152,29 +188,34 @@ dependencies = [ [[package]] name = "hex-literal" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "integer-sqrt" +version = "0.1.0" +source = "git+https://github.com/paritytech/integer-sqrt-rs.git#886e9cb983c46498003878afe965d55caa762025" + [[package]] name = "keccak-hash" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -182,9 +223,14 @@ name = "lazy_static" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lazy_static" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "libc" -version = "0.2.36" +version = "0.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -200,9 +246,14 @@ name = "log" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memoffset" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memory_units" version = "0.3.0" @@ -213,12 +264,17 @@ name = "nodrop" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "num-traits" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "num_cpus" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -234,39 +290,31 @@ name = "parity-wasm" version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot_core" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "plain_hasher" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "proc-macro-hack" version = "0.4.0" @@ -280,12 +328,20 @@ name = "proc-macro-hack-impl" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "proc-macro2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pwasm-alloc" version = "0.1.0" dependencies = [ "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -294,8 +350,11 @@ version = "0.1.0" [[package]] name = "quote" -version = "0.3.15" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "rand" @@ -303,7 +362,7 @@ version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -313,7 +372,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -322,19 +381,19 @@ name = "rayon" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -344,7 +403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -354,7 +413,7 @@ name = "rlp" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -372,10 +431,10 @@ source = "git+https://github.com/rphmeier/rustc-hex.git#ee2ec40b9062ac7769ccb9dc [[package]] name = "rustc_version" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -385,7 +444,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "semver" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -398,31 +457,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.27" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_derive_internals" -version = "0.19.0" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "smallvec" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -439,17 +489,17 @@ name = "substrate-primitives" version = "0.1.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", "rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-std 0.1.0", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", - "wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -458,7 +508,7 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "environmental 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-std 0.1.0", @@ -472,8 +522,8 @@ version = "0.1.0" dependencies = [ "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -487,7 +537,7 @@ version = "0.1.0" dependencies = [ "pwasm-alloc 0.1.0", "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -495,9 +545,9 @@ name = "substrate-runtime-support" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -508,8 +558,8 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -519,7 +569,7 @@ name = "substrate-test-runtime" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", @@ -531,27 +581,22 @@ dependencies = [ [[package]] name = "syn" -version = "0.11.11" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "synom" -version = "0.11.3" +name = "tiny-keccak" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tiny-keccak" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "triehash" version = "0.1.2" @@ -576,14 +621,25 @@ name = "uint" version = "0.1.2" source = "git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm#8dc457899afdaf968ff7f16140b03d1e37b01d71" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "uint" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-xid" -version = "0.0.4" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -593,10 +649,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -622,69 +678,74 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" -"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" +"checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" +"checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" -"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" -"checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" -"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" -"checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd" +"checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" +"checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" +"checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" +"checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" +"checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" -"checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" -"checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" +"checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" +"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" +"checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6" +"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" "checksum fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" "checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" -"checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" -"checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" -"checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" +"checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" +"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" +"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" +"checksum libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)" = "ac8ebf8343a981e2fa97042b14768f02ed3e1d602eac06cae6166df3c8ced206" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" +"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775393e285254d2f5004596d69bb8bc1149754570dcc08cf30cabeba67955e28" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4dc02a80a0315b109e48992c46942c79bcdb8fac416dd575d330ed9ced6cbd" -"checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd" -"checksum parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f35048d735bb93dd115a0030498785971aab3234d311fbe273d020084d26bd8" -"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995" +"checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" +"checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" -"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" +"checksum proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1fa93823f53cfd0f5ac117b189aed6cfdfb2cfc0a9d82e956dd7927595ed7d46" +"checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" -"checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" +"checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" "checksum rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "89db7f8dfdd5eb7ab3ac3ece7a07fd273a680b4b224cb231181280e8996f9f0b" "checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" "checksum rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)" = "" -"checksum rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9743a7670d88d5d52950408ecdb7c71d8986251ab604d4689dd2ca25c9bca69" +"checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526" -"checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0" -"checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5" -"checksum smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44db0ecb22921ef790d17ae13a3f6d15784183ff5f2a01aa32098c7498d2b4b9" +"checksum serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "fba5be06346c5200249c8c8ca4ccba4a09e8747c71c16e420bd359a0db4d8f91" +"checksum serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "79e4620ba6fbe051fc7506fab6f84205823564d55da18d55b695160fb3479cd8" +"checksum smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03dab98ab5ded3a8b43b2c80751194608d0b2aa0f1d46cf95d1c35e192844aa7" "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b" -"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e9241752647ca572f12c9b520a5d360d9099360c527770647e694001646a1d0" +"checksum syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6dfd71b2be5a58ee30a6f8ea355ba8290d397131c00dfa55c3d34e6e13db5101" +"checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" "checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" -"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" -"checksum wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26b20dbeb7caee04597a5d2c93e2b3e64872c6ea2af732d7ad49dbec44067c35" +"checksum wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19da510b59247935ad5f598357b3cc739912666d75d3d28318026478d95bbdb" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 7b0503bb21b077966ff2c9feab1a16a35b23340e..180df41c4c560c02a6c99b9c036780f51076d9f1 100644 GIT binary patch delta 3027 zcmb7GU5p!76~6b*kLSm;p53Hrvm46w?23Am-Sw^ zZ0yDB6^R5mR8f@*NNEN{#Y?NIQhDg2AR|#J0rG?v6hTxKHP8oMsFa6FfK;TQ^1!(> z_Oc0;5Lr#mJ?EaE@1Aq+@qOG~4K!;6=L3JU7o73dI{sO7FjHS&U%PN7IN$5G+8Zq& zEsQl=?fP14W29nhzvx*KGEJl_h}|#-jBFC?9mBL@!C&IVYpN{u@i+1Cn?~$nbVoe1 zXc3B7C7eab6%fVjWgN1bD6|9+1HDha4RSH^q(59uWuKNp3-o7&ZR{ch%8!IpoE1>Q zm?0H*7$u}+$Y3fl3WjB3a@&`2R*t@!+K=Vv+o?~SBFo7i#W|u_=$HWkawMGvh@E)B|7{$asjNVjDd9@U#5zbJPJ;h?*xWZs1p`N#@@QXVKhl_NKE_@An83k+ULzJU zbC#Td_?$r~rg9B`-4zrbgoNPCLbW6(oZKZ;prFO~Os;b$(E(`uXgqb?*InWYceong z=6IDb&lFRI)msD-#9q~ajiJ0nERjRGNvxEa%Yx5Y;Z>fGKPjjB3YAYAfRt^675B2s zaGO{XH@r!-g?j+ze#jzCfpr4;e<8ic55$pDjrL{8#DBY!C_l*m& zP;bR$lAufpeV)~2Z zvJqWLKi+@AU`2BV>Ay({1R7lLLwnywXDu>=$TIt z`+6kIrjnHzW)+6ADwVU6undieEbSQ7mQW2KP*Rg!;v}jFcBhghw4X+`96^@O2hlOKjs5WAU@Szse;OW(sWe=H3kR}6;vS$XkH@1ZNl$1Y zj0}~JPaVRkNno-}C4Qn5&wm<>4Vr!`NhLQ{p5>JVCs{?O>Q;?DPnE4pSrN?QTO)Hb z0v9rzK~&7>=EHES-%cl2mfcd=Jiog;68<~Jo>SRe^!xPU)MW!s4u#?_C@vEbJi!E_ z#5^>ZGLB+AH~7+60h6Do(UnXd2EyQ1nG={?%0%h$Fo94mHarh<% z;rQnz{O;hF`^p%|KOX)e#`Dp4_irWM7NT(Suj+S_x%2wiz?(Xq!g~fkxAqadcksKJ zVrKH=(D9!;^H4P9dhaYj{$N;Q!&k!v+S;J&-OhT@UAsVow%=(44ccncUa--d z?{2nxt#d(QvKF*YuLj+K*7>*gwfcn(y6f@rpwZyH>KE{-wU+01xp*#bDhRQ zccazr1zmWA(4gDxbeAA1@DO#g-3{vgYTa84D916f?X34&oi-S5^tzp>dN_|!R5)Dj z^XH2GH(U}C8b=6OK=%NBpCBXwm1KnW0==yyJOiHVT@@1k&!BVwcmt>bvnOxT^k=ZEr-K(4{MGvxOJ zU>$EqtufVdz-ccW}aUv1a8F%yvI%)IUT*S@=!Ean*n^TS8e!}ay1C-da)XP zxt3ojGz*n_5O|eBrQrImGrRk}d+`3}?x8CYTbYgiSbKKd_k*hEl#7*Sx!^6WxLR*JGNhMG#X92>McC@aL$i>pPWrD$wg1K+(s+_ delta 1971 zcma)7O=ufO6rP#YN-M7vj}#>&&JU}#i)AOVCGD<$oH+5?u|k_r`V%N22eW@_rMQxD z9Fjs?hn`Ysi<2R3jz08|LqcR0N}+`sT3VL|>Qb5*N=Xle9b_Iob{4Qxq+s(JuA0lJ%BIBa z?7aBPyi^76c-sje-3d~iKkp;}xC(dJZTT3YVwC5# zMylo}DMy>E96d(6MwE>hg^H6=EVJi>eN|Fb1qJa^5mE%8gVJ|2OK)PzG2O%x$I=GI z3Ne+cigJW1ctE&@lYwTAd=1^D;1q#kQUoNgDgpLmaF5MlBngRtOC?R`quN$*m4=c6 z8B@?C)JG_mTWqZkEMU65M-iepLY}rquxzeJXcEb6G_-eKG`|j;LE6vNm=;OKZwIv)d|W1KkfxF$9=d`JnLjA960A?+4#2CfjbDd8$n z!w}d7`NHyd^1>zP+T(eOO7Kyhyruu09yTuta5`uh*t(SY0F?hUouq)9A2BHVf6}$I zzD;=dB;5`gpf07N5n(C?*(G2Z9fu`DKcCH8TA7{dMU;>R&rj!LGV7vk^V2&@rZ8wacfjtW2 zFkA#K7wml<_F~)q5v)sf*v+w3oNnlaoS!*b$Fx{3I9Aau7Cc8Y9K&FZ$$Y{n=CbL$mb25Ys~PD+|M5d7 z*}}1HjF$SS;}yzTJ6Fi)PO+dD4R*9NtT=|7(Jim2=Pg~&WVM0EzjcFbv2-z(&lNS- zNSBL{n&x@geJpeAN=&yc!$@0R*3;c`+V%FcrOBLX7tAiatJ8T f4|p}F?s_95Z)DtbxoqiqPqQ>nD`$qE_>}$&_yCzi diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index be2a3f0d88800cd228b03070427d1608e5177c7e..804c466487ad051b1e18e44044bd348bbe1073e3 100755 GIT binary patch delta 3248 zcma)9U2Ggz6~6b*&(7}b+7mlLZW4#P6BpJ|63_0=?(C+d@;GdM+7zjl=>t@9c4lXr zove4wdQ)PlbX^oxNokTM6Cgq$6)D9)n$%(|@e>P0LMnmwAyh>~AjC@}!p}n3Hn#HONE9g-7Zw%}lKYXle6HIeX-@y(97vQmR^=bA<*&s= zp@UxpJpQv2v=)%L;C(3AX_Zi97Ti&U3=UCjUcs(;3%M!>Vxa5fw?WQ(E%CSBko4$b z!BxRvl)H@$gg|@9rTi#|0!DEux5`K^B_V^UU{Wy56NTAc!Aa3OCkdH2Dw3H*Y=Ns#D$;+hg5nFtbRcLP0uz*1l}V*c(EgA?yE z-Mij{=+GE%zV1Vj9zyvEQF#XC7EvPslqAF*nGhp5reM+^Xf$Yxf=PoMlJC%qok4gLfs4z=4oE;c>WwPN*b^MaIp4 zo?*&S^NeqVOr(5`nVFq~(1FB+{?%Bk_VhrcxhB7=28W1$DuH_a3>lM7ifAgw8koC2 zA-t^ei>hFv!wHe{6ZFiYi4MW5pg5K%HA8blA&*|GRGa~7~t$5mrAmLf=%P0>~3d4i}+37~S-go#q<9hPz)F@5SE z4Vn5%36pnCG=_f7)*oZ*>@;fzM}18ygHMwWW63@X4*4)df`y=}>~?6>cb+06$pl1> ze_U+^8VNdD3P>yP}8tbuPI-Z@7r-CwTV-In^{+D2O|sL%9Z8@#k!9E~ z&V=(0v=fDDv&JdFHer^IzrPPl$F_nMtDp*QSStv{yS@b*RsL=j*uM34z;7@bWuQe! zUTC{e+MqpX*dDORfg9>}l2APG>$eGA(7{*qjD+1Y?0gQzOto00W#! z{$~Ly5o48LJ;WL5E-QF+z_V4g#1r!W68$%?D z^Mr?h@G+r8xzSbopTYR8?z}RI$&It#^l*-YBhVEFs+gR<;LQvkGB%7T^B?|Kyf^XQ z_G9hrVNxyy*cGq)x4}gL|E}vj@_7v8FI#_x@sf9S`%fWGcY63JR$g5<9?*X+4DUnpv^Ga)Tg_Rg zRiCF$!){ib3avG0+nHZ{A;Pw4D~*vZ&K)HCy{2IPehsWTWMj?c-&u?obA&UbF0G%Nc9V zwrkDC-qze)yVdm4<6{_kyTmbdVY@{EJu z-lBJB%uPhe zw$#0Mu!RSVs%=@-s%2?~bXw1*OQYU{CyG0&nhr*moy#~zL3gauu4B_*_*~AI9yvNS zGUff|$guav!=F}ix?vS7b|GJM9Ic!!dYg}A_hzb@LfLVwLZ*;0Y(p>YUVE+Iv;J1U z*E{;;ceYg=)6* tGL^Ef+2u;5Qq_u9DZTM0LI&J_FKJXVN;)Vob!@nX|Y{*=;B! zn5esuD3wxDIU0E}!2~VJtz;4}#F!?$lz2&fFg8&m4;XnPYNAa{(EsdA?Jm5S&CY+m z@Bh#DU(VT`WA9;h7EeuLvZ|YXh*!h|fj~GA_WAKJ#@H`l)D~#LRcy?TPoqfibsS-L z@ZjbcJxZ-3hv~ljP{lfc*0h?#!$U9aqel-PDwaoz7Lp$-6wBsNabzJR6+V8ny9J4F z)@n6`BCW`nA9GHVq@Yfm0!DoQKmJ@JJ{}DSRs1UPzTFU2L&gOA!*6v;$jFv@5y}Wi z!p2!#GNw_9RRT-diNJT&Pzk&Po)duF2znZU)Cjs7f!GK_3xJD;yo_=wj!3`z0qPDe z!4tAg??U2hyw(`6ZH|l{spXo+Hx29?8|n#bE5u278_&rGy|M-ZDax0Fp3* zuKEb-Sman-#37DD3m8kpkV*-ZCZdFUg|j&BV>g235udY8bsFz(z74-m|l5i63ZF?K1oJ$P*lLJWm%Z{NVFTkAU6x%L3Q z>`b=r!T5@EuVWCC??>5fNfV5zG3R7w0h8%*_WRN;8E>yR$y)nagr<6V_b8}E3adGmGw%WK`!UEv>l5xO=7oBIsJ)Gf|xn; zy$OQfa+a^T(drhw3}0q{uN%Zy*v|Do;A?F4hA*K&=dTSXx#aPUdlve-yOH zMC~=sbWPXC7!y5b}e)4UZ*YXG1RD?8TiCTs#W?N5TIw z@G-D`@P)0&27Xloufw{^9j76%r@>*sn)8pthSd%HbFk)uQQ+4$@D{9j{I{U9u7NLm z{CS8E!@A;O6b%j)%Lj_({X#35^`onuzOs3c;>k|M`6ky!L_J?fS@}Xzx6Qn)QH9;z zvY&muwGA&}zipvx)3!F;$yXgTY1)>lCQaE=^HwI4Te_Rw+L~tL+y3dGwwh6FnHE%y z(zIpfmRCGqkp1{XTvU{-swq@UWzwpqX46jW$&0vMFJvuKxAiQw6wT7KTrYcmmo930 zIwfb6bY8Y?MU%6vW5=Lq(QF}=PiK>=rDs)LV@Gx8g@UPOsA4KqDI{~L`(EPz0w-+*EdT%j From 65c84dd6bd124ed3c616a0a5ba2d12c00b5f3cbe Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 31 May 2018 17:28:53 +0200 Subject: [PATCH 28/60] port over most of network --- Cargo.lock | 1 + substrate/network/Cargo.toml | 1 + substrate/network/src/blocks.rs | 40 +++---- substrate/network/src/chain.rs | 48 +++++---- substrate/network/src/consensus.rs | 162 ++++------------------------- substrate/network/src/lib.rs | 11 +- substrate/network/src/message.rs | 157 +++++++++------------------- substrate/network/src/on_demand.rs | 35 ++++--- substrate/network/src/protocol.rs | 138 +++++++++--------------- substrate/network/src/service.rs | 110 +++++++------------- substrate/network/src/sync.rs | 97 ++++++++--------- 11 files changed, 280 insertions(+), 520 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 16affd8552931..e7e00cf2eb3c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2001,6 +2001,7 @@ dependencies = [ "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", "substrate-serializer 0.1.0", "substrate-state-machine 0.1.0", diff --git a/substrate/network/Cargo.toml b/substrate/network/Cargo.toml index ca715c551c1b1..e54b5137808a8 100644 --- a/substrate/network/Cargo.toml +++ b/substrate/network/Cargo.toml @@ -27,6 +27,7 @@ substrate-client = { path = "../../substrate/client" } substrate-state-machine = { path = "../../substrate/state-machine" } substrate-serializer = { path = "../../substrate/serializer" } substrate-runtime-support = { path = "../../substrate/runtime-support" } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } substrate-bft = { path = "../../substrate/bft" } [dev-dependencies] diff --git a/substrate/network/src/blocks.rs b/substrate/network/src/blocks.rs index 5cff7abd98dd0..8eda998f5d589 100644 --- a/substrate/network/src/blocks.rs +++ b/substrate/network/src/blocks.rs @@ -20,47 +20,47 @@ use std::ops::Range; use std::collections::{HashMap, BTreeMap}; use std::collections::hash_map::Entry; use network::PeerId; -use primitives::block::Number as BlockNumber; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; use message; const MAX_PARALLEL_DOWNLOADS: u32 = 1; /// Block data with origin. #[derive(Debug, Clone, PartialEq, Eq)] -pub struct BlockData { - pub block: message::BlockData, +pub struct BlockData { + pub block: message::BlockData, pub origin: PeerId, } #[derive(Debug)] -enum BlockRangeState { +enum BlockRangeState { Downloading { - len: BlockNumber, + len: u64, downloading: u32, }, - Complete(Vec), + Complete(Vec>), } -impl BlockRangeState { - pub fn len(&self) -> BlockNumber { +impl BlockRangeState where B::Header: HeaderT { + pub fn len(&self) -> u64 { match *self { BlockRangeState::Downloading { len, .. } => len, - BlockRangeState::Complete(ref blocks) => blocks.len() as BlockNumber, + BlockRangeState::Complete(ref blocks) => blocks.len() as u64, } } } /// A collection of blocks being downloaded. #[derive(Default)] -pub struct BlockCollection { +pub struct BlockCollection { /// Downloaded blocks. - blocks: BTreeMap, - peer_requests: HashMap, + blocks: BTreeMap>, + peer_requests: HashMap, } -impl BlockCollection { +impl BlockCollection where B::Header: HeaderT { /// Create a new instance. - pub fn new() -> BlockCollection { + pub fn new() -> Self { BlockCollection { blocks: BTreeMap::new(), peer_requests: HashMap::new(), @@ -74,7 +74,7 @@ impl BlockCollection { } /// Insert a set of blocks into collection. - pub fn insert(&mut self, start: BlockNumber, blocks: Vec, peer_id: PeerId) { + pub fn insert(&mut self, start: u64, blocks: Vec>, peer_id: PeerId) { if blocks.is_empty() { return; } @@ -96,13 +96,13 @@ impl BlockCollection { } /// Returns a set of block hashes that require a header download. The returned set is marked as being downloaded. - pub fn needed_blocks(&mut self, peer_id: PeerId, count: usize, peer_best: BlockNumber, common: BlockNumber) -> Option> { + pub fn needed_blocks(&mut self, peer_id: PeerId, count: usize, peer_best: u64, common: u64) -> Option> { // First block number that we need to download let first_different = common + 1; - let count = count as BlockNumber; + let count = count as u64; let (mut range, downloading) = { let mut downloading_iter = self.blocks.iter().peekable(); - let mut prev: Option<(&BlockNumber, &BlockRangeState)> = None; + let mut prev: Option<(&u64, &BlockRangeState)> = None; loop { let next = downloading_iter.next(); break match &(prev, next) { @@ -137,7 +137,7 @@ impl BlockCollection { } /// Get a valid chain of blocks ordered in descending order and ready for importing into blockchain. - pub fn drain(&mut self, from: BlockNumber) -> Vec { + pub fn drain(&mut self, from: u64) -> Vec> { let mut drained = Vec::new(); let mut ranges = Vec::new(); { @@ -145,7 +145,7 @@ impl BlockCollection { for (start, range_data) in &mut self.blocks { match range_data { &mut BlockRangeState::Complete(ref mut blocks) if *start <= prev => { - prev = *start + blocks.len() as BlockNumber; + prev = *start + blocks.len() as u64; let mut blocks = mem::replace(blocks, Vec::new()); drained.append(&mut blocks); ranges.push(*start); diff --git a/substrate/network/src/chain.rs b/substrate/network/src/chain.rs index cb09f88eada54..766ce61566e72 100644 --- a/substrate/network/src/chain.rs +++ b/substrate/network/src/chain.rs @@ -19,72 +19,74 @@ use client::{self, Client as PolkadotClient, ImportResult, ClientInfo, BlockStatus, BlockOrigin, CallExecutor}; use client::error::Error; use state_machine; -use primitives::block::{self, Id as BlockId}; -use primitives::bft::Justification; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::bft::Justification; -pub trait Client: Send + Sync { +pub trait Client: Send + Sync { /// Import a new block. Parent is supposed to be existing in the blockchain. - fn import(&self, is_best: bool, header: block::Header, justification: Justification, body: Option) -> Result; + fn import(&self, is_best: bool, header: Block::Header, justification: Justification, body: Option>) -> Result; /// Get blockchain info. - fn info(&self) -> Result; + fn info(&self) -> Result, Error>; /// Get block status. - fn block_status(&self, id: &BlockId) -> Result; + fn block_status(&self, id: &BlockId) -> Result; /// Get block hash by number. - fn block_hash(&self, block_number: block::Number) -> Result, Error>; + fn block_hash(&self, block_number: ::Number) -> Result, Error>; /// Get block header. - fn header(&self, id: &BlockId) -> Result, Error>; + fn header(&self, id: &BlockId) -> Result, Error>; /// Get block body. - fn body(&self, id: &BlockId) -> Result, Error>; + fn body(&self, id: &BlockId) -> Result>, Error>; /// Get block justification. - fn justification(&self, id: &BlockId) -> Result, Error>; + fn justification(&self, id: &BlockId) -> Result>, Error>; /// Get method execution proof. - fn execution_proof(&self, block: &block::HeaderHash, method: &str, data: &[u8]) -> Result<(Vec, Vec>), Error>; + fn execution_proof(&self, block: &Block::Hash, method: &str, data: &[u8]) -> Result<(Vec, Vec>), Error>; } -impl Client for PolkadotClient where - B: client::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static, - Error: From<<::State as state_machine::backend::Backend>::Error>, { +impl Client for PolkadotClient where + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static, + Block: BlockT, + Error: From<<>::State as state_machine::backend::Backend>::Error>, { - fn import(&self, is_best: bool, header: block::Header, justification: Justification, body: Option) -> Result { + fn import(&self, is_best: bool, header: Block::Header, justification: Justification, body: Option>) -> Result { // TODO: defer justification check. let justified_header = self.check_justification(header, justification.into())?; let origin = if is_best { BlockOrigin::NetworkBroadcast } else { BlockOrigin::NetworkInitialSync }; (self as &PolkadotClient).import_block(origin, justified_header, body) } - fn info(&self) -> Result { + fn info(&self) -> Result, Error> { (self as &PolkadotClient).info() } - fn block_status(&self, id: &BlockId) -> Result { + fn block_status(&self, id: &BlockId) -> Result { (self as &PolkadotClient).block_status(id) } - fn block_hash(&self, block_number: block::Number) -> Result, Error> { + fn block_hash(&self, block_number: ::Number) -> Result, Error> { (self as &PolkadotClient).block_hash(block_number) } - fn header(&self, id: &BlockId) -> Result, Error> { + fn header(&self, id: &BlockId) -> Result, Error> { (self as &PolkadotClient).header(id) } - fn body(&self, id: &BlockId) -> Result, Error> { + fn body(&self, id: &BlockId) -> Result>, Error> { (self as &PolkadotClient).body(id) } - fn justification(&self, id: &BlockId) -> Result, Error> { + fn justification(&self, id: &BlockId) -> Result>, Error> { (self as &PolkadotClient).justification(id) } - fn execution_proof(&self, block: &block::HeaderHash, method: &str, data: &[u8]) -> Result<(Vec, Vec>), Error> { + fn execution_proof(&self, block: &Block::Hash, method: &str, data: &[u8]) -> Result<(Vec, Vec>), Error> { (self as &PolkadotClient).execution_proof(&BlockId::Hash(block.clone()), method, data) } } diff --git a/substrate/network/src/consensus.rs b/substrate/network/src/consensus.rs index 5c4689384deb3..318c68a335e61 100644 --- a/substrate/network/src/consensus.rs +++ b/substrate/network/src/consensus.rs @@ -17,47 +17,36 @@ //! Consensus related bits of the network service. use std::collections::{HashMap, HashSet}; -use futures::sync::{oneshot, mpsc}; +use futures::sync::mpsc; use std::time::{Instant, Duration}; use io::SyncIo; use protocol::Protocol; use network::PeerId; -use primitives::{Hash, block::HeaderHash, block::Id as BlockId, block::Header}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; +use runtime_primitives::generic::BlockId; use message::{self, Message}; -use runtime_support::Hashable; // TODO: Add additional spam/DoS attack protection. const MESSAGE_LIFETIME_SECONDS: u64 = 600; -struct CandidateRequest { - id: message::RequestId, - completion: oneshot::Sender>, -} - -struct PeerConsensus { - candidate_fetch: Option, - candidate_available: Option, - known_messages: HashSet, +struct PeerConsensus { + known_messages: HashSet, } /// Consensus network protocol handler. Manages statements and candidate requests. -pub struct Consensus { - peers: HashMap, - our_candidate: Option<(Hash, Vec)>, - statement_sink: Option>, - bft_message_sink: Option<(mpsc::UnboundedSender, Hash)>, - messages: Vec<(Hash, Instant, message::Message)>, - message_hashes: HashSet, - last_block_hash: HeaderHash, +pub struct Consensus { + peers: HashMap>, + bft_message_sink: Option<(mpsc::UnboundedSender>, B::Hash)>, + messages: Vec<(B::Hash, Instant, message::Message)>, + message_hashes: HashSet, + last_block_hash: B::Hash, } -impl Consensus { +impl Consensus { /// Create a new instance. - pub fn new(best_hash: HeaderHash) -> Consensus { + pub fn new(best_hash: B::Hash) -> Consensus { Consensus { peers: HashMap::new(), - our_candidate: None, - statement_sink: None, bft_message_sink: None, messages: Default::default(), message_hashes: Default::default(), @@ -67,12 +56,11 @@ impl Consensus { /// Closes all notification streams. pub fn restart(&mut self) { - self.statement_sink = None; self.bft_message_sink = None; } /// Handle new connected peer. - pub fn new_peer(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, roles: &[message::Role]) { + pub fn new_peer(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, roles: &[message::Role]) { if roles.iter().any(|r| *r == message::Role::Validator) { trace!(target:"sync", "Registering validator {}", peer_id); // Send out all known messages. @@ -83,14 +71,12 @@ impl Consensus { protocol.send_message(io, peer_id, message.clone()); } self.peers.insert(peer_id, PeerConsensus { - candidate_fetch: None, - candidate_available: None, known_messages, }); } } - fn propagate(&mut self, io: &mut SyncIo, protocol: &Protocol, message: message::Message, hash: Hash) { + fn propagate(&mut self, io: &mut SyncIo, protocol: &Protocol, message: message::Message, hash: B::Hash) { for (id, ref mut peer) in self.peers.iter_mut() { if peer.known_messages.insert(hash.clone()) { protocol.send_message(io, *id, message.clone()); @@ -98,48 +84,13 @@ impl Consensus { } } - fn register_message(&mut self, hash: Hash, message: message::Message) { + fn register_message(&mut self, hash: B::Hash, message: message::Message) { if self.message_hashes.insert(hash) { self.messages.push((hash, Instant::now(), message)); } } - pub fn on_statement(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, statement: message::Statement, hash: Hash) { - if self.message_hashes.contains(&hash) { - trace!(target:"sync", "Ignored already known statement from {}", peer_id); - } - if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { - // TODO: validate signature? - match &statement.statement { - &message::UnsignedStatement::Candidate(ref receipt) => peer.candidate_available = Some(Hash::from(receipt.blake2_256())), - &message::UnsignedStatement::Available(ref hash) => peer.candidate_available = Some(*hash), - &message::UnsignedStatement::Valid(_) | &message::UnsignedStatement::Invalid(_) => (), - } - peer.known_messages.insert(hash); - if let Some(sink) = self.statement_sink.take() { - if let Err(e) = sink.unbounded_send(statement.clone()) { - trace!(target:"sync", "Error broadcasting statement notification: {:?}", e); - } else { - self.statement_sink = Some(sink); - } - } - } else { - trace!(target:"sync", "Ignored statement from unregistered peer {}", peer_id); - return; - } - let message = Message::Statement(statement); - self.register_message(hash.clone(), message.clone()); - // Propagate to other peers. - self.propagate(io, protocol, message, hash); - } - - pub fn statements(&mut self) -> mpsc::UnboundedReceiver{ - let (sink, stream) = mpsc::unbounded(); - self.statement_sink = Some(sink); - stream - } - - pub fn on_bft_message(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, message: message::LocalizedBftMessage, hash: Hash) { + pub fn on_bft_message(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, message: message::LocalizedBftMessage, hash: B::Hash) { if self.message_hashes.contains(&hash) { trace!(target:"sync", "Ignored already known BFT message from {}", peer_id); return; @@ -182,7 +133,7 @@ impl Consensus { self.propagate(io, protocol, message, hash); } - pub fn bft_messages(&mut self, parent_hash: Hash) -> mpsc::UnboundedReceiver{ + pub fn bft_messages(&mut self, parent_hash: B::Hash) -> mpsc::UnboundedReceiver> { let (sink, stream) = mpsc::unbounded(); for &(_, _, ref message) in self.messages.iter() { @@ -200,40 +151,7 @@ impl Consensus { stream } - pub fn fetch_candidate(&mut self, io: &mut SyncIo, protocol: &Protocol, hash: &Hash) -> oneshot::Receiver> { - // Request from the first peer that has it available. - // TODO: random peer selection. - trace!(target:"sync", "Trying to fetch candidate {:?}", hash); - let (sender, receiver) = oneshot::channel(); - if let Some((peer_id, ref mut peer)) = self.peers.iter_mut() - .find(|&(_, ref peer)| peer.candidate_fetch.is_none() && peer.candidate_available.as_ref().map_or(false, |h| h == hash)) { - - trace!(target:"sync", "Fetching candidate from {}", peer_id); - let id = 0; //TODO: generate unique id - peer.candidate_fetch = Some(CandidateRequest { - id: id, - completion: sender, - }); - let request = message::CandidateRequest { - id: id, - hash: *hash, - }; - protocol.send_message(io, *peer_id, Message::CandidateRequest(request)); - } - // If no peer found `sender` is dropped and `receiver` is canceled immediatelly. - return receiver; - } - - pub fn send_statement(&mut self, io: &mut SyncIo, protocol: &Protocol, statement: message::Statement) { - // Broadcast statement to all validators. - trace!(target:"sync", "Broadcasting statement {:?}", statement); - let message = Message::Statement(statement); - let hash = Protocol::hash_message(&message); - self.register_message(hash.clone(), message.clone()); - self.propagate(io, protocol, message, hash); - } - - pub fn send_bft_message(&mut self, io: &mut SyncIo, protocol: &Protocol, message: message::LocalizedBftMessage) { + pub fn send_bft_message(&mut self, io: &mut SyncIo, protocol: &Protocol, message: message::LocalizedBftMessage) { // Broadcast message to all validators. trace!(target:"sync", "Broadcasting BFT message {:?}", message); let message = Message::BftMessage(message); @@ -242,48 +160,11 @@ impl Consensus { self.propagate(io, protocol, message, hash); } - pub fn set_local_candidate(&mut self, candidate: Option<(Hash, Vec)>) { - trace!(target:"sync", "Set local candidate to {:?}", candidate.as_ref().map(|&(h, _)| h)); - self.our_candidate = candidate; - } - - pub fn on_candidate_request(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, request: message::CandidateRequest) { - let response = match self.our_candidate { - Some((ref hash, ref data)) if *hash == request.hash => Some(data.clone()), - _ => None, - }; - let msg = message::CandidateResponse { - id: request.id, - data: response, - }; - protocol.send_message(io, peer_id, Message::CandidateResponse(msg)); - } - - pub fn on_candidate_response(&mut self, io: &mut SyncIo, _protocol: &Protocol, peer_id: PeerId, response: message::CandidateResponse) { - if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { - if let Some(request) = peer.candidate_fetch.take() { - if response.id == request.id { - if let Some(data) = response.data { - if let Err(e) = request.completion.send(data) { - trace!(target:"sync", "Error sending candidate data notification: {:?}", e); - } - } - } else { - trace!(target:"sync", "Unexpected candidate response from {}", peer_id); - io.disable_peer(peer_id); - } - } else { - trace!(target:"sync", "Unexpected candidate response from {}", peer_id); - io.disable_peer(peer_id); - } - } - } - - pub fn peer_disconnected(&mut self, _io: &mut SyncIo, _protocol: &Protocol, peer_id: PeerId) { + pub fn peer_disconnected(&mut self, _io: &mut SyncIo, _protocol: &Protocol, peer_id: PeerId) { self.peers.remove(&peer_id); } - pub fn collect_garbage(&mut self, best_hash_and_header: Option<(HeaderHash, &Header)>) { + pub fn collect_garbage(&mut self, best_hash_and_header: Option<(B::Hash, &B::Header)>) { let hashes = &mut self.message_hashes; let last_block_hash = &mut self.last_block_hash; let before = self.messages.len(); @@ -303,7 +184,6 @@ impl Consensus { best_header.map_or(true, |header| { if match *message { Message::BftMessage(ref msg) => msg.parent_hash != header.parent_hash, - Message::Statement(ref msg) => msg.parent_hash != header.parent_hash, _ => true, } { hashes.remove(hash); diff --git a/substrate/network/src/lib.rs b/substrate/network/src/lib.rs index f894def9c4f6c..8a3d14a788c3b 100644 --- a/substrate/network/src/lib.rs +++ b/substrate/network/src/lib.rs @@ -30,6 +30,7 @@ extern crate substrate_state_machine as state_machine; extern crate substrate_serializer as ser; extern crate substrate_client as client; extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_bft; extern crate serde; extern crate serde_json; @@ -59,19 +60,13 @@ pub mod error; #[cfg(test)] mod test; -pub use service::{Service, FetchFuture, StatementStream, ConsensusService, BftMessageStream, +pub use service::{Service, FetchFuture, ConsensusService, BftMessageStream, TransactionPool, Params, ManageNetwork, SyncProvider}; pub use protocol::{ProtocolStatus}; pub use sync::{Status as SyncStatus, SyncState}; pub use network::{NonReservedPeerMode, NetworkConfiguration}; pub use network_devp2p::{ConnectionFilter, ConnectionDirection}; -pub use message::{Statement, BftMessage, LocalizedBftMessage, ConsensusVote, SignedConsensusVote, SignedConsensusMessage, SignedConsensusProposal}; +pub use message::{BftMessage, LocalizedBftMessage, ConsensusVote, SignedConsensusVote, SignedConsensusMessage, SignedConsensusProposal}; pub use error::Error; pub use config::{Role, ProtocolConfig}; pub use on_demand::{OnDemand, OnDemandService, Response as OnDemandResponse}; - -// TODO: move it elsewhere -fn header_hash(header: &primitives::Header) -> primitives::block::HeaderHash { - use runtime_support::Hashable; - header.blake2_256().into() -} diff --git a/substrate/network/src/message.rs b/substrate/network/src/message.rs index 032cd375f0901..0fec7d1d9e8e3 100644 --- a/substrate/network/src/message.rs +++ b/substrate/network/src/message.rs @@ -16,9 +16,9 @@ //! Network packet message types. These get serialized and put into the lower level protocol payload. -use primitives::{AuthorityId, Hash}; -use primitives::block::{Number as BlockNumber, HeaderHash, Header, Body, Block}; -use primitives::bft::Justification; +use primitives::AuthorityId; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; +use runtime_primitives::bft::Justification; use service::Role as RoleFlags; use ed25519; @@ -90,29 +90,29 @@ pub enum BlockAttribute { #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] /// Block data sent in the response. -pub struct BlockData { +pub struct BlockData { /// Block header hash. - pub hash: HeaderHash, + pub hash: B::Hash, /// Block header if requested. - pub header: Option

    , + pub header: Option, /// Block body if requested. - pub body: Option, + pub body: Option>, /// Block receipt if requested. pub receipt: Option, /// Block message queue if requested. pub message_queue: Option, /// Justification if requested. - pub justification: Option, + pub justification: Option>, } #[serde(untagged)] #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] /// Identifies starting point of a block sequence. -pub enum FromBlock { +pub enum FromBlock { /// Start with given hash. - Hash(HeaderHash), + Hash(B::Hash), /// Start with given block number. - Number(BlockNumber), + Number(::Number), } #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] @@ -125,68 +125,35 @@ pub enum Direction { } /// A set of transactions. -pub type Transactions = Vec>; - -/// Statements circulated among peers. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub enum UnsignedStatement { - /// Broadcast by a authority to indicate that this is his candidate for - /// inclusion. - /// - /// Broadcasting two different candidate messages per round is not allowed. - Candidate(Vec), - /// Broadcast by a authority to attest that the candidate with given digest - /// is valid. - Valid(Hash), - /// Broadcast by a authority to attest that the auxiliary data for a candidate - /// with given digest is available. - Available(Hash), - /// Broadcast by a authority to attest that the candidate with given digest - /// is invalid. - Invalid(Hash), -} - -/// A signed statement. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct Statement { - /// Parent relay chain block header hash. - pub parent_hash: HeaderHash, - /// The statement. - pub statement: UnsignedStatement, - /// The signature. - pub signature: ed25519::Signature, - /// The sender. - pub sender: AuthorityId, -} - +pub type Transactions = Vec<::Extrinsic>; /// Communication that can occur between participants in consensus. #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub enum BftMessage { +pub enum BftMessage { /// A consensus message (proposal or vote) - Consensus(SignedConsensusMessage), + Consensus(SignedConsensusMessage), /// Auxiliary communication (just proof-of-lock for now). - Auxiliary(Justification), + Auxiliary(Justification), } /// BFT Consensus message with parent header hash attached to it. #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct LocalizedBftMessage { +pub struct LocalizedBftMessage { /// Consensus message. - pub message: BftMessage, + pub message: BftMessage, /// Parent header hash. - pub parent_hash: HeaderHash, + pub parent_hash: B::Hash, } /// A localized proposal message. Contains two signed pieces of data. #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct SignedConsensusProposal { +pub struct SignedConsensusProposal { /// The round number. pub round_number: u32, /// The proposal sent. - pub proposal: Block, + pub proposal: B, /// The digest of the proposal. - pub digest: Hash, + pub digest: B::Hash, /// The sender of the proposal pub sender: AuthorityId, /// The signature on the message (propose, round number, digest) @@ -197,9 +164,9 @@ pub struct SignedConsensusProposal { /// A localized vote message, including the sender. #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct SignedConsensusVote { +pub struct SignedConsensusVote { /// The message sent. - pub vote: ConsensusVote, + pub vote: ConsensusVote, /// The sender of the message pub sender: AuthorityId, /// The signature of the message. @@ -208,63 +175,57 @@ pub struct SignedConsensusVote { /// Votes during a consensus round. #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub enum ConsensusVote { +pub enum ConsensusVote { /// Prepare to vote for proposal with digest D. - Prepare(u32, Hash), + Prepare(u32, H), /// Commit to proposal with digest D.. - Commit(u32, Hash), + Commit(u32, H), /// Propose advancement to a new round. AdvanceRound(u32), } /// A localized message. #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub enum SignedConsensusMessage { +pub enum SignedConsensusMessage { /// A proposal. - Propose(SignedConsensusProposal), + Propose(SignedConsensusProposal), /// A vote. - Vote(SignedConsensusVote), + Vote(SignedConsensusVote), } #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] /// A network message. -pub enum Message { +pub enum Message { /// Status packet. - Status(Status), + Status(Status), /// Block request. - BlockRequest(BlockRequest), + BlockRequest(BlockRequest), /// Block response. - BlockResponse(BlockResponse), + BlockResponse(BlockResponse), /// Block announce. - BlockAnnounce(BlockAnnounce), + BlockAnnounce(BlockAnnounce), /// Transactions. - Transactions(Transactions), - /// Consensus statement. - Statement(Statement), - /// Candidate data request. - CandidateRequest(CandidateRequest), - /// Candidate response. - CandidateResponse(CandidateResponse), + Transactions(Transactions), /// BFT Consensus statement. - BftMessage(LocalizedBftMessage), + BftMessage(LocalizedBftMessage), /// Remote method call request. - RemoteCallRequest(RemoteCallRequest), + RemoteCallRequest(RemoteCallRequest), /// Remote method call response. RemoteCallResponse(RemoteCallResponse), } #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct Status { +pub struct Status { /// Protocol version. pub version: u32, /// Supported roles. pub roles: Vec, /// Best block number. - pub best_number: BlockNumber, + pub best_number: ::Number, /// Best block hash. - pub best_hash: HeaderHash, + pub best_hash: B::Hash, /// Genesis block hash. - pub genesis_hash: HeaderHash, + pub genesis_hash: B::Hash, /// Signatue of `best_hash` made with validator address. Required for the validator role. pub validator_signature: Option, /// Validator address. Required for the validator role. @@ -275,62 +236,44 @@ pub struct Status { #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] /// Request block data from a peer. -pub struct BlockRequest { +pub struct BlockRequest { /// Unique request id. pub id: RequestId, /// Bits of block data to request. pub fields: Vec, /// Start from this block. - pub from: FromBlock, + pub from: FromBlock, /// End at this block. An implementation defined maximum is used when unspecified. - pub to: Option, + pub to: Option, /// Sequence direction. pub direction: Direction, /// Maximum number of blocks to return. An implementation defined maximum is used when unspecified. pub max: Option, } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Request candidate block data from a peer. -pub struct CandidateRequest { - /// Unique request id. - pub id: RequestId, - /// Candidate receipt hash. - pub hash: Hash, -} - -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Candidate block data response. -pub struct CandidateResponse { - /// Unique request id. - pub id: RequestId, - /// Candidate data. Empty if the peer does not have the candidate anymore. - pub data: Option>, -} - #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] /// Response to `BlockRequest` -pub struct BlockResponse { +pub struct BlockResponse { /// Id of a request this response was made for. pub id: RequestId, /// Block data for the requested sequence. - pub blocks: Vec, + pub blocks: Vec>, } #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] /// Announce a new complete relay chain block on the network. -pub struct BlockAnnounce { +pub struct BlockAnnounce { /// New block header. - pub header: Header, + pub header: H, } #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] /// Remote call request. -pub struct RemoteCallRequest { +pub struct RemoteCallRequest { /// Unique request id. pub id: RequestId, /// Block at which to perform call. - pub block: HeaderHash, + pub block: H, /// Method name. pub method: String, /// Call data. diff --git a/substrate/network/src/on_demand.rs b/substrate/network/src/on_demand.rs index 76180f616d0bc..0b2ebbb8fed13 100644 --- a/substrate/network/src/on_demand.rs +++ b/substrate/network/src/on_demand.rs @@ -30,6 +30,7 @@ use io::SyncIo; use message; use network::PeerId; use service; +use runtime_primitives::traits::{Block as BlockT}; /// Remote request timeout. const REQUEST_TIMEOUT: Duration = Duration::from_secs(15); @@ -50,9 +51,9 @@ pub trait OnDemandService: Send + Sync { } /// On-demand requests service. Dispatches requests to appropriate peers. -pub struct OnDemand { - core: Mutex>, - checker: Arc, +pub struct OnDemand> { + core: Mutex>, + checker: Arc>, } /// On-demand response. @@ -61,19 +62,19 @@ pub struct Response { } #[derive(Default)] -struct OnDemandCore { +struct OnDemandCore> { service: Weak, next_request_id: u64, - pending_requests: VecDeque, - active_peers: LinkedHashMap, + pending_requests: VecDeque>, + active_peers: LinkedHashMap>, idle_peers: VecDeque, } -struct Request { +struct Request { id: u64, timestamp: Instant, sender: Sender, - request: RemoteCallRequest, + request: RemoteCallRequest, } impl Future for Response { @@ -86,9 +87,9 @@ impl Future for Response { } } -impl OnDemand where E: service::ExecuteInContext { +impl OnDemand where E: service::ExecuteInContext { /// Creates new on-demand service. - pub fn new(checker: Arc) -> Self { + pub fn new(checker: Arc>) -> Self { OnDemand { checker, core: Mutex::new(OnDemandCore { @@ -107,7 +108,7 @@ impl OnDemand where E: service::ExecuteInContext { } /// Execute method call on remote node, returning execution result and proof. - pub fn remote_call(&self, request: RemoteCallRequest) -> Response { + pub fn remote_call(&self, request: RemoteCallRequest) -> Response { let (sender, receiver) = channel(); let result = Response { receiver: receiver, @@ -123,7 +124,7 @@ impl OnDemand where E: service::ExecuteInContext { } } -impl OnDemandService for OnDemand where E: service::ExecuteInContext { +impl OnDemandService for OnDemand where B: BlockT, E: service::ExecuteInContext { fn on_connect(&self, peer: PeerId, role: service::Role) { if !role.intersects(service::Role::FULL | service::Role::COLLATOR | service::Role::VALIDATOR) { // TODO: correct? return; @@ -175,15 +176,15 @@ impl OnDemandService for OnDemand where E: service::ExecuteInContext { } } -impl Fetcher for OnDemand where E: service::ExecuteInContext { +impl Fetcher for OnDemand where B: BlockT, E: service::ExecuteInContext { type RemoteCallResult = Response; - fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult { + fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult { self.remote_call(request) } } -impl OnDemandCore where E: service::ExecuteInContext { +impl OnDemandCore where B: BlockT, E: service::ExecuteInContext { pub fn add_peer(&mut self, peer: PeerId) { self.idle_peers.push_back(peer); } @@ -214,7 +215,7 @@ impl OnDemandCore where E: service::ExecuteInContext { } } - pub fn insert(&mut self, sender: Sender, request: RemoteCallRequest) { + pub fn insert(&mut self, sender: Sender, request: RemoteCallRequest) { let request_id = self.next_request_id; self.next_request_id += 1; @@ -226,7 +227,7 @@ impl OnDemandCore where E: service::ExecuteInContext { }); } - pub fn remove(&mut self, peer: PeerId, id: u64) -> Option { + pub fn remove(&mut self, peer: PeerId, id: u64) -> Option> { match self.active_peers.entry(peer) { Entry::Occupied(entry) => match entry.get().id == id { true => { diff --git a/substrate/network/src/protocol.rs b/substrate/network/src/protocol.rs index 8e9b3ace68902..3f4b9965f3355 100644 --- a/substrate/network/src/protocol.rs +++ b/substrate/network/src/protocol.rs @@ -19,23 +19,20 @@ use std::{mem, cmp}; use std::sync::Arc; use std::time; use parking_lot::{RwLock, Mutex}; -use futures::sync::oneshot; use serde_json; -use primitives::block::{HeaderHash, ExtrinsicHash, Number as BlockNumber, Header, Id as BlockId}; -use primitives::{Hash, blake2_256}; -use runtime_support::Hashable; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, HashingFor}; +use runtime_primitives::generic::BlockId; use network::{PeerId, NodeId}; use message::{self, Message}; use sync::{ChainSync, Status as SyncStatus, SyncState}; use consensus::Consensus; -use service::{Role, TransactionPool, StatementStream, BftMessageStream}; +use service::{Role, TransactionPool, BftMessageStream}; use config::ProtocolConfig; use chain::Client; use on_demand::OnDemandService; use io::SyncIo; use error; -use super::header_hash; const REQUEST_TIMEOUT_SEC: u64 = 40; const PROTOCOL_VERSION: u32 = 0; @@ -44,25 +41,25 @@ const PROTOCOL_VERSION: u32 = 0; const MAX_BLOCK_DATA_RESPONSE: u32 = 128; // Lock must always be taken in order declared here. -pub struct Protocol { +pub struct Protocol { config: ProtocolConfig, - chain: Arc, + chain: Arc>, on_demand: Option>, - genesis_hash: HeaderHash, - sync: RwLock, - consensus: Mutex, + genesis_hash: B::Hash, + sync: RwLock>, + consensus: Mutex>, // All connected peers - peers: RwLock>, + peers: RwLock>>, // Connected peers pending Status message. handshaking_peers: RwLock>, - transaction_pool: Arc, + transaction_pool: Arc>, } /// Syncing status and statistics #[derive(Clone)] -pub struct ProtocolStatus { +pub struct ProtocolStatus { /// Sync status. - pub sync: SyncStatus, + pub sync: SyncStatus, /// Total number of connected peers pub num_peers: usize, /// Total number of active peers. @@ -70,37 +67,37 @@ pub struct ProtocolStatus { } /// Peer information -struct Peer { +struct Peer { /// Protocol version protocol_version: u32, /// Roles roles: Role, /// Peer best block hash - best_hash: HeaderHash, + best_hash: B::Hash, /// Peer best block number - best_number: BlockNumber, + best_number: ::Number, /// Pending block request if any - block_request: Option, + block_request: Option>, /// Request timestamp request_timestamp: Option, /// Holds a set of transactions known to this peer. - known_transactions: HashSet, + known_transactions: HashSet, /// Holds a set of blocks known to this peer. - known_blocks: HashSet, + known_blocks: HashSet, /// Request counter, next_request_id: message::RequestId, } #[derive(Debug)] -pub struct PeerInfo { +pub struct PeerInfo { /// Roles pub roles: Role, /// Protocol version pub protocol_version: u32, /// Peer best block hash - pub best_hash: HeaderHash, + pub best_hash: B::Hash, /// Peer best block number - pub best_number: BlockNumber, + pub best_number: ::Number, } /// Transaction stats @@ -112,9 +109,16 @@ pub struct TransactionStats { pub propagated_to: BTreeMap, } -impl Protocol { +impl Protocol where + B::Header: HeaderT +{ /// Create a new instance. - pub fn new(config: ProtocolConfig, chain: Arc, on_demand: Option>, transaction_pool: Arc) -> error::Result { + pub fn new( + config: ProtocolConfig, + chain: Arc>, + on_demand: Option>, + transaction_pool: Arc> + ) -> error::Result { let info = chain.info()?; let best_hash = info.chain.best_hash; let sync = ChainSync::new(config.roles, &info); @@ -133,7 +137,7 @@ impl Protocol { } /// Returns protocol status - pub fn status(&self) -> ProtocolStatus { + pub fn status(&self) -> ProtocolStatus { let sync = self.sync.read(); let peers = self.peers.read(); ProtocolStatus { @@ -144,7 +148,7 @@ impl Protocol { } pub fn handle_packet(&self, io: &mut SyncIo, peer_id: PeerId, data: &[u8]) { - let message: Message = match serde_json::from_slice(data) { + let message: Message = match serde_json::from_slice(data) { Ok(m) => m, Err(e) => { debug!("Invalid packet from {}: {}", peer_id, e); @@ -184,17 +188,14 @@ impl Protocol { Message::BlockAnnounce(announce) => { self.on_block_announce(io, peer_id, announce); }, - Message::Statement(s) => self.on_statement(io, peer_id, s, blake2_256(data).into()), - Message::CandidateRequest(r) => self.on_candidate_request(io, peer_id, r), - Message::CandidateResponse(r) => self.on_candidate_response(io, peer_id, r), - Message::BftMessage(m) => self.on_bft_message(io, peer_id, m, blake2_256(data).into()), + Message::BftMessage(m) => self.on_bft_message(io, peer_id, m, HashingFor::::hash(data)), Message::Transactions(m) => self.on_transactions(io, peer_id, m), Message::RemoteCallRequest(request) => self.on_remote_call_request(io, peer_id, request), Message::RemoteCallResponse(response) => self.on_remote_call_response(io, peer_id, response) } } - pub fn send_message(&self, io: &mut SyncIo, peer_id: PeerId, mut message: Message) { + pub fn send_message(&self, io: &mut SyncIo, peer_id: PeerId, mut message: Message) { match &mut message { &mut Message::BlockRequest(ref mut r) => { let mut peers = self.peers.write(); @@ -214,9 +215,9 @@ impl Protocol { } } - pub fn hash_message(message: &Message) -> Hash { + pub fn hash_message(message: &Message) -> B::Hash { let data = serde_json::to_vec(&message).expect("Serializer is infallible; qed"); - blake2_256(&data).into() + HashingFor::::hash(&data) } /// Called when a new peer is connected @@ -242,7 +243,7 @@ impl Protocol { } } - fn on_block_request(&self, io: &mut SyncIo, peer: PeerId, request: message::BlockRequest) { + fn on_block_request(&self, io: &mut SyncIo, peer: PeerId, request: message::BlockRequest) { trace!(target: "sync", "BlockRequest {} from {}: from {:?} to {:?} max {:?}", request.id, peer, request.from, request.to, request.max); let mut blocks = Vec::new(); let mut id = match request.from { @@ -265,8 +266,8 @@ impl Protocol { if blocks.len() >= max{ break; } - let number = header.number; - let hash = header_hash(&header); + let number = header.number().clone(); + let hash = header.hash(); let block_data = message::BlockData { hash: hash, header: if get_header { Some(header) } else { None }, @@ -293,62 +294,27 @@ impl Protocol { self.send_message(io, peer, Message::BlockResponse(response)) } - fn on_block_response(&self, io: &mut SyncIo, peer: PeerId, request: message::BlockRequest, response: message::BlockResponse) { + fn on_block_response(&self, io: &mut SyncIo, peer: PeerId, request: message::BlockRequest, response: message::BlockResponse) { // TODO: validate response trace!(target: "sync", "BlockResponse {} from {} with {} blocks", response.id, peer, response.blocks.len()); self.sync.write().on_block_data(io, self, peer, request, response); } - fn on_candidate_request(&self, io: &mut SyncIo, peer: PeerId, request: message::CandidateRequest) { - trace!(target: "sync", "CandidateRequest {} from {} for {}", request.id, peer, request.hash); - self.consensus.lock().on_candidate_request(io, self, peer, request); - } - - fn on_candidate_response(&self, io: &mut SyncIo, peer: PeerId, response: message::CandidateResponse) { - trace!(target: "sync", "CandidateResponse {} from {} with {:?} bytes", response.id, peer, response.data.as_ref().map(|d| d.len())); - self.consensus.lock().on_candidate_response(io, self, peer, response); - } - - fn on_statement(&self, io: &mut SyncIo, peer: PeerId, statement: message::Statement, hash: Hash) { - trace!(target: "sync", "Statement from {}: {:?}", peer, statement); - self.consensus.lock().on_statement(io, self, peer, statement, hash); - } - - fn on_bft_message(&self, io: &mut SyncIo, peer: PeerId, message: message::LocalizedBftMessage, hash: Hash) { + fn on_bft_message(&self, io: &mut SyncIo, peer: PeerId, message: message::LocalizedBftMessage, hash: B::Hash) { trace!(target: "sync", "BFT message from {}: {:?}", peer, message); self.consensus.lock().on_bft_message(io, self, peer, message, hash); } /// See `ConsensusService` trait. - pub fn send_bft_message(&self, io: &mut SyncIo, message: message::LocalizedBftMessage) { + pub fn send_bft_message(&self, io: &mut SyncIo, message: message::LocalizedBftMessage) { self.consensus.lock().send_bft_message(io, self, message) } /// See `ConsensusService` trait. - pub fn bft_messages(&self, parent_hash: Hash) -> BftMessageStream { + pub fn bft_messages(&self, parent_hash: B::Hash) -> BftMessageStream { self.consensus.lock().bft_messages(parent_hash) } - /// See `ConsensusService` trait. - pub fn statements(&self) -> StatementStream { - self.consensus.lock().statements() - } - - /// See `ConsensusService` trait. - pub fn fetch_candidate(&self, io: &mut SyncIo, hash: &Hash) -> oneshot::Receiver> { - self.consensus.lock().fetch_candidate(io, self, hash) - } - - /// See `ConsensusService` trait. - pub fn send_statement(&self, io: &mut SyncIo, statement: message::Statement) { - self.consensus.lock().send_statement(io, self, statement) - } - - /// See `ConsensusService` trait. - pub fn set_local_candidate(&self, candidate: Option<(Hash, Vec)>) { - self.consensus.lock().set_local_candidate(candidate) - } - /// Perform time based maintenance. pub fn tick(&self, io: &mut SyncIo) { self.maintain_peers(io); @@ -377,7 +343,7 @@ impl Protocol { } } - pub fn peer_info(&self, peer: PeerId) -> Option { + pub fn peer_info(&self, peer: PeerId) -> Option> { self.peers.read().get(&peer).map(|p| { PeerInfo { roles: p.roles, @@ -389,7 +355,7 @@ impl Protocol { } /// Called by peer to report status - fn on_status_message(&self, io: &mut SyncIo, peer_id: PeerId, status: message::Status) { + fn on_status_message(&self, io: &mut SyncIo, peer_id: PeerId, status: message::Status) { trace!(target: "sync", "New peer {} {:?}", peer_id, status); if io.is_expired() { trace!(target: "sync", "Status packet from expired session {}:{}", peer_id, io.peer_info(peer_id)); @@ -436,7 +402,7 @@ impl Protocol { } /// Called when peer sends us new transactions - fn on_transactions(&self, _io: &mut SyncIo, peer_id: PeerId, transactions: message::Transactions) { + fn on_transactions(&self, _io: &mut SyncIo, peer_id: PeerId, transactions: message::Transactions) { // Accept transactions only when fully synced if self.sync.read().status().state != SyncState::Idle { trace!(target: "sync", "{} Ignoring transactions while syncing", peer_id); @@ -502,9 +468,9 @@ impl Protocol { self.consensus.lock().restart(); } - pub fn on_block_announce(&self, io: &mut SyncIo, peer_id: PeerId, announce: message::BlockAnnounce) { + pub fn on_block_announce(&self, io: &mut SyncIo, peer_id: PeerId, announce: message::BlockAnnounce) { let header = announce.header; - let hash: HeaderHash = header.blake2_256().into(); + let hash = header.hash(); { let mut peers = self.peers.write(); if let Some(ref mut peer) = peers.get_mut(&peer_id) { @@ -514,7 +480,7 @@ impl Protocol { self.sync.write().on_block_announce(io, self, peer_id, hash, &header); } - pub fn on_block_imported(&self, io: &mut SyncIo, hash: HeaderHash, header: &Header) { + pub fn on_block_imported(&self, io: &mut SyncIo, hash: B::Hash, header: &B::Header) { self.sync.write().update_chain_info(&header); // send out block announcements let mut peers = self.peers.write(); @@ -531,7 +497,7 @@ impl Protocol { self.consensus.lock().collect_garbage(Some((hash, &header))); } - fn on_remote_call_request(&self, io: &mut SyncIo, peer_id: PeerId, request: message::RemoteCallRequest) { + fn on_remote_call_request(&self, io: &mut SyncIo, peer_id: PeerId, request: message::RemoteCallRequest) { trace!(target: "sync", "Remote request {} from {} ({} at {})", request.id, peer_id, request.method, request.block); let (value, proof) = match self.chain.execution_proof(&request.block, &request.method, &request.data) { Ok((value, proof)) => (value, proof), @@ -552,11 +518,11 @@ impl Protocol { self.on_demand.as_ref().map(|s| s.on_remote_response(io, peer_id, response)); } - pub fn transactions_stats(&self) -> BTreeMap { + pub fn transactions_stats(&self) -> BTreeMap { BTreeMap::new() } - pub fn chain(&self) -> &Client { + pub fn chain(&self) -> &Client { &*self.chain } } diff --git a/substrate/network/src/service.rs b/substrate/network/src/service.rs index c664d0bd06129..a1669ea8608bb 100644 --- a/substrate/network/src/service.rs +++ b/substrate/network/src/service.rs @@ -22,16 +22,15 @@ use futures::sync::{oneshot, mpsc}; use network::{NetworkProtocolHandler, NetworkContext, HostInfo, PeerId, ProtocolId, NetworkConfiguration , NonReservedPeerMode, ErrorKind}; use network_devp2p::{NetworkService}; -use primitives::block::{ExtrinsicHash, Header, HeaderHash}; -use primitives::Hash; use core_io::{TimerToken}; use io::NetSyncIo; use protocol::{Protocol, ProtocolStatus, PeerInfo as ProtocolPeerInfo, TransactionStats}; use config::{ProtocolConfig}; use error::Error; use chain::Client; -use message::{Statement, LocalizedBftMessage}; +use message::LocalizedBftMessage; use on_demand::OnDemandService; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; /// Polkadot devp2p protocol id pub const DOT_PROTOCOL_ID: ProtocolId = *b"dot"; @@ -40,10 +39,8 @@ const V0_PACKET_COUNT: u8 = 1; /// Type that represents fetch completion future. pub type FetchFuture = oneshot::Receiver>; -/// Type that represents statement stream. -pub type StatementStream = mpsc::UnboundedReceiver; /// Type that represents bft messages stream. -pub type BftMessageStream = mpsc::UnboundedReceiver; +pub type BftMessageStream = mpsc::UnboundedReceiver>; const TICK_TOKEN: TimerToken = 0; const TICK_TIMEOUT: Duration = Duration::from_millis(1000); @@ -68,60 +65,51 @@ bitflags! { } /// Sync status -pub trait SyncProvider: Send + Sync { +pub trait SyncProvider: Send + Sync { /// Get sync status - fn status(&self) -> ProtocolStatus; + fn status(&self) -> ProtocolStatus; /// Get peers information - fn peers(&self) -> Vec; + fn peers(&self) -> Vec>; /// Get this node id if available. fn node_id(&self) -> Option; /// Returns propagation count for pending transactions. - fn transactions_stats(&self) -> BTreeMap; + fn transactions_stats(&self) -> BTreeMap; } /// Transaction pool interface -pub trait TransactionPool: Send + Sync { +pub trait TransactionPool: Send + Sync { /// Get transactions from the pool that are ready to be propagated. - fn transactions(&self) -> Vec<(ExtrinsicHash, Vec)>; + fn transactions(&self) -> Vec<(B::Hash, B::Extrinsic)>; /// Import a transction into the pool. - fn import(&self, transaction: &[u8]) -> Option; + fn import(&self, transaction: &B::Extrinsic) -> Option; } /// ConsensusService -pub trait ConsensusService: Send + Sync { - /// Get statement stream. - fn statements(&self) -> StatementStream; - /// Send out a statement. - fn send_statement(&self, statement: Statement); +pub trait ConsensusService: Send + Sync { /// Maintain connectivity to given addresses. fn connect_to_authorities(&self, addresses: &[String]); - /// Fetch candidate. - fn fetch_candidate(&self, hash: &Hash) -> oneshot::Receiver>; - /// Note local candidate. Accepts candidate receipt hash and candidate data. - /// Pass `None` to clear the candidate. - fn set_local_candidate(&self, candidate: Option<(Hash, Vec)>); /// Get BFT message stream for messages corresponding to consensus on given /// parent hash. - fn bft_messages(&self, parent_hash: Hash) -> BftMessageStream; + fn bft_messages(&self, parent_hash: B::Hash) -> BftMessageStream; /// Send out a BFT message. - fn send_bft_message(&self, message: LocalizedBftMessage); + fn send_bft_message(&self, message: LocalizedBftMessage); } /// Service able to execute closure in the network context. -pub trait ExecuteInContext: Send + Sync { +pub trait ExecuteInContext: Send + Sync { /// Execute closure in network context. - fn execute_in_context(&self, closure: F); + fn execute_in_context)>(&self, closure: F); } /// devp2p Protocol handler -struct ProtocolHandler { - protocol: Protocol, +struct ProtocolHandler { + protocol: Protocol, } /// Peer connection information #[derive(Debug)] -pub struct PeerInfo { +pub struct PeerInfo { /// Public node id pub id: Option, /// Node client ID @@ -133,34 +121,34 @@ pub struct PeerInfo { /// Local endpoint address pub local_address: String, /// Dot protocol info. - pub dot_info: Option, + pub dot_info: Option>, } /// Service initialization parameters. -pub struct Params { +pub struct Params { /// Configuration. pub config: ProtocolConfig, /// Network layer configuration. pub network_config: NetworkConfiguration, /// Polkadot relay chain access point. - pub chain: Arc, + pub chain: Arc>, /// On-demand service reference. pub on_demand: Option>, /// Transaction pool. - pub transaction_pool: Arc, + pub transaction_pool: Arc>, } /// Polkadot network service. Handles network IO and manages connectivity. -pub struct Service { +pub struct Service { /// Network service network: NetworkService, /// Devp2p protocol handler - handler: Arc, + handler: Arc>, } -impl Service { +impl Service { /// Creates and register protocol with the network service - pub fn new(params: Params) -> Result, Error> { + pub fn new(params: Params) -> Result>, Error> { let service = NetworkService::new(params.network_config.clone(), None)?; let sync = Arc::new(Service { network: service, @@ -173,7 +161,7 @@ impl Service { } /// Called when a new block is imported by the client. - pub fn on_block_imported(&self, hash: HeaderHash, header: &Header) { + pub fn on_block_imported(&self, hash: B::Hash, header: &B::Header) { self.network.with_context(DOT_PROTOCOL_ID, |context| { self.handler.protocol.on_block_imported(&mut NetSyncIo::new(context), hash, header) }); @@ -203,28 +191,28 @@ impl Service { } } -impl Drop for Service { +impl Drop for Service { fn drop(&mut self) { self.stop(); } } -impl ExecuteInContext for Service { - fn execute_in_context(&self, closure: F) { +impl ExecuteInContext for Service { + fn execute_in_context)>(&self, closure: F) { self.network.with_context(DOT_PROTOCOL_ID, |context| { closure(&mut NetSyncIo::new(context), &self.handler.protocol) }); } } -impl SyncProvider for Service { +impl SyncProvider for Service { /// Get sync status - fn status(&self) -> ProtocolStatus { + fn status(&self) -> ProtocolStatus { self.handler.protocol.status() } /// Get sync peers - fn peers(&self) -> Vec { + fn peers(&self) -> Vec> { self.network.with_context_eval(DOT_PROTOCOL_ID, |ctx| { let peer_ids = self.network.connected_peers(); @@ -250,49 +238,29 @@ impl SyncProvider for Service { self.network.external_url() } - fn transactions_stats(&self) -> BTreeMap { + fn transactions_stats(&self) -> BTreeMap { self.handler.protocol.transactions_stats() } } /// ConsensusService -impl ConsensusService for Service { - fn statements(&self) -> StatementStream { - self.handler.protocol.statements() - } - +impl ConsensusService for Service { fn connect_to_authorities(&self, _addresses: &[String]) { //TODO: implement me } - fn fetch_candidate(&self, hash: &Hash) -> oneshot::Receiver> { - self.network.with_context_eval(DOT_PROTOCOL_ID, |context| { - self.handler.protocol.fetch_candidate(&mut NetSyncIo::new(context), hash) - }).expect("DOT Service is registered") - } - - fn send_statement(&self, statement: Statement) { - self.network.with_context(DOT_PROTOCOL_ID, |context| { - self.handler.protocol.send_statement(&mut NetSyncIo::new(context), statement); - }); - } - - fn set_local_candidate(&self, candidate: Option<(Hash, Vec)>) { - self.handler.protocol.set_local_candidate(candidate) - } - - fn bft_messages(&self, parent_hash: Hash) -> BftMessageStream { + fn bft_messages(&self, parent_hash: B::Hash) -> BftMessageStream { self.handler.protocol.bft_messages(parent_hash) } - fn send_bft_message(&self, message: LocalizedBftMessage) { + fn send_bft_message(&self, message: LocalizedBftMessage) { self.network.with_context(DOT_PROTOCOL_ID, |context| { self.handler.protocol.send_bft_message(&mut NetSyncIo::new(context), message); }); } } -impl NetworkProtocolHandler for ProtocolHandler { +impl NetworkProtocolHandler for ProtocolHandler { fn initialize(&self, io: &NetworkContext, _host_info: &HostInfo) { io.register_timer(TICK_TOKEN, TICK_TIMEOUT) .expect("Error registering sync timer"); @@ -339,7 +307,7 @@ pub trait ManageNetwork : Send + Sync { } -impl ManageNetwork for Service { +impl ManageNetwork for Service { fn accept_unreserved_peers(&self) { self.network.set_non_reserved_mode(NonReservedPeerMode::Accept); } diff --git a/substrate/network/src/sync.rs b/substrate/network/src/sync.rs index 4bf6891aa2d70..b8c0c06f7cd01 100644 --- a/substrate/network/src/sync.rs +++ b/substrate/network/src/sync.rs @@ -19,38 +19,38 @@ use io::SyncIo; use protocol::Protocol; use network::PeerId; use client::{ImportResult, BlockStatus, ClientInfo}; -use primitives::block::{HeaderHash, Number as BlockNumber, Header, Id as BlockId}; use blocks::{self, BlockCollection}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; +use runtime_primitives::generic::BlockId; use message::{self, Message}; use service::Role; -use super::header_hash; // Maximum blocks to request in a single packet. const MAX_BLOCKS_TO_REQUEST: usize = 128; -struct PeerSync { - pub common_hash: HeaderHash, - pub common_number: BlockNumber, - pub best_hash: HeaderHash, - pub best_number: BlockNumber, - pub state: PeerSyncState, +struct PeerSync { + pub common_hash: B::Hash, + pub common_number: ::Number, + pub best_hash: B::Hash, + pub best_number: ::Number, + pub state: PeerSyncState, } #[derive(Copy, Clone, Eq, PartialEq, Debug)] -enum PeerSyncState { - AncestorSearch(BlockNumber), +enum PeerSyncState { + AncestorSearch(::Number), Available, - DownloadingNew(BlockNumber), - DownloadingStale(HeaderHash), + DownloadingNew(::Number), + DownloadingStale(B::Hash), } /// Relay chain sync strategy. -pub struct ChainSync { - genesis_hash: HeaderHash, - peers: HashMap, - blocks: BlockCollection, - best_queued_number: BlockNumber, - best_queued_hash: HeaderHash, +pub struct ChainSync { + genesis_hash: B::Hash, + peers: HashMap>, + blocks: BlockCollection, + best_queued_number: u64, + best_queued_hash: B::Hash, required_block_attributes: Vec, } @@ -65,16 +65,18 @@ pub enum SyncState { /// Syncing status and statistics #[derive(Clone)] -pub struct Status { +pub struct Status { /// Current global sync state. pub state: SyncState, /// Target sync block number. - pub best_seen_block: Option, + pub best_seen_block: Option<::Number>, } -impl ChainSync { +impl ChainSync where + B::Header: HeaderT, +{ /// Create a new instance. - pub fn new(role: Role, info: &ClientInfo) -> ChainSync { + pub fn new(role: Role, info: &ClientInfo) -> Self { let mut required_block_attributes = vec![ message::BlockAttribute::Header, message::BlockAttribute::Justification @@ -93,12 +95,12 @@ impl ChainSync { } } - fn best_seen_block(&self) -> Option { + fn best_seen_block(&self) -> Option { self.peers.values().max_by_key(|p| p.best_number).map(|p| p.best_number) } /// Returns sync status - pub fn status(&self) -> Status { + pub fn status(&self) -> Status { let best_seen = self.best_seen_block(); let state = match &best_seen { &Some(n) if n > self.best_queued_number && n - self.best_queued_number > 5 => SyncState::Downloading, @@ -111,7 +113,7 @@ impl ChainSync { } /// Handle new connected peer. - pub fn new_peer(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { + pub fn new_peer(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { if let Some(info) = protocol.peer_info(peer_id) { match (protocol.chain().block_status(&BlockId::Hash(info.best_hash)), info.best_number) { (Err(e), _) => { @@ -165,7 +167,7 @@ impl ChainSync { } } - pub fn on_block_data(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, _request: message::BlockRequest, response: message::BlockResponse) { + pub fn on_block_data(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, _request: message::BlockRequest, response: message::BlockResponse) { let count = response.blocks.len(); let mut imported: usize = 0; let new_blocks = if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { @@ -235,9 +237,9 @@ impl ChainSync { let block = block.block; match (block.header, block.justification) { (Some(header), Some(justification)) => { - let number = header.number; - let hash = header_hash(&header); - let parent = header.parent_hash; + let number = header.number().clone(); + let hash = header.hash(); + let parent = header.parent_hash().clone(); let is_best = best_seen.as_ref().map_or(false, |n| number >= *n); // check whether the block is known before importing. @@ -305,14 +307,14 @@ impl ChainSync { self.maintain_sync(io, protocol); } - fn maintain_sync(&mut self, io: &mut SyncIo, protocol: &Protocol) { + fn maintain_sync(&mut self, io: &mut SyncIo, protocol: &Protocol) { let peers: Vec = self.peers.keys().map(|p| *p).collect(); for peer in peers { self.download_new(io, protocol, peer); } } - fn block_imported(&mut self, hash: &HeaderHash, number: BlockNumber) { + fn block_imported(&mut self, hash: &B::Hash, number: u64) { if number > self.best_queued_number { self.best_queued_number = number; self.best_queued_hash = *hash; @@ -327,28 +329,29 @@ impl ChainSync { } } - pub fn update_chain_info(&mut self, best_header: &Header ) { - let hash = header_hash(&best_header); - self.block_imported(&hash, best_header.number) + pub fn update_chain_info(&mut self, best_header: &B::Header) { + let hash = best_header.hash(); + self.block_imported(&hash, best_header.number()) } - pub fn on_block_announce(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, hash: HeaderHash, header: &Header) { + pub fn on_block_announce(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, hash: B::Hash, header: &B::Header) { + let number = *header.number(); if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { - if header.number > peer.best_number { - peer.best_number = header.number; + if number > peer.best_number { + peer.best_number = number; peer.best_hash = hash; } - if header.number <= self.best_queued_number && header.number > peer.common_number { - peer.common_number = header.number; + if number <= self.best_queued_number && number > peer.common_number { + peer.common_number = number } } else { return; } if !self.is_known_or_already_downloading(protocol, &hash) { - let stale = header.number <= self.best_queued_number; + let stale = number <= self.best_queued_number; if stale { - if !self.is_known_or_already_downloading(protocol, &header.parent_hash) { + if !self.is_known_or_already_downloading(protocol, header.parent_hash()) { trace!(target: "sync", "Ignoring unknown stale block announce from {}: {} {:?}", peer_id, hash, header); } else { trace!(target: "sync", "Downloading new stale block announced from {}: {} {:?}", peer_id, hash, header); @@ -363,18 +366,18 @@ impl ChainSync { } } - fn is_known_or_already_downloading(&self, protocol: &Protocol, hash: &HeaderHash) -> bool { + fn is_known_or_already_downloading(&self, protocol: &Protocol, hash: &B::Hash) -> bool { self.peers.iter().any(|(_, p)| p.state == PeerSyncState::DownloadingStale(*hash)) || protocol.chain().block_status(&BlockId::Hash(*hash)).ok().map_or(false, |s| s != BlockStatus::Unknown) } - pub fn peer_disconnected(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { + pub fn peer_disconnected(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { self.blocks.clear_peer_download(peer_id); self.peers.remove(&peer_id); self.maintain_sync(io, protocol); } - pub fn restart(&mut self, io: &mut SyncIo, protocol: &Protocol) { + pub fn restart(&mut self, io: &mut SyncIo, protocol: &Protocol) { self.blocks.clear(); let ids: Vec = self.peers.keys().map(|p| *p).collect(); for id in ids { @@ -399,7 +402,7 @@ impl ChainSync { } // Download old block. - fn download_stale(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, hash: &HeaderHash) { + fn download_stale(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, hash: &B::Hash) { if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { match peer.state { PeerSyncState::Available => { @@ -420,7 +423,7 @@ impl ChainSync { } // Issue a request for a peer to download new blocks, if any are available - fn download_new(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { + fn download_new(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { trace!(target: "sync", "Considering new block download from {}, common block is {}, best is {:?}", peer_id, peer.common_number, peer.best_number); match peer.state { @@ -446,7 +449,7 @@ impl ChainSync { } } - fn request_ancestry(io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, block: BlockNumber) { + fn request_ancestry(io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, block: u64) { trace!(target: "sync", "Requesting ancestry block #{} from {}", block, peer_id); let request = message::BlockRequest { id: 0, From ea361d2d7711f0dfbe1843559efee2d4036d437e Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 31 May 2018 22:02:27 +0200 Subject: [PATCH 29/60] serialization for generic types --- substrate/runtime/primitives/src/generic.rs | 139 +++++++++++++------- substrate/runtime/primitives/src/lib.rs | 4 +- substrate/runtime/primitives/src/testing.rs | 25 ++-- substrate/runtime/primitives/src/traits.rs | 16 +-- 4 files changed, 115 insertions(+), 69 deletions(-) diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 384f047fe6794..dfec0be5d7bdd 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -16,7 +16,12 @@ //! Generic implementations of Extrinsic/Header/Block. -#[cfg(feature = "std")] use std::fmt; +#[cfg(feature = "std")] +use std::fmt; + +#[cfg(feature = "std")] +use serde::{Deserialize, Deserializer}; + use rstd::prelude::*; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; @@ -26,12 +31,8 @@ use rstd::ops; /// A vetted and verified extrinsic from the external world. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct Extrinsic where - AccountId: Member + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, -{ +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Extrinsic { /// Who signed it (note this is not a signature). pub signed: AccountId, /// The number of extrinsics have come before from the same signer. @@ -66,13 +67,8 @@ impl Slicable for Extrinsic wher /// A extrinsics right from the external world. Unchecked. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize))] -pub struct UncheckedExtrinsic where - AccountId: Member + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, - Signature: Member, // TODO: should be Option -{ +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct UncheckedExtrinsic { /// The actual extrinsic information. pub extrinsic: Extrinsic, /// The signature; should be an Ed25519 signature applied to the serialised `extrinsic` field. @@ -173,10 +169,9 @@ impl Slicable for UncheckedExtrinsic fmt::Debug for UncheckedExtrinsic where - AccountId: Member + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, - Signature: Member, + AccountId: fmt::Debug, + Index: fmt::Debug, + Call: fmt::Debug, { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "UncheckedExtrinsic({:?})", self.extrinsic) @@ -185,14 +180,9 @@ impl fmt::Debug for UncheckedExtrinsic - (UncheckedExtrinsic) -where - AccountId: Member + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, - Signature: Member; + (UncheckedExtrinsic); impl CheckedExtrinsic where @@ -258,10 +248,11 @@ where } #[derive(Default, PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] -pub struct Digest { +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Digest { pub logs: Vec, } + impl Slicable for Digest where Item: Member + Default + Slicable { @@ -281,17 +272,13 @@ impl traits::Digest for Digest where } } + /// Abstraction over a block header for a substrate chain. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header where - Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, - Hashing: HashingT, - DigestItem: Member + Default, - ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, -{ +pub struct Header { /// The parent hash. pub parent_hash: ::Output, /// The block number. @@ -304,6 +291,43 @@ pub struct Header where pub digest: Digest, } +// Hack to work around the fact that deriving deserialize doesn't work nicely with +// the `hashing` trait without requiring that it itself is deserializable. + +// dummy struct that uses the hash type directly. +#[cfg(feature = "std")] +#[derive(Deserialize)] +struct DeserializeHeader { + parent_hash: H, + number: N, + state_root: H, + extrinsics_root: H, + digest: Digest, +} + +impl From> for Header { + fn from(other: DeserializeHeader) -> Self { + Header { + parent_hash: other.parent_hash, + number: other.number, + state_root: other.state_root, + extrinsics_root: other.extrinsics_root, + digest: other.digest, + } + } +} + +#[cfg(feature = "std")] +impl<'a, Number: 'a, Hashing: 'a + HashingT, DigestItem: 'a> Deserialize<'a> for Header where + Number: Deserialize<'a>, + Hashing::Output: Deserialize<'a>, + DigestItem: Deserialize<'a>, +{ + fn deserialize>(de: D) -> Result { + DeserializeHeader::::deserialize(de).map(Into::into) + } +} + impl Slicable for Header where Number: Member + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, Hashing: HashingT, @@ -383,7 +407,6 @@ pub enum BlockId where { impl Copy for BlockId {} - #[cfg(feature = "std")] impl fmt::Display for BlockId { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { @@ -396,25 +419,47 @@ impl fmt::Display for BlockId { #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Block where - Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, - Hashing: HashingT, - DigestItem: Member + Default, - ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, - AccountId: Member + Default + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, - Signature: Member + Default + traits::Verify, - Header: traits::Header, - UncheckedExtrinsic: Slicable, - Extrinsic: Slicable, -{ +pub struct Block { /// The block header. pub header: Header, /// The accompanying extrinsics. pub extrinsics: Vec>, } +// Hack to work around the fact that deriving deserialize doesn't work nicely with +// the `hashing` trait without requiring that it itself is deserializable. +#[cfg(feature = "std")] +impl<'a, Number, Hashing: HashingT, DigestItem, AccountId, Index, Call, Signature> Deserialize<'a> for Block where + Number: 'a + Deserialize<'a>, + Hashing::Output: 'a + Deserialize<'a>, + DigestItem: 'a + Deserialize<'a>, + AccountId: 'a + Deserialize<'a>, + Index: 'a + Deserialize<'a>, + Call: 'a + Deserialize<'a>, + Signature: 'a + Deserialize<'a>, +{ + fn deserialize>(de: D) -> Result { + // dummy struct that uses the hash type directly. + #[derive(Deserialize)] + struct Inner { + header: DeserializeHeader, + extrinsics: Vec, + } + + let inner = Inner::< + Number, + Hashing::Output, + DigestItem, + UncheckedExtrinsic, + >::deserialize(de)?; + + Ok(Block { + header: inner.header.into(), + extrinsics: inner.extrinsics, + }) + } +} + impl Slicable for Block where diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index fc792ac3ce87f..07aa7c26b0e15 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -58,7 +58,7 @@ pub trait BuildExternalities { /// Ed25519 signature verify. #[derive(Eq, PartialEq, Clone, Default)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub struct Ed25519Signature(H512); impl Verify for Ed25519Signature { @@ -81,7 +81,7 @@ impl From for Ed25519Signature { /// Potentially "unsigned" signature verification. #[derive(Eq, PartialEq, Clone, Default)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub struct MaybeUnsigned(T); impl MaybeUnsigned where diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index bb1c85bf61918..a4e990b890eb4 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -16,14 +16,14 @@ //! Testing utilities. -use serde; +use serde::{Serialize, de::DeserializeOwned}; use std::fmt::Debug; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; use substrate_primitives::H256; use traits::{self, Checkable, Applyable, BlakeTwo256}; -#[derive(Default, PartialEq, Eq, Clone, Serialize, Debug)] +#[derive(Default, PartialEq, Eq, Clone, Serialize, Deserialize, Debug)] pub struct Digest { pub logs: Vec, } @@ -42,7 +42,7 @@ impl traits::Digest for Digest { } } -#[derive(PartialEq, Eq, Clone, Serialize, Debug)] +#[derive(PartialEq, Eq, Clone, Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] #[serde(deny_unknown_fields)] pub struct Header { @@ -107,12 +107,12 @@ impl traits::Header for Header { } } -#[derive(PartialEq, Eq, Clone, Serialize, Debug)] -pub struct Block { +#[derive(PartialEq, Eq, Clone, Serialize, Deserialize, Debug)] +pub struct Block { pub header: Header, pub extrinsics: Vec, } -impl Slicable for Block { +impl Slicable for Block { fn decode(input: &mut I) -> Option { Some(Block { header: Slicable::decode(input)?, @@ -126,7 +126,7 @@ impl v } } -impl traits::Block for Block { +impl traits::Block for Block { type Extrinsic = Xt; type Header = Header; type Hash =
    ::Hash; @@ -145,9 +145,10 @@ impl } } -#[derive(PartialEq, Eq, Clone, Serialize, Debug)] -pub struct TestXt(pub (u64, u64, Call)); -impl Slicable for TestXt { +#[derive(PartialEq, Eq, Clone, Serialize, Deserialize, Debug)] +pub struct TestXt(pub (u64, u64, Call)); + +impl Slicable for TestXt { fn decode(input: &mut I) -> Option { Some(TestXt(Slicable::decode(input)?)) } @@ -155,11 +156,11 @@ impl Checkable for TestXt { +impl Checkable for TestXt { type Checked = Self; fn check(self) -> Result { Ok(self) } } -impl + Slicable + Sized + Send + Sync + serde::Serialize + Clone + Eq + Debug> Applyable for TestXt { +impl + Slicable + Sized + Send + Sync + Serialize + DeserializeOwned + Clone + Eq + Debug> Applyable for TestXt { type AccountId = u64; type Index = u64; fn sender(&self) -> &u64 { &(self.0).0 } diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 0a44f66337098..99b8dd404b8b3 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -20,7 +20,7 @@ use rstd::prelude::*; use rstd; use runtime_io; #[cfg(feature = "std")] use std::fmt::{Debug, Display}; -#[cfg(feature = "std")] use serde::Serialize; +#[cfg(feature = "std")] use serde::{Serialize, de::DeserializeOwned}; use substrate_primitives; use codec::Slicable; pub use integer_sqrt::IntegerSquareRoot; @@ -170,10 +170,10 @@ impl Executable for (A, B) { } /// Abstraction around hashing -pub trait Hashing: MaybeSerializeDebug + Clone + Eq + PartialEq { // Stupid bug in the Rust compiler believes derived +pub trait Hashing: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stupid bug in the Rust compiler believes derived // traits must be fulfilled by all type parameters. /// The hash type produced. - type Output; + type Output: Member; /// Produce the hash of some byte-slice. fn hash(s: &[u8]) -> Self::Output; @@ -205,7 +205,7 @@ pub trait Hashing: MaybeSerializeDebug + Clone + Eq + PartialEq { // Stupid bug /// Blake2-256 Hashing implementation. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub struct BlakeTwo256; impl Hashing for BlakeTwo256 { @@ -259,9 +259,9 @@ impl CheckEqual for substrate_primitives::H256 { } #[cfg(feature = "std")] -pub trait MaybeSerializeDebug: Serialize + Debug {} +pub trait MaybeSerializeDebug: Serialize + DeserializeOwned + Debug {} #[cfg(feature = "std")] -impl MaybeSerializeDebug for T {} +impl MaybeSerializeDebug for T {} #[cfg(not(feature = "std"))] pub trait MaybeSerializeDebug {} @@ -278,8 +278,8 @@ pub trait MaybeDisplay {} #[cfg(not(feature = "std"))] impl MaybeDisplay for T {} -pub trait Member: Send + Sync + Sized + MaybeSerializeDebug + Eq + PartialEq + Clone {} -impl Member for T {} +pub trait Member: Send + Sync + Sized + MaybeSerializeDebug + Eq + PartialEq + Clone + 'static {} +impl Member for T {} /// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are /// each `Slicable`. From e35a8d0efaaf20bf2553b06abe34daf3a17a5aa4 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 31 May 2018 22:04:03 +0200 Subject: [PATCH 30/60] fix comment --- substrate/runtime/primitives/src/generic.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index dfec0be5d7bdd..47b53e3c51486 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -292,8 +292,7 @@ pub struct Header { } // Hack to work around the fact that deriving deserialize doesn't work nicely with -// the `hashing` trait without requiring that it itself is deserializable. - +// the `hashing` trait used as a parameter. // dummy struct that uses the hash type directly. #[cfg(feature = "std")] #[derive(Deserialize)] @@ -427,7 +426,7 @@ pub struct Block Deserialize<'a> for Block where Number: 'a + Deserialize<'a>, From c8f064ed419ea3c50b8a116ca9ecab880beae1eb Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 31 May 2018 22:47:25 +0200 Subject: [PATCH 31/60] remove some unnecessary trait bounds --- substrate/bft/src/lib.rs | 10 ++-- substrate/network/src/consensus.rs | 10 ++-- substrate/network/src/protocol.rs | 2 +- substrate/network/src/service.rs | 18 +++--- substrate/network/src/sync.rs | 2 +- substrate/runtime/primitives/src/bft.rs | 75 +++++++++++++------------ 6 files changed, 61 insertions(+), 56 deletions(-) diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index 72ab254dd488c..313a0e731cb04 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -463,7 +463,7 @@ fn check_justification_signed_message(authorities: &[AuthorityId], message: & pub fn check_justification(authorities: &[AuthorityId], parent: B::Hash, just: UncheckedJustification) -> Result, UncheckedJustification> { - let message = Slicable::encode(&PrimitiveMessage:: { + let message = Slicable::encode(&PrimitiveMessage:: { parent, action: PrimitiveAction::Commit(just.round_number as u32, just.digest.clone()), }); @@ -478,7 +478,7 @@ pub fn check_justification(authorities: &[AuthorityId], parent: B::Has pub fn check_prepare_justification(authorities: &[AuthorityId], parent: B::Hash, just: UncheckedJustification) -> Result, UncheckedJustification> { - let message = Slicable::encode(&PrimitiveMessage:: { + let message = Slicable::encode(&PrimitiveMessage:: { parent, action: PrimitiveAction::Prepare(just.round_number as u32, just.digest.clone()), }); @@ -524,7 +524,7 @@ pub fn check_vote( check_action::(action, parent_hash, &vote.signature) } -fn check_action(action: PrimitiveAction, parent_hash: &B::Hash, sig: &LocalizedSignature) -> Result<(), Error> { +fn check_action(action: PrimitiveAction, parent_hash: &B::Hash, sig: &LocalizedSignature) -> Result<(), Error> { let primitive = PrimitiveMessage { parent: parent_hash.clone(), action, @@ -542,8 +542,8 @@ fn check_action(action: PrimitiveAction, parent_hash: &B::Hash, sig pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: B::Hash) -> LocalizedMessage { let signer = key.public(); - let sign_action = |action: PrimitiveAction| { - let primitive: PrimitiveMessage = PrimitiveMessage { + let sign_action = |action: PrimitiveAction| { + let primitive = PrimitiveMessage { parent: parent_hash.clone(), action, }; diff --git a/substrate/network/src/consensus.rs b/substrate/network/src/consensus.rs index 318c68a335e61..64e43399defc6 100644 --- a/substrate/network/src/consensus.rs +++ b/substrate/network/src/consensus.rs @@ -96,14 +96,14 @@ impl Consensus { return; } - match (protocol.chain().info(), protocol.chain().header(&BlockId::Hash(message.parent_hash))) { + match (protocol.chain().info(), protocol.chain().header(&BlockId::Hash(message.parent_hash().clone()))) { (_, Err(e)) | (Err(e), _) => { debug!(target:"sync", "Error reading blockchain: {:?}", e); return; }, (Ok(info), Ok(Some(header))) => { if header.number < info.chain.best_number { - trace!(target:"sync", "Ignored ancient BFT message from {}, hash={}", peer_id, message.parent_hash); + trace!(target:"sync", "Ignored ancient BFT message from {}, hash={}", peer_id, message.parent_hash()); return; } }, @@ -114,7 +114,7 @@ impl Consensus { peer.known_messages.insert(hash); // TODO: validate signature? if let Some((sink, parent_hash)) = self.bft_message_sink.take() { - if message.parent_hash == parent_hash { + if message.parent_hash() == &parent_hash { if let Err(e) = sink.unbounded_send(message.clone()) { trace!(target:"sync", "Error broadcasting BFT message notification: {:?}", e); } else { @@ -169,7 +169,7 @@ impl Consensus { let last_block_hash = &mut self.last_block_hash; let before = self.messages.len(); let (best_hash, best_header) = best_hash_and_header.map(|(h, header)| (Some(h), Some(header))).unwrap_or((None, None)); - if best_header.as_ref().map_or(false, |header| header.parent_hash != *last_block_hash) { + if best_header.as_ref().map_or(false, |header| header.parent_hash() != last_block_hash) { trace!(target:"sync", "Clearing conensus message cache"); self.messages.clear(); hashes.clear(); @@ -183,7 +183,7 @@ impl Consensus { timestamp < now + expiration || best_header.map_or(true, |header| { if match *message { - Message::BftMessage(ref msg) => msg.parent_hash != header.parent_hash, + Message::BftMessage(ref msg) => &msg.parent_hash != header.parent_hash(), _ => true, } { hashes.remove(hash); diff --git a/substrate/network/src/protocol.rs b/substrate/network/src/protocol.rs index 3f4b9965f3355..17f703a116209 100644 --- a/substrate/network/src/protocol.rs +++ b/substrate/network/src/protocol.rs @@ -20,7 +20,7 @@ use std::sync::Arc; use std::time; use parking_lot::{RwLock, Mutex}; use serde_json; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, HashingFor}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing, HashingFor}; use runtime_primitives::generic::BlockId; use network::{PeerId, NodeId}; diff --git a/substrate/network/src/service.rs b/substrate/network/src/service.rs index a1669ea8608bb..31555ac636a7a 100644 --- a/substrate/network/src/service.rs +++ b/substrate/network/src/service.rs @@ -139,14 +139,14 @@ pub struct Params { } /// Polkadot network service. Handles network IO and manages connectivity. -pub struct Service { +pub struct Service where B::Header: HeaderT { /// Network service network: NetworkService, /// Devp2p protocol handler handler: Arc>, } -impl Service { +impl Service where B::Header: HeaderT { /// Creates and register protocol with the network service pub fn new(params: Params) -> Result>, Error> { let service = NetworkService::new(params.network_config.clone(), None)?; @@ -191,13 +191,13 @@ impl Service { } } -impl Drop for Service { +impl Drop for Service where B::Header: HeaderT { fn drop(&mut self) { self.stop(); } } -impl ExecuteInContext for Service { +impl ExecuteInContext for Service where B::Header: HeaderT { fn execute_in_context)>(&self, closure: F) { self.network.with_context(DOT_PROTOCOL_ID, |context| { closure(&mut NetSyncIo::new(context), &self.handler.protocol) @@ -205,7 +205,7 @@ impl ExecuteInContext for Service { } } -impl SyncProvider for Service { +impl SyncProvider for Service where B::Header: HeaderT { /// Get sync status fn status(&self) -> ProtocolStatus { self.handler.protocol.status() @@ -244,7 +244,7 @@ impl SyncProvider for Service { } /// ConsensusService -impl ConsensusService for Service { +impl ConsensusService for Service where B::Header: HeaderT { fn connect_to_authorities(&self, _addresses: &[String]) { //TODO: implement me } @@ -260,7 +260,7 @@ impl ConsensusService for Service { } } -impl NetworkProtocolHandler for ProtocolHandler { +impl NetworkProtocolHandler for ProtocolHandler where B::Header: HeaderT { fn initialize(&self, io: &NetworkContext, _host_info: &HostInfo) { io.register_timer(TICK_TOKEN, TICK_TIMEOUT) .expect("Error registering sync timer"); @@ -291,7 +291,7 @@ impl NetworkProtocolHandler for ProtocolHandler { } /// Trait for managing network -pub trait ManageNetwork : Send + Sync { +pub trait ManageNetwork: Send + Sync { /// Set to allow unreserved peers to connect fn accept_unreserved_peers(&self); /// Set to deny unreserved peers to connect @@ -307,7 +307,7 @@ pub trait ManageNetwork : Send + Sync { } -impl ManageNetwork for Service { +impl ManageNetwork for Service where B::Header: HeaderT { fn accept_unreserved_peers(&self) { self.network.set_non_reserved_mode(NonReservedPeerMode::Accept); } diff --git a/substrate/network/src/sync.rs b/substrate/network/src/sync.rs index b8c0c06f7cd01..235c7cca98036 100644 --- a/substrate/network/src/sync.rs +++ b/substrate/network/src/sync.rs @@ -331,7 +331,7 @@ impl ChainSync where pub fn update_chain_info(&mut self, best_header: &B::Header) { let hash = best_header.hash(); - self.block_imported(&hash, best_header.number()) + self.block_imported(&hash, best_header.number().clone()) } pub fn on_block_announce(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, hash: B::Hash, header: &B::Header) { diff --git a/substrate/runtime/primitives/src/bft.rs b/substrate/runtime/primitives/src/bft.rs index a0fa240d3ba33..bd380baf58f6d 100644 --- a/substrate/runtime/primitives/src/bft.rs +++ b/substrate/runtime/primitives/src/bft.rs @@ -17,7 +17,6 @@ //! Message formats for the BFT consensus layer. use rstd::prelude::*; -use traits::{Block as BlockT, Header as HeaderT}; use codec::{Slicable, Input}; use substrate_primitives::{AuthorityId, Signature}; @@ -32,24 +31,27 @@ enum ActionKind { AdvanceRound = 5, } +/// Type alias for extracting message type from block. +pub type ActionFor = Action::Hash>; + /// Actions which can be taken during the BFT process. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum Action { +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub enum Action { /// Proposal of a block candidate. Propose(u32, Block), /// Proposal header of a block candidate. Accompanies any proposal, /// but is used for misbehavior reporting since blocks themselves are big. - ProposeHeader(u32, Block::Hash), + ProposeHeader(u32, H), /// Preparation to commit for a candidate. - Prepare(u32, Block::Hash), + Prepare(u32, H), /// Vote to commit to a candidate. - Commit(u32, Block::Hash), + Commit(u32, H), /// Vote to advance round after inactive primary. AdvanceRound(u32), } -impl Slicable for Action { +impl Slicable for Action { fn encode(&self) -> Vec { let mut v = Vec::new(); match *self { @@ -108,17 +110,20 @@ impl Slicable for Action { } } +/// Type alias for extracting message type from block. +pub type MessageFor = Message::Hash>; + /// Messages exchanged between participants in the BFT consensus. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct Message { +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Message { /// The parent header hash this action is relative to. - pub parent: Block::Hash, + pub parent: Hash, /// The action being broadcasted. - pub action: Action, + pub action: Action, } -impl Slicable for Message { +impl Slicable for Message { fn encode(&self) -> Vec { let mut v = self.parent.encode(); self.action.using_encoded(|s| v.extend(s)); @@ -135,9 +140,8 @@ impl Slicable for Message { /// Justification of a block. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] -pub struct Justification -{ +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Justification { /// The round consensus was reached in. pub round_number: u32, /// The hash of the header justified. @@ -187,29 +191,29 @@ impl MisbehaviorCode { /// Misbehavior kinds. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] -pub enum MisbehaviorKind { +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub enum MisbehaviorKind { /// BFT: double prepare. - BftDoublePrepare(u32, (
    ::Hash, Signature), (
    ::Hash, Signature)), + BftDoublePrepare(u32, (Hash, Signature), (Hash, Signature)), /// BFT: double commit. - BftDoubleCommit(u32, (
    ::Hash, Signature), (
    ::Hash, Signature)), + BftDoubleCommit(u32, (Hash, Signature), (Hash, Signature)), } /// A report of misbehavior by an authority. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] -pub struct MisbehaviorReport { +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct MisbehaviorReport { /// The parent hash of the block where the misbehavior occurred. - pub parent_hash:
    ::Hash, + pub parent_hash: Hash, /// The parent number of the block where the misbehavior occurred. - pub parent_number:
    ::Hash, + pub parent_number: Hash, /// The authority who misbehavior. pub target: AuthorityId, /// The misbehavior kind. - pub misbehavior: MisbehaviorKind
    , + pub misbehavior: MisbehaviorKind, } -impl Slicable for MisbehaviorReport
    { +impl Slicable for MisbehaviorReport { fn encode(&self) -> Vec { let mut v = Vec::new(); self.parent_hash.using_encoded(|s| v.extend(s)); @@ -239,23 +243,23 @@ impl Slicable for MisbehaviorReport
    { } fn decode(input: &mut I) -> Option { - let parent_hash =
    ::Hash::decode(input)?; - let parent_number =
    ::Hash::decode(input)?; + let parent_hash = Hash::decode(input)?; + let parent_number = Hash::decode(input)?; let target = AuthorityId::decode(input)?; let misbehavior = match i8::decode(input).and_then(MisbehaviorCode::from_i8)? { MisbehaviorCode::BftDoublePrepare => { MisbehaviorKind::BftDoublePrepare( u32::decode(input)?, - (
    ::Hash::decode(input)?, Signature::decode(input)?), - (
    ::Hash::decode(input)?, Signature::decode(input)?), + (Hash::decode(input)?, Signature::decode(input)?), + (Hash::decode(input)?, Signature::decode(input)?), ) } MisbehaviorCode::BftDoubleCommit => { MisbehaviorKind::BftDoubleCommit( u32::decode(input)?, - (
    ::Hash::decode(input)?, Signature::decode(input)?), - (
    ::Hash::decode(input)?, Signature::decode(input)?), + (Hash::decode(input)?, Signature::decode(input)?), + (Hash::decode(input)?, Signature::decode(input)?), ) } }; @@ -272,10 +276,11 @@ impl Slicable for MisbehaviorReport
    { #[cfg(test)] mod test { use super::*; + use substrate_primitives::H256; #[test] fn misbehavior_report_roundtrip() { - let report = MisbehaviorReport:: { + let report = MisbehaviorReport:: { parent_hash: [0; 32].into(), parent_number: 999, target: [1; 32].into(), @@ -287,9 +292,9 @@ mod test { }; let encoded = report.encode(); - assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); + assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); - let report = MisbehaviorReport:: { + let report = MisbehaviorReport:: { parent_hash: [0; 32].into(), parent_number: 999, target: [1; 32].into(), @@ -301,6 +306,6 @@ mod test { }; let encoded = report.encode(); - assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); + assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); } } From 34b4e0e554bb86cf0e38d87f67abe88966c74a49 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Thu, 31 May 2018 23:25:15 +0200 Subject: [PATCH 32/60] network compiles --- substrate/network/src/blocks.rs | 2 +- substrate/network/src/chain.rs | 16 +- substrate/network/src/consensus.rs | 20 +- substrate/network/src/lib.rs | 3 +- substrate/network/src/message.rs | 431 +++++++++++++++++------------ substrate/network/src/on_demand.rs | 29 +- substrate/network/src/protocol.rs | 41 +-- substrate/network/src/service.rs | 8 +- substrate/network/src/sync.rs | 14 +- 9 files changed, 322 insertions(+), 242 deletions(-) diff --git a/substrate/network/src/blocks.rs b/substrate/network/src/blocks.rs index 8eda998f5d589..6ac36bb5fd271 100644 --- a/substrate/network/src/blocks.rs +++ b/substrate/network/src/blocks.rs @@ -102,7 +102,7 @@ impl BlockCollection where B::Header: HeaderT { let count = count as u64; let (mut range, downloading) = { let mut downloading_iter = self.blocks.iter().peekable(); - let mut prev: Option<(&u64, &BlockRangeState)> = None; + let mut prev: Option<(&u64, &BlockRangeState)> = None; loop { let next = downloading_iter.next(); break match &(prev, next) { diff --git a/substrate/network/src/chain.rs b/substrate/network/src/chain.rs index 766ce61566e72..a2eff9b54d8a5 100644 --- a/substrate/network/src/chain.rs +++ b/substrate/network/src/chain.rs @@ -59,34 +59,34 @@ impl Client for PolkadotClient where // TODO: defer justification check. let justified_header = self.check_justification(header, justification.into())?; let origin = if is_best { BlockOrigin::NetworkBroadcast } else { BlockOrigin::NetworkInitialSync }; - (self as &PolkadotClient).import_block(origin, justified_header, body) + (self as &PolkadotClient).import_block(origin, justified_header, body) } fn info(&self) -> Result, Error> { - (self as &PolkadotClient).info() + (self as &PolkadotClient).info() } fn block_status(&self, id: &BlockId) -> Result { - (self as &PolkadotClient).block_status(id) + (self as &PolkadotClient).block_status(id) } fn block_hash(&self, block_number: ::Number) -> Result, Error> { - (self as &PolkadotClient).block_hash(block_number) + (self as &PolkadotClient).block_hash(block_number) } fn header(&self, id: &BlockId) -> Result, Error> { - (self as &PolkadotClient).header(id) + (self as &PolkadotClient).header(id) } fn body(&self, id: &BlockId) -> Result>, Error> { - (self as &PolkadotClient).body(id) + (self as &PolkadotClient).body(id) } fn justification(&self, id: &BlockId) -> Result>, Error> { - (self as &PolkadotClient).justification(id) + (self as &PolkadotClient).justification(id) } fn execution_proof(&self, block: &Block::Hash, method: &str, data: &[u8]) -> Result<(Vec, Vec>), Error> { - (self as &PolkadotClient).execution_proof(&BlockId::Hash(block.clone()), method, data) + (self as &PolkadotClient).execution_proof(&BlockId::Hash(block.clone()), method, data) } } diff --git a/substrate/network/src/consensus.rs b/substrate/network/src/consensus.rs index 64e43399defc6..34fa2b1c8d003 100644 --- a/substrate/network/src/consensus.rs +++ b/substrate/network/src/consensus.rs @@ -24,7 +24,7 @@ use protocol::Protocol; use network::PeerId; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; use runtime_primitives::generic::BlockId; -use message::{self, Message}; +use message::{self, generic::Message as GenericMessage}; // TODO: Add additional spam/DoS attack protection. const MESSAGE_LIFETIME_SECONDS: u64 = 600; @@ -42,7 +42,7 @@ pub struct Consensus { last_block_hash: B::Hash, } -impl Consensus { +impl Consensus where B::Header: HeaderT { /// Create a new instance. pub fn new(best_hash: B::Hash) -> Consensus { Consensus { @@ -96,14 +96,14 @@ impl Consensus { return; } - match (protocol.chain().info(), protocol.chain().header(&BlockId::Hash(message.parent_hash().clone()))) { + match (protocol.chain().info(), protocol.chain().header(&BlockId::Hash(message.parent_hash))) { (_, Err(e)) | (Err(e), _) => { debug!(target:"sync", "Error reading blockchain: {:?}", e); return; }, (Ok(info), Ok(Some(header))) => { - if header.number < info.chain.best_number { - trace!(target:"sync", "Ignored ancient BFT message from {}, hash={}", peer_id, message.parent_hash()); + if header.number() < &info.chain.best_number { + trace!(target:"sync", "Ignored ancient BFT message from {}, hash={}", peer_id, message.parent_hash); return; } }, @@ -114,7 +114,7 @@ impl Consensus { peer.known_messages.insert(hash); // TODO: validate signature? if let Some((sink, parent_hash)) = self.bft_message_sink.take() { - if message.parent_hash() == &parent_hash { + if message.parent_hash == parent_hash { if let Err(e) = sink.unbounded_send(message.clone()) { trace!(target:"sync", "Error broadcasting BFT message notification: {:?}", e); } else { @@ -127,7 +127,7 @@ impl Consensus { return; } - let message = Message::BftMessage(message); + let message = GenericMessage::BftMessage(message); self.register_message(hash.clone(), message.clone()); // Propagate to other peers. self.propagate(io, protocol, message, hash); @@ -138,7 +138,7 @@ impl Consensus { for &(_, _, ref message) in self.messages.iter() { let bft_message = match *message { - Message::BftMessage(ref msg) => msg, + GenericMessage::BftMessage(ref msg) => msg, _ => continue, }; @@ -154,7 +154,7 @@ impl Consensus { pub fn send_bft_message(&mut self, io: &mut SyncIo, protocol: &Protocol, message: message::LocalizedBftMessage) { // Broadcast message to all validators. trace!(target:"sync", "Broadcasting BFT message {:?}", message); - let message = Message::BftMessage(message); + let message = GenericMessage::BftMessage(message); let hash = Protocol::hash_message(&message); self.register_message(hash.clone(), message.clone()); self.propagate(io, protocol, message, hash); @@ -183,7 +183,7 @@ impl Consensus { timestamp < now + expiration || best_header.map_or(true, |header| { if match *message { - Message::BftMessage(ref msg) => &msg.parent_hash != header.parent_hash(), + GenericMessage::BftMessage(ref msg) => &msg.parent_hash != header.parent_hash(), _ => true, } { hashes.remove(hash); diff --git a/substrate/network/src/lib.rs b/substrate/network/src/lib.rs index 8a3d14a788c3b..fb233709cf7f9 100644 --- a/substrate/network/src/lib.rs +++ b/substrate/network/src/lib.rs @@ -64,8 +64,7 @@ pub use service::{Service, FetchFuture, ConsensusService, BftMessageStream, TransactionPool, Params, ManageNetwork, SyncProvider}; pub use protocol::{ProtocolStatus}; pub use sync::{Status as SyncStatus, SyncState}; -pub use network::{NonReservedPeerMode, NetworkConfiguration}; -pub use network_devp2p::{ConnectionFilter, ConnectionDirection}; +pub use network::{NonReservedPeerMode, NetworkConfiguration, ConnectionFilter, ConnectionDirection}; pub use message::{BftMessage, LocalizedBftMessage, ConsensusVote, SignedConsensusVote, SignedConsensusMessage, SignedConsensusProposal}; pub use error::Error; pub use config::{Role, ProtocolConfig}; diff --git a/substrate/network/src/message.rs b/substrate/network/src/message.rs index 0fec7d1d9e8e3..5b75c052d9dd3 100644 --- a/substrate/network/src/message.rs +++ b/substrate/network/src/message.rs @@ -16,14 +16,74 @@ //! Network packet message types. These get serialized and put into the lower level protocol payload. -use primitives::AuthorityId; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; -use runtime_primitives::bft::Justification; use service::Role as RoleFlags; -use ed25519; + +pub use self::generic::{BlockAnnounce, RemoteCallRequest, ConsensusVote, SignedConsensusVote, FromBlock}; pub type RequestId = u64; -type Bytes = Vec; + +/// Type alias for using the message type using block type parameters. +pub type Message = generic::Message< + B, + ::Header, + ::Hash, + <::Header as HeaderT>::Number, + ::Extrinsic, +>; + +/// Type alias for using the status type using block type parameters. +pub type Status = generic::Status< + ::Hash, + <::Header as HeaderT>::Number, +>; + +/// Type alias for using the block request type using block type parameters. +pub type BlockRequest = generic::BlockRequest< + ::Hash, + <::Header as HeaderT>::Number, +>; + +/// Type alias for using the localized bft message type using block type parameters. +pub type LocalizedBftMessage = generic::LocalizedBftMessage< + B, + ::Hash, +>; + +/// Type alias for using the BlockData type using block type parameters. +pub type BlockData = generic::BlockData< + ::Header, + ::Hash, + ::Extrinsic, +>; + +/// Type alias for using the BlockResponse type using block type parameters. +pub type BlockResponse = generic::BlockResponse< + ::Header, + ::Hash, + ::Extrinsic, +>; + +/// Type alias for using the BftMessage type using block type parameters. +pub type BftMessage = generic::BftMessage< + B, + ::Hash, +>; + +/// Type alias for using the SignedConsensusProposal type using block type parameters. +pub type SignedConsensusProposal = generic::SignedConsensusProposal< + B, + ::Hash, +>; + +/// Type alias for using the SignedConsensusProposal type using block type parameters. +pub type SignedConsensusMessage = generic::SignedConsensusProposal< + B, + ::Hash, +>; + +/// A set of transactions. +pub type Transactions = Vec; /// Configured node role. #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] @@ -73,8 +133,8 @@ impl From for Vec where { } } -#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Copy, Clone)] /// Bits of block data and associated artefacts to request. +#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Copy, Clone)] pub enum BlockAttribute { /// Include block header. Header, @@ -88,33 +148,6 @@ pub enum BlockAttribute { Justification, } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Block data sent in the response. -pub struct BlockData { - /// Block header hash. - pub hash: B::Hash, - /// Block header if requested. - pub header: Option, - /// Block body if requested. - pub body: Option>, - /// Block receipt if requested. - pub receipt: Option, - /// Block message queue if requested. - pub message_queue: Option, - /// Justification if requested. - pub justification: Option>, -} - -#[serde(untagged)] -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Identifies starting point of a block sequence. -pub enum FromBlock { - /// Start with given hash. - Hash(B::Hash), - /// Start with given block number. - Number(::Number), -} - #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] /// Block enumeration direction. pub enum Direction { @@ -124,169 +157,201 @@ pub enum Direction { Descending, } -/// A set of transactions. -pub type Transactions = Vec<::Extrinsic>; - -/// Communication that can occur between participants in consensus. #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub enum BftMessage { - /// A consensus message (proposal or vote) - Consensus(SignedConsensusMessage), - /// Auxiliary communication (just proof-of-lock for now). - Auxiliary(Justification), +/// Remote call response. +pub struct RemoteCallResponse { + /// Id of a request this response was made for. + pub id: RequestId, + /// Method return value. + pub value: Vec, + /// Execution proof. + pub proof: Vec>, } -/// BFT Consensus message with parent header hash attached to it. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct LocalizedBftMessage { - /// Consensus message. - pub message: BftMessage, - /// Parent header hash. - pub parent_hash: B::Hash, -} +/// Generic types. +pub mod generic { + use primitives::AuthorityId; + use runtime_primitives::bft::Justification; + use ed25519; -/// A localized proposal message. Contains two signed pieces of data. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct SignedConsensusProposal { - /// The round number. - pub round_number: u32, - /// The proposal sent. - pub proposal: B, - /// The digest of the proposal. - pub digest: B::Hash, - /// The sender of the proposal - pub sender: AuthorityId, - /// The signature on the message (propose, round number, digest) - pub digest_signature: ed25519::Signature, - /// The signature on the message (propose, round number, proposal) - pub full_signature: ed25519::Signature, -} + use super::{Role, BlockAttribute, RemoteCallResponse, RequestId, Transactions, Direction}; + /// Block data sent in the response. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct BlockData { + /// Block header hash. + pub hash: Hash, + /// Block header if requested. + pub header: Option
    , + /// Block body if requested. + pub body: Option>, + /// Block receipt if requested. + pub receipt: Option>, + /// Block message queue if requested. + pub message_queue: Option>, + /// Justification if requested. + pub justification: Option>, + } -/// A localized vote message, including the sender. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct SignedConsensusVote { - /// The message sent. - pub vote: ConsensusVote, - /// The sender of the message - pub sender: AuthorityId, - /// The signature of the message. - pub signature: ed25519::Signature, -} + /// Identifies starting point of a block sequence. + #[serde(untagged)] + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub enum FromBlock { + /// Start with given hash. + Hash(Hash), + /// Start with given block number. + Number(Number), + } -/// Votes during a consensus round. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub enum ConsensusVote { - /// Prepare to vote for proposal with digest D. - Prepare(u32, H), - /// Commit to proposal with digest D.. - Commit(u32, H), - /// Propose advancement to a new round. - AdvanceRound(u32), -} + /// Communication that can occur between participants in consensus. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub enum BftMessage { + /// A consensus message (proposal or vote) + Consensus(SignedConsensusMessage), + /// Auxiliary communication (just proof-of-lock for now). + Auxiliary(Justification), + } -/// A localized message. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub enum SignedConsensusMessage { - /// A proposal. - Propose(SignedConsensusProposal), - /// A vote. - Vote(SignedConsensusVote), -} + /// BFT Consensus message with parent header hash attached to it. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct LocalizedBftMessage { + /// Consensus message. + pub message: BftMessage, + /// Parent header hash. + pub parent_hash: Hash, + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// A network message. -pub enum Message { - /// Status packet. - Status(Status), - /// Block request. - BlockRequest(BlockRequest), - /// Block response. - BlockResponse(BlockResponse), - /// Block announce. - BlockAnnounce(BlockAnnounce), - /// Transactions. - Transactions(Transactions), - /// BFT Consensus statement. - BftMessage(LocalizedBftMessage), - /// Remote method call request. - RemoteCallRequest(RemoteCallRequest), - /// Remote method call response. - RemoteCallResponse(RemoteCallResponse), -} + /// A localized proposal message. Contains two signed pieces of data. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct SignedConsensusProposal { + /// The round number. + pub round_number: u32, + /// The proposal sent. + pub proposal: Block, + /// The digest of the proposal. + pub digest: Hash, + /// The sender of the proposal + pub sender: AuthorityId, + /// The signature on the message (propose, round number, digest) + pub digest_signature: ed25519::Signature, + /// The signature on the message (propose, round number, proposal) + pub full_signature: ed25519::Signature, + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct Status { - /// Protocol version. - pub version: u32, - /// Supported roles. - pub roles: Vec, - /// Best block number. - pub best_number: ::Number, - /// Best block hash. - pub best_hash: B::Hash, - /// Genesis block hash. - pub genesis_hash: B::Hash, - /// Signatue of `best_hash` made with validator address. Required for the validator role. - pub validator_signature: Option, - /// Validator address. Required for the validator role. - pub validator_id: Option, - /// Parachain id. Required for the collator role. - pub parachain_id: Option, -} + /// A localized vote message, including the sender. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct SignedConsensusVote { + /// The message sent. + pub vote: ConsensusVote, + /// The sender of the message + pub sender: AuthorityId, + /// The signature of the message. + pub signature: ed25519::Signature, + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Request block data from a peer. -pub struct BlockRequest { - /// Unique request id. - pub id: RequestId, - /// Bits of block data to request. - pub fields: Vec, - /// Start from this block. - pub from: FromBlock, - /// End at this block. An implementation defined maximum is used when unspecified. - pub to: Option, - /// Sequence direction. - pub direction: Direction, - /// Maximum number of blocks to return. An implementation defined maximum is used when unspecified. - pub max: Option, -} + /// Votes during a consensus round. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub enum ConsensusVote { + /// Prepare to vote for proposal with digest D. + Prepare(u32, H), + /// Commit to proposal with digest D.. + Commit(u32, H), + /// Propose advancement to a new round. + AdvanceRound(u32), + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Response to `BlockRequest` -pub struct BlockResponse { - /// Id of a request this response was made for. - pub id: RequestId, - /// Block data for the requested sequence. - pub blocks: Vec>, -} + /// A localized message. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub enum SignedConsensusMessage { + /// A proposal. + Propose(SignedConsensusProposal), + /// A vote. + Vote(SignedConsensusVote), + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Announce a new complete relay chain block on the network. -pub struct BlockAnnounce { - /// New block header. - pub header: H, -} + /// A network message. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub enum Message { + /// Status packet. + Status(Status), + /// Block request. + BlockRequest(BlockRequest), + /// Block response. + BlockResponse(BlockResponse), + /// Block announce. + BlockAnnounce(BlockAnnounce
    ), + /// Transactions. + Transactions(Transactions), + /// BFT Consensus statement. + BftMessage(LocalizedBftMessage), + /// Remote method call request. + RemoteCallRequest(RemoteCallRequest), + /// Remote method call response. + RemoteCallResponse(RemoteCallResponse), + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Remote call request. -pub struct RemoteCallRequest { - /// Unique request id. - pub id: RequestId, - /// Block at which to perform call. - pub block: H, - /// Method name. - pub method: String, - /// Call data. - pub data: Vec, -} + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct Status { + /// Protocol version. + pub version: u32, + /// Supported roles. + pub roles: Vec, + /// Best block number. + pub best_number: Number, + /// Best block hash. + pub best_hash: Hash, + /// Genesis block hash. + pub genesis_hash: Hash, + /// Signatue of `best_hash` made with validator address. Required for the validator role. + pub validator_signature: Option, + /// Validator address. Required for the validator role. + pub validator_id: Option, + /// Parachain id. Required for the collator role. + pub parachain_id: Option, + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Remote call response. -pub struct RemoteCallResponse { - /// Id of a request this response was made for. - pub id: RequestId, - /// Method return value. - pub value: Vec, - /// Execution proof. - pub proof: Vec>, + /// Request block data from a peer. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct BlockRequest { + /// Unique request id. + pub id: RequestId, + /// Bits of block data to request. + pub fields: Vec, + /// Start from this block. + pub from: FromBlock, + /// End at this block. An implementation defined maximum is used when unspecified. + pub to: Option, + /// Sequence direction. + pub direction: Direction, + /// Maximum number of blocks to return. An implementation defined maximum is used when unspecified. + pub max: Option, + } + + /// Response to `BlockRequest` + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct BlockResponse { + /// Id of a request this response was made for. + pub id: RequestId, + /// Block data for the requested sequence. + pub blocks: Vec>, + } + + /// Announce a new complete relay chain block on the network. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct BlockAnnounce { + /// New block header. + pub header: H, + } + + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + /// Remote call request. + pub struct RemoteCallRequest { + /// Unique request id. + pub id: RequestId, + /// Block at which to perform call. + pub block: H, + /// Method name. + pub method: String, + /// Call data. + pub data: Vec, + } } diff --git a/substrate/network/src/on_demand.rs b/substrate/network/src/on_demand.rs index 0b2ebbb8fed13..ee6ff65348ca2 100644 --- a/substrate/network/src/on_demand.rs +++ b/substrate/network/src/on_demand.rs @@ -30,7 +30,7 @@ use io::SyncIo; use message; use network::PeerId; use service; -use runtime_primitives::traits::{Block as BlockT}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; /// Remote request timeout. const REQUEST_TIMEOUT: Duration = Duration::from_secs(15); @@ -87,7 +87,10 @@ impl Future for Response { } } -impl OnDemand where E: service::ExecuteInContext { +impl OnDemand where + E: service::ExecuteInContext, + B::Header: HeaderT, +{ /// Creates new on-demand service. pub fn new(checker: Arc>) -> Self { OnDemand { @@ -124,7 +127,11 @@ impl OnDemand where E: service::ExecuteInContext { } } -impl OnDemandService for OnDemand where B: BlockT, E: service::ExecuteInContext { +impl OnDemandService for OnDemand where + B: BlockT, + E: service::ExecuteInContext, + B::Header: HeaderT, +{ fn on_connect(&self, peer: PeerId, role: service::Role) { if !role.intersects(service::Role::FULL | service::Role::COLLATOR | service::Role::VALIDATOR) { // TODO: correct? return; @@ -176,15 +183,23 @@ impl OnDemandService for OnDemand where B: BlockT, E: service::Execu } } -impl Fetcher for OnDemand where B: BlockT, E: service::ExecuteInContext { +impl Fetcher for OnDemand where + B: BlockT, + E: service::ExecuteInContext, + B::Header: HeaderT, +{ type RemoteCallResult = Response; fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult { - self.remote_call(request) + OnDemand::remote_call(self, request) } } -impl OnDemandCore where B: BlockT, E: service::ExecuteInContext { +impl OnDemandCore where + B: BlockT, + E: service::ExecuteInContext , + B::Header: HeaderT +{ pub fn add_peer(&mut self, peer: PeerId) { self.idle_peers.push_back(peer); } @@ -264,7 +279,7 @@ impl OnDemandCore where B: BlockT, E: service::ExecuteInContext { data: request.request.call_data.clone(), }; - protocol.send_message(ctx, peer, message::Message::RemoteCallRequest(message)) + protocol.send_message(ctx, peer, message::generic::Message::RemoteCallRequest(message)) }); self.active_peers.insert(peer, request); } diff --git a/substrate/network/src/protocol.rs b/substrate/network/src/protocol.rs index 17f703a116209..3a56bd3a5524c 100644 --- a/substrate/network/src/protocol.rs +++ b/substrate/network/src/protocol.rs @@ -25,6 +25,7 @@ use runtime_primitives::generic::BlockId; use network::{PeerId, NodeId}; use message::{self, Message}; +use message::generic::Message as GenericMessage; use sync::{ChainSync, Status as SyncStatus, SyncState}; use consensus::Consensus; use service::{Role, TransactionPool, BftMessageStream}; @@ -158,9 +159,9 @@ impl Protocol where }; match message { - Message::Status(s) => self.on_status_message(io, peer_id, s), - Message::BlockRequest(r) => self.on_block_request(io, peer_id, r), - Message::BlockResponse(r) => { + GenericMessage::Status(s) => self.on_status_message(io, peer_id, s), + GenericMessage::BlockRequest(r) => self.on_block_request(io, peer_id, r), + GenericMessage::BlockResponse(r) => { let request = { let mut peers = self.peers.write(); if let Some(ref mut peer) = peers.get_mut(&peer_id) { @@ -185,19 +186,19 @@ impl Protocol where } self.on_block_response(io, peer_id, request, r); }, - Message::BlockAnnounce(announce) => { + GenericMessage::BlockAnnounce(announce) => { self.on_block_announce(io, peer_id, announce); }, - Message::BftMessage(m) => self.on_bft_message(io, peer_id, m, HashingFor::::hash(data)), - Message::Transactions(m) => self.on_transactions(io, peer_id, m), - Message::RemoteCallRequest(request) => self.on_remote_call_request(io, peer_id, request), - Message::RemoteCallResponse(response) => self.on_remote_call_response(io, peer_id, response) + GenericMessage::BftMessage(m) => self.on_bft_message(io, peer_id, m, HashingFor::::hash(data)), + GenericMessage::Transactions(m) => self.on_transactions(io, peer_id, m), + GenericMessage::RemoteCallRequest(request) => self.on_remote_call_request(io, peer_id, request), + GenericMessage::RemoteCallResponse(response) => self.on_remote_call_response(io, peer_id, response) } } pub fn send_message(&self, io: &mut SyncIo, peer_id: PeerId, mut message: Message) { match &mut message { - &mut Message::BlockRequest(ref mut r) => { + &mut GenericMessage::BlockRequest(ref mut r) => { let mut peers = self.peers.write(); if let Some(ref mut peer) = peers.get_mut(&peer_id) { r.id = peer.next_request_id; @@ -268,7 +269,7 @@ impl Protocol where } let number = header.number().clone(); let hash = header.hash(); - let block_data = message::BlockData { + let block_data = message::generic::BlockData { hash: hash, header: if get_header { Some(header) } else { None }, body: if get_body { self.chain.body(&BlockId::Hash(hash)).unwrap_or(None) } else { None }, @@ -287,11 +288,11 @@ impl Protocol where } } } - let response = message::BlockResponse { + let response = message::generic::BlockResponse { id: request.id, blocks: blocks, }; - self.send_message(io, peer, Message::BlockResponse(response)) + self.send_message(io, peer, GenericMessage::BlockResponse(response)) } fn on_block_response(&self, io: &mut SyncIo, peer: PeerId, request: message::BlockRequest, response: message::BlockResponse) { @@ -402,7 +403,7 @@ impl Protocol where } /// Called when peer sends us new transactions - fn on_transactions(&self, _io: &mut SyncIo, peer_id: PeerId, transactions: message::Transactions) { + fn on_transactions(&self, _io: &mut SyncIo, peer_id: PeerId, transactions: message::Transactions) { // Accept transactions only when fully synced if self.sync.read().status().state != SyncState::Idle { trace!(target: "sync", "{} Ignoring transactions while syncing", peer_id); @@ -436,7 +437,7 @@ impl Protocol where if peer.known_transactions.insert(hash.clone()) { Some(t.clone()) } else { None }).collect(); if !to_send.is_empty() { trace!(target: "sync", "Sending {} transactions to {}", to_send.len(), peer_id); - self.send_message(io, *peer_id, Message::Transactions(to_send)); + self.send_message(io, *peer_id, GenericMessage::Transactions(to_send)); } } } @@ -444,7 +445,7 @@ impl Protocol where /// Send Status message fn send_status(&self, io: &mut SyncIo, peer_id: PeerId) { if let Ok(info) = self.chain.info() { - let status = message::Status { + let status = message::generic::Status { version: PROTOCOL_VERSION, genesis_hash: info.chain.genesis_hash, roles: self.config.roles.into(), @@ -454,7 +455,7 @@ impl Protocol where validator_id: None, parachain_id: None, }; - self.send_message(io, peer_id, Message::Status(status)) + self.send_message(io, peer_id, GenericMessage::Status(status)) } } @@ -488,7 +489,7 @@ impl Protocol where for (peer_id, ref mut peer) in peers.iter_mut() { if peer.known_blocks.insert(hash.clone()) { trace!(target: "sync", "Announcing block {:?} to {}", hash, peer_id); - self.send_message(io, *peer_id, Message::BlockAnnounce(message::BlockAnnounce { + self.send_message(io, *peer_id, GenericMessage::BlockAnnounce(message::BlockAnnounce { header: header.clone() })); } @@ -508,7 +509,7 @@ impl Protocol where }, }; - self.send_message(io, peer_id, message::Message::RemoteCallResponse(message::RemoteCallResponse { + self.send_message(io, peer_id, GenericMessage::RemoteCallResponse(message::RemoteCallResponse { id: request.id, value, proof, })); } @@ -518,8 +519,8 @@ impl Protocol where self.on_demand.as_ref().map(|s| s.on_remote_response(io, peer_id, response)); } - pub fn transactions_stats(&self) -> BTreeMap { - BTreeMap::new() + pub fn transactions_stats(&self) -> HashMap { + HashMap::new() } pub fn chain(&self) -> &Client { diff --git a/substrate/network/src/service.rs b/substrate/network/src/service.rs index 31555ac636a7a..824310e64790d 100644 --- a/substrate/network/src/service.rs +++ b/substrate/network/src/service.rs @@ -15,7 +15,7 @@ // along with Polkadot. If not, see .? use std::sync::Arc; -use std::collections::{BTreeMap}; +use std::collections::{HashMap}; use std::io; use std::time::Duration; use futures::sync::{oneshot, mpsc}; @@ -73,7 +73,7 @@ pub trait SyncProvider: Send + Sync { /// Get this node id if available. fn node_id(&self) -> Option; /// Returns propagation count for pending transactions. - fn transactions_stats(&self) -> BTreeMap; + fn transactions_stats(&self) -> HashMap; } /// Transaction pool interface @@ -187,7 +187,7 @@ impl Service where B::Header: HeaderT { fn stop(&self) { self.handler.protocol.abort(); - self.network.stop().unwrap_or_else(|e| warn!("Error stopping network: {:?}", e)); + self.network.stop(); } } @@ -238,7 +238,7 @@ impl SyncProvider for Service where B::Header: Header self.network.external_url() } - fn transactions_stats(&self) -> BTreeMap { + fn transactions_stats(&self) -> HashMap { self.handler.protocol.transactions_stats() } } diff --git a/substrate/network/src/sync.rs b/substrate/network/src/sync.rs index 235c7cca98036..ce7d6438db021 100644 --- a/substrate/network/src/sync.rs +++ b/substrate/network/src/sync.rs @@ -22,7 +22,7 @@ use client::{ImportResult, BlockStatus, ClientInfo}; use blocks::{self, BlockCollection}; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; use runtime_primitives::generic::BlockId; -use message::{self, Message}; +use message::{self, generic::Message as GenericMessage}; use service::Role; // Maximum blocks to request in a single packet. @@ -406,7 +406,7 @@ impl ChainSync where if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { match peer.state { PeerSyncState::Available => { - let request = message::BlockRequest { + let request = message::generic::BlockRequest { id: 0, fields: self.required_block_attributes.clone(), from: message::FromBlock::Hash(*hash), @@ -415,7 +415,7 @@ impl ChainSync where max: Some(1), }; peer.state = PeerSyncState::DownloadingStale(*hash); - protocol.send_message(io, peer_id, Message::BlockRequest(request)); + protocol.send_message(io, peer_id, GenericMessage::BlockRequest(request)); }, _ => (), } @@ -430,7 +430,7 @@ impl ChainSync where PeerSyncState::Available => { if let Some(range) = self.blocks.needed_blocks(peer_id, MAX_BLOCKS_TO_REQUEST, peer.best_number, peer.common_number) { trace!(target: "sync", "Requesting blocks from {}, ({} to {})", peer_id, range.start, range.end); - let request = message::BlockRequest { + let request = message::generic::BlockRequest { id: 0, fields: self.required_block_attributes.clone(), from: message::FromBlock::Number(range.start), @@ -439,7 +439,7 @@ impl ChainSync where max: Some((range.end - range.start) as u32), }; peer.state = PeerSyncState::DownloadingNew(range.start); - protocol.send_message(io, peer_id, Message::BlockRequest(request)); + protocol.send_message(io, peer_id, GenericMessage::BlockRequest(request)); } else { trace!(target: "sync", "Nothing to request"); } @@ -451,7 +451,7 @@ impl ChainSync where fn request_ancestry(io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, block: u64) { trace!(target: "sync", "Requesting ancestry block #{} from {}", block, peer_id); - let request = message::BlockRequest { + let request = message::generic::BlockRequest { id: 0, fields: vec![message::BlockAttribute::Header, message::BlockAttribute::Justification], from: message::FromBlock::Number(block), @@ -459,6 +459,6 @@ impl ChainSync where direction: message::Direction::Ascending, max: Some(1), }; - protocol.send_message(io, peer_id, Message::BlockRequest(request)); + protocol.send_message(io, peer_id, GenericMessage::BlockRequest(request)); } } From 5ad3877721c9d2fed3743bb6ae732e21c2e8179e Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Fri, 1 Jun 2018 23:02:16 +0200 Subject: [PATCH 33/60] tests compile for sync --- .../release/demo_runtime.compact.wasm | Bin 415561 -> 416594 bytes .../release/demo_runtime.wasm | Bin 452471 -> 453747 bytes .../release/polkadot_runtime.compact.wasm | Bin 419575 -> 444269 bytes .../release/polkadot_runtime.wasm | Bin 465094 -> 490100 bytes substrate/network/src/blocks.rs | 13 ++++--- substrate/network/src/on_demand.rs | 15 ++++---- substrate/network/src/test/consensus.rs | 12 +++--- substrate/network/src/test/mod.rs | 36 +++++++++--------- substrate/runtime/primitives/src/generic.rs | 1 + substrate/test-runtime/wasm/genesis.wasm | Bin 17627 -> 18636 bytes 10 files changed, 41 insertions(+), 36 deletions(-) diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 54fc2e5bb26ccee6b498c13b0a974f19546f4b07..5742a2a3a9f3bc2630ea8b4b0a51c22ee30e3ba7 100644 GIT binary patch delta 132217 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

    }k!1VZCb}2VeiqCE~H^Y~;2&d#!Z|ENd}(Tt1l3 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 M9Dc0}PV#5|KPAFq*}=ggV%%rnnC^E}U# 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

    @hHMvU8&G02`1DFO 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 F{y*v!!L|SZ diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index 3ee9388e1d5b08e040e9ccd74a9a3d2bb88ef3cf..0bc07026e7b2edafe5dc123c2cb3fb5a6e6881ca 100755 GIT binary patch delta 139288 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 diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index b09894cbae746126300c291fd44d7c0aa86795e4..74255ed5b14984b8f5b05d16d4ef581a49ce29af 100644 GIT binary patch delta 120198 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 delta 96026 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 Tw}Q4Riv|8p;OUjc6~O-jbsB+2 diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index 6ba34088eda63e45b280f604eb31125976f4712b..b210381a63f023f403659740104993dd046d4e61 100755 GIT binary patch delta 126322 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 bsu(CqB@OKDXg~w#`h`rX#>} delta 100861 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�Z2XI@fF!~%oLh>n^mv3 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 F{}*Up>dycG diff --git a/substrate/network/src/blocks.rs b/substrate/network/src/blocks.rs index 6ac36bb5fd271..49b7c18508a96 100644 --- a/substrate/network/src/blocks.rs +++ b/substrate/network/src/blocks.rs @@ -191,16 +191,19 @@ impl BlockCollection where B::Header: HeaderT { mod test { use super::{BlockCollection, BlockData}; use message; - use primitives::block::HeaderHash; + use runtime_primitives::testing::Block as RawBlock; + use primitives::H256; - fn is_empty(bc: &BlockCollection) -> bool { + type Block = RawBlock; + + fn is_empty(bc: &BlockCollection) -> bool { bc.blocks.is_empty() && bc.peer_requests.is_empty() } - fn generate_blocks(n: usize) -> Vec { - (0 .. n).map(|_| message::BlockData { - hash: HeaderHash::random(), + fn generate_blocks(n: usize) -> Vec> { + (0 .. n).map(|_| message::generic::BlockData { + hash: H256::random(), header: None, body: None, message_queue: None, diff --git a/substrate/network/src/on_demand.rs b/substrate/network/src/on_demand.rs index ee6ff65348ca2..e36bf5deca286 100644 --- a/substrate/network/src/on_demand.rs +++ b/substrate/network/src/on_demand.rs @@ -302,16 +302,17 @@ mod tests { use service::{Role, ExecuteInContext}; use test::TestIo; use super::{REQUEST_TIMEOUT, OnDemand, OnDemandService}; + use test_client::runtime::{Block, Hash}; struct DummyExecutor; struct DummyFetchChecker { ok: bool } - impl ExecuteInContext for DummyExecutor { - fn execute_in_context(&self, _closure: F) {} + impl ExecuteInContext for DummyExecutor { + fn execute_in_context)>(&self, _closure: F) {} } - impl FetchChecker for DummyFetchChecker { - fn check_execution_proof(&self, _request: &RemoteCallRequest, remote_proof: (Vec, Vec>)) -> client::error::Result { + impl FetchChecker for DummyFetchChecker { + fn check_execution_proof(&self, _request: &RemoteCallRequest, remote_proof: (Vec, Vec>)) -> client::error::Result { match self.ok { true => Ok(client::CallResult { return_data: remote_proof.0, @@ -322,19 +323,19 @@ mod tests { } } - fn dummy(ok: bool) -> (Arc, Arc>) { + fn dummy(ok: bool) -> (Arc, Arc>) { let executor = Arc::new(DummyExecutor); let service = Arc::new(OnDemand::new(Arc::new(DummyFetchChecker { ok }))); service.set_service_link(Arc::downgrade(&executor)); (executor, service) } - fn total_peers(on_demand: &OnDemand) -> usize { + fn total_peers(on_demand: &OnDemand) -> usize { let core = on_demand.core.lock(); core.idle_peers.len() + core.active_peers.len() } - fn receive_response(on_demand: &OnDemand, network: &mut TestIo, peer: PeerId, id: message::RequestId) { + fn receive_response(on_demand: &OnDemand, network: &mut TestIo, peer: PeerId, id: message::RequestId) { on_demand.on_remote_response(network, peer, message::RemoteCallResponse { id: id, value: vec![1], diff --git a/substrate/network/src/test/consensus.rs b/substrate/network/src/test/consensus.rs index 9cf7dad818722..56bb6510552fc 100644 --- a/substrate/network/src/test/consensus.rs +++ b/substrate/network/src/test/consensus.rs @@ -15,8 +15,9 @@ // along with Polkadot. If not, see . use super::*; -use message::*; +use message::{Message, generic}; use futures::Stream; +use test_client::runtime::Block; #[test] fn bft_messages_include_those_sent_before_asking_for_stream() { @@ -28,21 +29,22 @@ fn bft_messages_include_those_sent_before_asking_for_stream() { let peer = net.peer(0); let mut io = TestIo::new(&peer.queue, None); - let bft_message = BftMessage::Consensus(SignedConsensusMessage::Vote(SignedConsensusVote { - vote: ConsensusVote::AdvanceRound(0), + let bft_message = generic::BftMessage::Consensus(generic::SignedConsensusMessage::Vote(generic::SignedConsensusVote { + vote: generic::ConsensusVote::AdvanceRound(0), sender: [0; 32], signature: Default::default(), })); let parent_hash = peer.genesis_hash(); - let localized = LocalizedBftMessage { + let localized = ::message::LocalizedBftMessage:: { message: bft_message, parent_hash: parent_hash, }; + let message: Message = generic::Message::BftMessage(localized.clone()); - let as_bytes = ::serde_json::to_vec(&Message::BftMessage(localized.clone())).unwrap(); + let as_bytes = ::serde_json::to_vec(&message).unwrap(); peer.sync.handle_packet(&mut io, 1, &as_bytes[..]); let stream = peer.sync.bft_messages(parent_hash); diff --git a/substrate/network/src/test/mod.rs b/substrate/network/src/test/mod.rs index 3699802daf9e4..6160db4eb10ce 100644 --- a/substrate/network/src/test/mod.rs +++ b/substrate/network/src/test/mod.rs @@ -23,17 +23,17 @@ use std::sync::Arc; use parking_lot::RwLock; use client; use client::block_builder::BlockBuilder; -use primitives::block::{Id as BlockId, ExtrinsicHash, HeaderHash}; -use primitives; +use runtime_primitives::traits::Block as BlockT; +use runtime_primitives::generic::BlockId; use io::SyncIo; use protocol::Protocol; use config::ProtocolConfig; use service::TransactionPool; use network::{PeerId, SessionInfo, Error as NetworkError}; -use runtime_support::Hashable; use keyring::Keyring; use codec::Slicable; use test_client::{self, TestClient}; +use test_client::runtime::{Block, Hash, Call, Extrinsic, UncheckedExtrinsic}; pub struct TestIo<'p> { pub queue: &'p RwLock>, @@ -100,8 +100,8 @@ pub struct TestPacket { } pub struct Peer { - client: Arc>, - pub sync: Protocol, + client: Arc>, + pub sync: Protocol, pub queue: RwLock>, } @@ -158,12 +158,12 @@ impl Peer { fn flush(&self) { } - fn generate_blocks(&self, count: usize, mut edit_block: F) where F: FnMut(&mut BlockBuilder) { + fn generate_blocks(&self, count: usize, mut edit_block: F) where F: FnMut(&mut BlockBuilder) { for _ in 0 .. count { let mut builder = self.client.new_block().unwrap(); edit_block(&mut builder); let block = builder.bake().unwrap(); - trace!("Generating {}, (#{})", primitives::block::HeaderHash::from(block.header.blake2_256()), block.header.number); + trace!("Generating {}, (#{})", block.hash(), block.header.number); self.client.justify_and_import(client::BlockOrigin::File, block).unwrap(); } } @@ -172,15 +172,13 @@ impl Peer { let mut nonce = 0; if with_tx { self.generate_blocks(count, |builder| { - let tx = test_client::runtime::Transaction { - from: Keyring::Alice.to_raw_public(), - to: Keyring::Alice.to_raw_public(), - amount: 1, - nonce: nonce, + let xt = Extrinsic { + signed: Keyring::Alice.to_raw_public().into(), + function: Call { to: Keyring::Alice.to_raw_public().into(), amount: 1 }, + index: nonce, }; - let signature = Keyring::from_raw_public(tx.from.clone()).unwrap().sign(&tx.encode()); - let tx = primitives::block::Extrinsic::decode(&mut test_client::runtime::UncheckedTransaction { signature, tx: tx }.encode().as_ref()).unwrap(); - builder.push(tx).unwrap(); + let signature = Keyring::from_raw_public(xt.signed.0).unwrap().sign(&xt.encode()).into(); + builder.push(UncheckedExtrinsic { extrinsic: xt, signature }).unwrap(); nonce = nonce + 1; }); } else { @@ -188,7 +186,7 @@ impl Peer { } } - pub fn genesis_hash(&self) -> HeaderHash { + pub fn genesis_hash(&self) -> Hash { let info = self.client.info().expect("In-mem client does not fail"); info.chain.genesis_hash } @@ -196,12 +194,12 @@ impl Peer { struct EmptyTransactionPool; -impl TransactionPool for EmptyTransactionPool { - fn transactions(&self) -> Vec<(ExtrinsicHash, Vec)> { +impl TransactionPool for EmptyTransactionPool { + fn transactions(&self) -> Vec<(Hash, UncheckedExtrinsic)> { Vec::new() } - fn import(&self, _transaction: &[u8]) -> Option { + fn import(&self, _transaction: &UncheckedExtrinsic) -> Option { None } } diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 47b53e3c51486..f32b3ed193c72 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -304,6 +304,7 @@ struct DeserializeHeader { digest: Digest, } +#[cfg(feature = "std")] impl From> for Header { fn from(other: DeserializeHeader) -> Self { Header { diff --git a/substrate/test-runtime/wasm/genesis.wasm b/substrate/test-runtime/wasm/genesis.wasm index 7b0503bb21b077966ff2c9feab1a16a35b23340e..180df41c4c560c02a6c99b9c036780f51076d9f1 100644 GIT binary patch delta 3027 zcmb7GU5p!76~6b*kLSm;p53Hrvm46w?23Am-Sw^ zZ0yDB6^R5mR8f@*NNEN{#Y?NIQhDg2AR|#J0rG?v6hTxKHP8oMsFa6FfK;TQ^1!(> z_Oc0;5Lr#mJ?EaE@1Aq+@qOG~4K!;6=L3JU7o73dI{sO7FjHS&U%PN7IN$5G+8Zq& zEsQl=?fP14W29nhzvx*KGEJl_h}|#-jBFC?9mBL@!C&IVYpN{u@i+1Cn?~$nbVoe1 zXc3B7C7eab6%fVjWgN1bD6|9+1HDha4RSH^q(59uWuKNp3-o7&ZR{ch%8!IpoE1>Q zm?0H*7$u}+$Y3fl3WjB3a@&`2R*t@!+K=Vv+o?~SBFo7i#W|u_=$HWkawMGvh@E)B|7{$asjNVjDd9@U#5zbJPJ;h?*xWZs1p`N#@@QXVKhl_NKE_@An83k+ULzJU zbC#Td_?$r~rg9B`-4zrbgoNPCLbW6(oZKZ;prFO~Os;b$(E(`uXgqb?*InWYceong z=6IDb&lFRI)msD-#9q~ajiJ0nERjRGNvxEa%Yx5Y;Z>fGKPjjB3YAYAfRt^675B2s zaGO{XH@r!-g?j+ze#jzCfpr4;e<8ic55$pDjrL{8#DBY!C_l*m& zP;bR$lAufpeV)~2Z zvJqWLKi+@AU`2BV>Ay({1R7lLLwnywXDu>=$TIt z`+6kIrjnHzW)+6ADwVU6undieEbSQ7mQW2KP*Rg!;v}jFcBhghw4X+`96^@O2hlOKjs5WAU@Szse;OW(sWe=H3kR}6;vS$XkH@1ZNl$1Y zj0}~JPaVRkNno-}C4Qn5&wm<>4Vr!`NhLQ{p5>JVCs{?O>Q;?DPnE4pSrN?QTO)Hb z0v9rzK~&7>=EHES-%cl2mfcd=Jiog;68<~Jo>SRe^!xPU)MW!s4u#?_C@vEbJi!E_ z#5^>ZGLB+AH~7+60h6Do(UnXd2EyQ1nG={?%0%h$Fo94mHarh<% z;rQnz{O;hF`^p%|KOX)e#`Dp4_irWM7NT(Suj+S_x%2wiz?(Xq!g~fkxAqadcksKJ zVrKH=(D9!;^H4P9dhaYj{$N;Q!&k!v+S;J&-OhT@UAsVow%=(44ccncUa--d z?{2nxt#d(QvKF*YuLj+K*7>*gwfcn(y6f@rpwZyH>KE{-wU+01xp*#bDhRQ zccazr1zmWA(4gDxbeAA1@DO#g-3{vgYTa84D916f?X34&oi-S5^tzp>dN_|!R5)Dj z^XH2GH(U}C8b=6OK=%NBpCBXwm1KnW0==yyJOiHVT@@1k&!BVwcmt>bvnOxT^k=ZEr-K(4{MGvxOJ zU>$EqtufVdz-ccW}aUv1a8F%yvI%)IUT*S@=!Ean*n^TS8e!}ay1C-da)XP zxt3ojGz*n_5O|eBrQrImGrRk}d+`3}?x8CYTbYgiSbKKd_k*hEl#7*Sx!^6WxLR*JGNhMG#X92>McC@aL$i>pPWrD$wg1K+(s+_ delta 1971 zcma)7O=ufO6rP#YN-M7vj}#>&&JU}#i)AOVCGD<$oH+5?u|k_r`V%N22eW@_rMQxD z9Fjs?hn`Ysi<2R3jz08|LqcR0N}+`sT3VL|>Qb5*N=Xle9b_Iob{4Qxq+s(JuA0lJ%BIBa z?7aBPyi^76c-sje-3d~iKkp;}xC(dJZTT3YVwC5# zMylo}DMy>E96d(6MwE>hg^H6=EVJi>eN|Fb1qJa^5mE%8gVJ|2OK)PzG2O%x$I=GI z3Ne+cigJW1ctE&@lYwTAd=1^D;1q#kQUoNgDgpLmaF5MlBngRtOC?R`quN$*m4=c6 z8B@?C)JG_mTWqZkEMU65M-iepLY}rquxzeJXcEb6G_-eKG`|j;LE6vNm=;OKZwIv)d|W1KkfxF$9=d`JnLjA960A?+4#2CfjbDd8$n z!w}d7`NHyd^1>zP+T(eOO7Kyhyruu09yTuta5`uh*t(SY0F?hUouq)9A2BHVf6}$I zzD;=dB;5`gpf07N5n(C?*(G2Z9fu`DKcCH8TA7{dMU;>R&rj!LGV7vk^V2&@rZ8wacfjtW2 zFkA#K7wml<_F~)q5v)sf*v+w3oNnlaoS!*b$Fx{3I9Aau7Cc8Y9K&FZ$$Y{n=CbL$mb25Ys~PD+|M5d7 z*}}1HjF$SS;}yzTJ6Fi)PO+dD4R*9NtT=|7(Jim2=Pg~&WVM0EzjcFbv2-z(&lNS- zNSBL{n&x@geJpeAN=&yc!$@0R*3;c`+V%FcrOBLX7tAiatJ8T f4|p}F?s_95Z)DtbxoqiqPqQ>nD`$qE_>}$&_yCzi From b3cbe4f9fe1897414b2b24c6aa5bc6b27e7075b4 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Fri, 1 Jun 2018 23:13:59 +0200 Subject: [PATCH 34/60] fix deserialization --- Cargo.lock | 1 + substrate/runtime/primitives/Cargo.toml | 3 + substrate/runtime/primitives/src/bft.rs | 16 +++--- substrate/runtime/primitives/src/generic.rs | 64 +++++++++++++++++++++ substrate/runtime/primitives/src/lib.rs | 3 + 5 files changed, 79 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e7e00cf2eb3c0..cfd41a5a458a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2155,6 +2155,7 @@ dependencies = [ "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", diff --git a/substrate/runtime/primitives/Cargo.toml b/substrate/runtime/primitives/Cargo.toml index 42c7134ec688c..185621611943f 100644 --- a/substrate/runtime/primitives/Cargo.toml +++ b/substrate/runtime/primitives/Cargo.toml @@ -14,6 +14,9 @@ substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } +[dev-dependencies] +serde_json = "1.0" + [features] default = ["std"] std = [ diff --git a/substrate/runtime/primitives/src/bft.rs b/substrate/runtime/primitives/src/bft.rs index bd380baf58f6d..111c265233af2 100644 --- a/substrate/runtime/primitives/src/bft.rs +++ b/substrate/runtime/primitives/src/bft.rs @@ -202,18 +202,18 @@ pub enum MisbehaviorKind { /// A report of misbehavior by an authority. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct MisbehaviorReport { +pub struct MisbehaviorReport { /// The parent hash of the block where the misbehavior occurred. pub parent_hash: Hash, /// The parent number of the block where the misbehavior occurred. - pub parent_number: Hash, + pub parent_number: Number, /// The authority who misbehavior. pub target: AuthorityId, /// The misbehavior kind. pub misbehavior: MisbehaviorKind, } -impl Slicable for MisbehaviorReport { +impl Slicable for MisbehaviorReport { fn encode(&self) -> Vec { let mut v = Vec::new(); self.parent_hash.using_encoded(|s| v.extend(s)); @@ -244,7 +244,7 @@ impl Slicable for MisbehaviorReport { fn decode(input: &mut I) -> Option { let parent_hash = Hash::decode(input)?; - let parent_number = Hash::decode(input)?; + let parent_number = Number::decode(input)?; let target = AuthorityId::decode(input)?; let misbehavior = match i8::decode(input).and_then(MisbehaviorCode::from_i8)? { @@ -280,7 +280,7 @@ mod test { #[test] fn misbehavior_report_roundtrip() { - let report = MisbehaviorReport:: { + let report = MisbehaviorReport:: { parent_hash: [0; 32].into(), parent_number: 999, target: [1; 32].into(), @@ -292,9 +292,9 @@ mod test { }; let encoded = report.encode(); - assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); + assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); - let report = MisbehaviorReport:: { + let report = MisbehaviorReport:: { parent_hash: [0; 32].into(), parent_number: 999, target: [1; 32].into(), @@ -306,6 +306,6 @@ mod test { }; let encoded = report.encode(); - assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); + assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); } } diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index f32b3ed193c72..a5e1f1a17b24d 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -295,6 +295,7 @@ pub struct Header { // the `hashing` trait used as a parameter. // dummy struct that uses the hash type directly. #[cfg(feature = "std")] +#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[derive(Deserialize)] struct DeserializeHeader { parent_hash: H, @@ -441,6 +442,7 @@ impl<'a, Number, Hashing: HashingT, DigestItem, AccountId, Index, Call, Signatur fn deserialize>(de: D) -> Result { // dummy struct that uses the hash type directly. #[derive(Deserialize)] + #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] struct Inner { header: DeserializeHeader, extrinsics: Vec, @@ -522,3 +524,65 @@ where Block { header, extrinsics } } } + +#[cfg(test)] +mod tests { + use codec::Slicable; + use substrate_primitives::{H256, H512}; + use super::{Digest, Header, UncheckedExtrinsic, Extrinsic}; + + type Block = super::Block< + u64, + ::traits::BlakeTwo256, + Vec, + H256, + u64, + u64, + ::Ed25519Signature + >; + + #[test] + fn block_roundtrip_serialization() { + let block: Block = Block { + header: Header { + parent_hash: [0u8; 32].into(), + number: 100_000, + state_root: [1u8; 32].into(), + extrinsics_root: [2u8; 32].into(), + digest: Digest { logs: vec![vec![1, 2, 3], vec![4, 5, 6]] }, + }, + extrinsics: vec![ + UncheckedExtrinsic { + signature: H512::from([0u8; 64]).into(), + extrinsic: Extrinsic { + signed: [255u8; 32].into(), + index: 0, + function: 100, + } + }, + UncheckedExtrinsic { + signature: H512::from([255u8; 64]).into(), + extrinsic: Extrinsic { + signed: [128u8; 32].into(), + index: 100, + function: 99, + } + }, + ] + }; + + { + let encoded = ::serde_json::to_vec(&block).unwrap(); + let decoded: Block = ::serde_json::from_slice(&encoded).unwrap(); + + assert_eq!(block, decoded); + } + + { + let encoded = block.encode(); + let decoded = Block::decode(&mut &encoded[..]).unwrap(); + + assert_eq!(block, decoded); + } + } +} diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 07aa7c26b0e15..c52d25306c085 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -34,6 +34,9 @@ extern crate substrate_runtime_support as runtime_support; extern crate substrate_codec as codec; extern crate substrate_primitives; +#[cfg(test)] +extern crate serde_json; + #[cfg(feature = "std")] use std::collections::HashMap; From a36f328096431644c848f381c8caa84d28a51ef9 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 2 Jun 2018 00:17:51 +0200 Subject: [PATCH 35/60] temporarily remove deserialize derives --- substrate/runtime-support/src/dispatch.rs | 3 ++- substrate/runtime/consensus/src/lib.rs | 6 +++--- substrate/runtime/council/src/lib.rs | 6 +++--- substrate/runtime/democracy/src/lib.rs | 6 +++--- substrate/runtime/session/src/lib.rs | 6 +++--- substrate/runtime/staking/src/lib.rs | 6 +++--- substrate/runtime/system/src/lib.rs | 1 + substrate/runtime/timestamp/src/lib.rs | 4 ++-- 8 files changed, 20 insertions(+), 18 deletions(-) diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 658bc5bb54bf0..1f886f4c60d04 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -78,7 +78,6 @@ macro_rules! decl_module { $($rest:tt)* ) => { $(#[$attr])* - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct $mod_type<$trait_instance: $trait_name>($crate::dispatch::PhantomData<$trait_instance>); decl_dispatch! { impl for $mod_type<$trait_instance: $trait_name>; @@ -86,9 +85,11 @@ macro_rules! decl_module { } }; ( + $(#[$attr:meta])* struct $mod_type:ident<$trait_instance:ident: $trait_name:ident>; $($rest:tt)* ) => { + $(#[$attr])* struct $mod_type<$trait_instance: $trait_name>($crate::dispatch::PhantomData<$trait_instance>); decl_dispatch! { impl for $mod_type<$trait_instance: $trait_name>; diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 7d335ea53adb5..c73dcb69fec71 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -65,17 +65,17 @@ pub trait Trait: system::Trait { decl_module! { #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub enum Call where aux: T::PublicAux { fn report_misbehavior(aux, report: MisbehaviorReport) -> Result = 0; } #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub enum PrivCall { fn set_code(new: Vec) -> Result = 0; fn set_storage(items: Vec) -> Result = 1; diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index da9d9a7e53b38..fee1b01b2e798 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -106,11 +106,11 @@ pub trait Trait: democracy::Trait {} decl_module! { #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub enum Call where aux: T::PublicAux { fn set_approvals(aux, votes: Vec, index: VoteIndex) -> Result = 0; fn reap_inactive_voter(aux, signed_index: u32, who: T::AccountId, who_index: u32, assumed_vote_index: VoteIndex) -> Result = 1; @@ -120,7 +120,7 @@ decl_module! { } #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub enum PrivCall { fn set_desired_seats(count: u32) -> Result = 0; fn remove_member(who: T::AccountId) -> Result = 1; diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index c05b2cb77f110..66dcfb21fbeea 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -62,11 +62,11 @@ pub trait Trait: staking::Trait + Sized { decl_module! { #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub enum Call where aux: T::PublicAux { fn propose(aux, proposal: Box, value: T::Balance) -> Result = 0; fn second(aux, proposal: PropIndex) -> Result = 1; @@ -74,7 +74,7 @@ decl_module! { } #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub enum PrivCall { fn start_referendum(proposal: Box, vote_threshold: VoteThreshold) -> Result = 0; fn cancel_referendum(ref_index: ReferendumIndex) -> Result = 1; diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 9d5c60e9a9f2a..64edb89de4b5e 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -55,17 +55,17 @@ pub trait Trait: consensus::Trait { decl_module! { #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub enum Call where aux: T::PublicAux { fn set_key(aux, key: T::SessionKey) -> Result = 0; } #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub enum PrivCall { fn set_length(new: T::BlockNumber) -> Result = 0; fn force_new_session() -> Result = 1; diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index b2ceebbd227b4..505a7938ba011 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -103,11 +103,11 @@ pub trait Trait: system::Trait + session::Trait { decl_module! { #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub enum Call where aux: T::PublicAux { fn transfer(aux, dest: T::AccountId, value: T::Balance) -> Result = 0; fn stake(aux) -> Result = 1; @@ -115,7 +115,7 @@ decl_module! { } #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub enum PrivCall { fn set_sessions_per_era(new: T::BlockNumber) -> Result = 0; fn set_bonding_duration(new: T::BlockNumber) -> Result = 1; diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 4d4f7bb16b4e4..626a2c117bddc 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -79,6 +79,7 @@ pub trait Trait { decl_module! { #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; } diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 990d004868057..74d49b3840976 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -50,11 +50,11 @@ pub trait Trait: HasPublicAux + system::Trait { decl_module! { #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Serialize))] pub enum Call where aux: T::PublicAux { fn set(aux, now: T::Value) -> Result = 0; } From d3ee03eb486063cc9d616752f80e598bc0cb8f03 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 2 Jun 2018 01:49:29 +0200 Subject: [PATCH 36/60] workarounds for serde issues for deriving deserialization --- Cargo.lock | 2 - expanded.rs | 6603 +++++++++++++++++ polkadot/runtime/src/lib.rs | 7 +- polkadot/runtime/src/parachains.rs | 8 +- polkadot/runtime/src/primitives.rs | 22 +- substrate/runtime-support/src/dispatch.rs | 46 +- substrate/runtime/consensus/src/lib.rs | 8 +- substrate/runtime/council/src/lib.rs | 8 +- substrate/runtime/council/src/voting.rs | 4 - substrate/runtime/democracy/src/lib.rs | 12 +- .../runtime/democracy/src/vote_threshold.rs | 2 +- substrate/runtime/executive/Cargo.toml | 2 - substrate/runtime/executive/src/lib.rs | 4 - substrate/runtime/session/src/lib.rs | 8 +- substrate/runtime/staking/src/lib.rs | 8 +- substrate/runtime/system/Cargo.toml | 2 - substrate/runtime/system/src/lib.rs | 6 - substrate/runtime/timestamp/src/lib.rs | 5 +- 18 files changed, 6672 insertions(+), 85 deletions(-) create mode 100644 expanded.rs diff --git a/Cargo.lock b/Cargo.lock index bfca1c4c54cae..c65b41318c4cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2138,7 +2138,6 @@ version = "0.1.0" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", @@ -2267,7 +2266,6 @@ dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", diff --git a/expanded.rs b/expanded.rs new file mode 100644 index 0000000000000..40eb674a1a27e --- /dev/null +++ b/expanded.rs @@ -0,0 +1,6603 @@ +#![feature(prelude_import)] +#![no_std] +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The Polkadot runtime. This can be compiled with ``#[no_std]`, ready for Wasm. +#[prelude_import] +use std::prelude::v1::*; +#[macro_use] +extern crate std; + + +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + +#[cfg(feature = "std")] +extern crate serde; + +#[macro_use] +extern crate substrate_runtime_io as runtime_io; + +#[macro_use] +extern crate substrate_runtime_support; + +#[macro_use] +extern crate substrate_runtime_primitives as runtime_primitives; + + + +#[macro_use] +extern crate substrate_primitives; + +extern crate substrate_runtime_std as rstd; +extern crate substrate_codec as codec; +extern crate substrate_runtime_consensus as consensus; +extern crate substrate_runtime_council as council; +extern crate substrate_runtime_democracy as democracy; +extern crate substrate_runtime_executive as executive; +extern crate substrate_runtime_session as session; +extern crate substrate_runtime_staking as staking; +extern crate substrate_runtime_system as system; +extern crate substrate_runtime_timestamp as timestamp; + +pub mod primitives { + + + + + + + // TODO: Option + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + // 71000000 + // 0101010101010101010101010101010101010101010101010101010101010101 + // e703000000000000 + // 00 + // df0f0200 + // 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + + + + + //! Primitive types for the polkadot runtime. + use codec::{Slicable, Input}; + use rstd::prelude::*; + use rstd::cmp::Ordering; + use substrate_primitives; + use runtime_primitives::{self, generic, traits::BlakeTwo256}; + use super::Call; + #[cfg(feature = "std")] + use substrate_primitives::bytes; + /// Block header type as expected by this runtime. + pub type Header = generic::Header; + /// Block type as expected by this runtime. + pub type Block = + generic::Block; + /// Unchecked extrinsic type as expected by this runtime. + pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; + /// Extrinsic type as expected by this runtime. + pub type Extrinsic = generic::Extrinsic; + /// Something that identifies a block. + pub type BlockId = generic::BlockId; + /// A log entry in the block. + #[structural_match] + pub struct Log( + #[serde(with = "bytes")] + pub Vec); + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for Log { + #[inline] + fn eq(&self, other: &Log) -> bool { + match *other { + Log(ref __self_1_0) => + match *self { + Log(ref __self_0_0) => (*__self_0_0) == (*__self_1_0), + }, + } + } + #[inline] + fn ne(&self, other: &Log) -> bool { + match *other { + Log(ref __self_1_0) => + match *self { + Log(ref __self_0_0) => (*__self_0_0) != (*__self_1_0), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for Log { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { let _: ::std::cmp::AssertParamIsEq>; } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for Log { + #[inline] + fn clone(&self) -> Log { + match *self { + Log(ref __self_0_0) => + Log(::std::clone::Clone::clone(&(*__self_0_0))), + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::default::Default for Log { + #[inline] + fn default() -> Log { Log(::std::default::Default::default()) } + } + #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] + const _IMPL_SERIALIZE_FOR_Log: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } } + }); + #[automatically_derived] + impl _serde::Serialize for Log { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + _serde::Serializer::serialize_newtype_struct(__serializer, + "Log", + { + struct __SerializeWith<'__a> { + values: (&'__a Vec,), + phantom: _serde::export::PhantomData, + } + impl <'__a> + _serde::Serialize + for + __SerializeWith<'__a> + { + fn serialize<__S>(&self, + __s: + __S) + -> + _serde::export::Result<__S::Ok, + __S::Error> + where + __S: _serde::Serializer { + bytes::serialize(self.values.0, + __s) + } + } + &__SerializeWith{values: + (&self.0,), + phantom: + _serde::export::PhantomData::,} + }) + } + } + }; + #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_Log: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } } + }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for Log { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> { + type + Value + = + Log; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "tuple struct Log") + } + #[inline] + fn visit_newtype_struct<__E>(self, __e: __E) + -> _serde::export::Result + where __E: _serde::Deserializer<'de> { + let __field0: Vec = + match bytes::deserialize(__e) { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + _serde::export::Ok(Log(__field0)) + } + #[inline] + fn visit_seq<__A>(self, mut __seq: __A) + -> _serde::export::Result + where __A: _serde::de::SeqAccess<'de> { + let __field0 = + match { + struct __DeserializeWith<'de> { + value: Vec, + phantom: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::Deserialize<'de> + for __DeserializeWith<'de> { + fn deserialize<__D>(__deserializer: + __D) + -> + _serde::export::Result + where + __D: _serde::Deserializer<'de> { + _serde::export::Ok(__DeserializeWith{value: + match bytes::deserialize(__deserializer) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + phantom: + _serde::export::PhantomData, + lifetime: + _serde::export::PhantomData,}) + } + } + _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => { + return _serde::export::Err(__err); + } + }, + |__wrap| + __wrap.value) + } { + _serde::export::Some(__value) => __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(0usize, + &"tuple struct Log with 1 element")); + } + }; + _serde::export::Ok(Log(__field0)) + } + } + _serde::Deserializer::deserialize_newtype_struct(__deserializer, + "Log", + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for Log { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + match *self { + Log(ref __self_0_0) => { + let mut debug_trait_builder = f.debug_tuple("Log"); + let _ = debug_trait_builder.field(&&(*__self_0_0)); + debug_trait_builder.finish() + } + } + } + } + impl Slicable for Log { + fn decode(input: &mut I) -> Option { + Vec::::decode(input).map(Log) + } + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } + } + /// An index to a block. + /// 32-bits will allow for 136 years of blocks assuming 1 block per second. + /// TODO: switch to u32 + pub type BlockNumber = u64; + /// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost + /// certainly continue to be the same as the substrate's `AuthorityId`. + pub type AccountId = substrate_primitives::hash::H256; + /// The Ed25519 pub key of an session that belongs to an authority of the relay chain. This is + /// exactly equivalent to what the substrate calls an "authority". + pub type SessionKey = substrate_primitives::AuthorityId; + /// Indentifier for a chain. 32-bit should be plenty. + pub type ChainId = u32; + /// Index of a transaction in the relay chain. 32-bit should be plenty. + pub type Index = u32; + /// A hash of some data used by the relay chain. + pub type Hash = substrate_primitives::H256; + /// Alias to 512-bit hash when used in the context of a signature on the relay chain. + /// Equipped with logic for possibly "unsigned" messages. + pub type Signature = + runtime_primitives::MaybeUnsigned; + /// A timestamp: seconds since the unix epoch. + pub type Timestamp = u64; + /// The balance of an account. + /// 128-bits (or 38 significant decimal figures) will allow for 10m currency (10^7) at a resolution + /// to all for one second's worth of an annualised 50% reward be paid to a unit holder (10^11 unit + /// denomination), or 10^18 total atomic units, to grow at 50%/year for 51 years (10^9 multiplier) + /// for an eventual total of 10^27 units (27 significant decimal figures). + /// We round denomination to 10^12 (12 sdf), and leave the other redundancy at the upper end so + /// that 32 bits may be multiplied with a balance in 128 bits without worrying about overflow. + pub type Balance = u128; + /// Parachain data types. + pub mod parachain { + use super::*; + /// Unique identifier of a parachain. + #[structural_match] + #[rustc_copy_clone_marker] + pub struct Id(u32); + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for Id { + #[inline] + fn eq(&self, other: &Id) -> bool { + match *other { + Id(ref __self_1_0) => + match *self { + Id(ref __self_0_0) => (*__self_0_0) == (*__self_1_0), + }, + } + } + #[inline] + fn ne(&self, other: &Id) -> bool { + match *other { + Id(ref __self_1_0) => + match *self { + Id(ref __self_0_0) => (*__self_0_0) != (*__self_1_0), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for Id { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { let _: ::std::cmp::AssertParamIsEq; } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialOrd for Id { + #[inline] + fn partial_cmp(&self, other: &Id) + -> ::std::option::Option<::std::cmp::Ordering> { + match *other { + Id(ref __self_1_0) => + match *self { + Id(ref __self_0_0) => + match ::std::cmp::PartialOrd::partial_cmp(&(*__self_0_0), + &(*__self_1_0)) + { + ::std::option::Option::Some(::std::cmp::Ordering::Equal) + => + ::std::option::Option::Some(::std::cmp::Ordering::Equal), + cmp => cmp, + }, + }, + } + } + #[inline] + fn lt(&self, other: &Id) -> bool { + match *other { + Id(ref __self_1_0) => + match *self { + Id(ref __self_0_0) => (*__self_0_0) < (*__self_1_0), + }, + } + } + #[inline] + fn le(&self, other: &Id) -> bool { + match *other { + Id(ref __self_1_0) => + match *self { + Id(ref __self_0_0) => (*__self_0_0) <= (*__self_1_0), + }, + } + } + #[inline] + fn gt(&self, other: &Id) -> bool { + match *other { + Id(ref __self_1_0) => + match *self { + Id(ref __self_0_0) => (*__self_0_0) > (*__self_1_0), + }, + } + } + #[inline] + fn ge(&self, other: &Id) -> bool { + match *other { + Id(ref __self_1_0) => + match *self { + Id(ref __self_0_0) => (*__self_0_0) >= (*__self_1_0), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Ord for Id { + #[inline] + fn cmp(&self, other: &Id) -> ::std::cmp::Ordering { + match *other { + Id(ref __self_1_0) => + match *self { + Id(ref __self_0_0) => + match ::std::cmp::Ord::cmp(&(*__self_0_0), + &(*__self_1_0)) { + ::std::cmp::Ordering::Equal => + ::std::cmp::Ordering::Equal, + cmp => cmp, + }, + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::hash::Hash for Id { + fn hash<__H: ::std::hash::Hasher>(&self, state: &mut __H) -> () { + match *self { + Id(ref __self_0_0) => { + ::std::hash::Hash::hash(&(*__self_0_0), state) + } + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for Id { + #[inline] + fn clone(&self) -> Id { + { let _: ::std::clone::AssertParamIsClone; *self } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::marker::Copy for Id { } + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_SERIALIZE_FOR_Id: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl _serde::Serialize for Id { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + _serde::Serializer::serialize_newtype_struct(__serializer, + "Id", + &self.0) + } + } + }; + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_Id: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for Id { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> + { + type + Value + = + Id; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "tuple struct Id") + } + #[inline] + fn visit_newtype_struct<__E>(self, __e: __E) + -> + _serde::export::Result where + __E: _serde::Deserializer<'de> { + let __field0: u32 = + match ::deserialize(__e) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + _serde::export::Ok(Id(__field0)) + } + #[inline] + fn visit_seq<__A>(self, mut __seq: __A) + -> + _serde::export::Result where + __A: _serde::de::SeqAccess<'de> { + let __field0 = + match match _serde::de::SeqAccess::next_element::(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(0usize, + &"tuple struct Id with 1 element")); + } + }; + _serde::export::Ok(Id(__field0)) + } + } + _serde::Deserializer::deserialize_newtype_struct(__deserializer, + "Id", + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for Id { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + Id(ref __self_0_0) => { + let mut debug_trait_builder = f.debug_tuple("Id"); + let _ = debug_trait_builder.field(&&(*__self_0_0)); + debug_trait_builder.finish() + } + } + } + } + impl From for u32 { + fn from(x: Id) -> Self { x.0 } + } + impl From for Id { + fn from(x: u32) -> Self { Id(x) } + } + impl Id { + /// Convert this Id into its inner representation. + pub fn into_inner(self) -> u32 { self.0 } + } + impl Slicable for Id { + fn decode(input: &mut I) -> Option { + u32::decode(input).map(Id) + } + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } + } + /// Identifier for a chain, either one of a number of parachains or the relay chain. + #[rustc_copy_clone_marker] + pub enum Chain { + + /// The relay chain. + Relay, + + /// A parachain of the given index. + Parachain(Id), + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::marker::Copy for Chain { } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for Chain { + #[inline] + fn clone(&self) -> Chain { + { let _: ::std::clone::AssertParamIsClone; *self } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for Chain { + #[inline] + fn eq(&self, other: &Chain) -> bool { + { + let __self_vi = + unsafe { + ::std::intrinsics::discriminant_value(&*self) + } as isize; + let __arg_1_vi = + unsafe { + ::std::intrinsics::discriminant_value(&*other) + } as isize; + if true && __self_vi == __arg_1_vi { + match (&*self, &*other) { + (&Chain::Parachain(ref __self_0), + &Chain::Parachain(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + _ => true, + } + } else { false } + } + } + #[inline] + fn ne(&self, other: &Chain) -> bool { + { + let __self_vi = + unsafe { + ::std::intrinsics::discriminant_value(&*self) + } as isize; + let __arg_1_vi = + unsafe { + ::std::intrinsics::discriminant_value(&*other) + } as isize; + if true && __self_vi == __arg_1_vi { + match (&*self, &*other) { + (&Chain::Parachain(ref __self_0), + &Chain::Parachain(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + _ => false, + } + } else { true } + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for Chain { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match (&*self,) { + (&Chain::Relay,) => { + let mut debug_trait_builder = f.debug_tuple("Relay"); + debug_trait_builder.finish() + } + (&Chain::Parachain(ref __self_0),) => { + let mut debug_trait_builder = + f.debug_tuple("Parachain"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + } + } + } + impl Slicable for Chain { + fn decode(input: &mut I) -> Option { + let disc = input.read_byte()?; + match disc { + 0 => Some(Chain::Relay), + 1 => Some(Chain::Parachain(Slicable::decode(input)?)), + _ => None, + } + } + fn encode(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Chain::Relay => { v.push(0); } + Chain::Parachain(id) => { + v.push(1u8); + id.using_encoded(|s| v.extend(s)); + } + } + v + } + fn using_encoded R>(&self, f: F) -> R { + f(&self.encode().as_slice()) + } + } + /// The duty roster specifying what jobs each validator must do. + pub struct DutyRoster { + /// Lookup from validator index to chain on which that validator has a duty to validate. + pub validator_duty: Vec, + /// Lookup from validator index to chain on which that validator has a duty to guarantee + /// availability. + pub guarantor_duty: Vec, + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for DutyRoster { + #[inline] + fn clone(&self) -> DutyRoster { + match *self { + DutyRoster { + validator_duty: ref __self_0_0, + guarantor_duty: ref __self_0_1 } => + DutyRoster{validator_duty: + ::std::clone::Clone::clone(&(*__self_0_0)), + guarantor_duty: + ::std::clone::Clone::clone(&(*__self_0_1)),}, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for DutyRoster { + #[inline] + fn eq(&self, other: &DutyRoster) -> bool { + match *other { + DutyRoster { + validator_duty: ref __self_1_0, + guarantor_duty: ref __self_1_1 } => + match *self { + DutyRoster { + validator_duty: ref __self_0_0, + guarantor_duty: ref __self_0_1 } => + (*__self_0_0) == (*__self_1_0) && + (*__self_0_1) == (*__self_1_1), + }, + } + } + #[inline] + fn ne(&self, other: &DutyRoster) -> bool { + match *other { + DutyRoster { + validator_duty: ref __self_1_0, + guarantor_duty: ref __self_1_1 } => + match *self { + DutyRoster { + validator_duty: ref __self_0_0, + guarantor_duty: ref __self_0_1 } => + (*__self_0_0) != (*__self_1_0) || + (*__self_0_1) != (*__self_1_1), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::default::Default for DutyRoster { + #[inline] + fn default() -> DutyRoster { + DutyRoster{validator_duty: ::std::default::Default::default(), + guarantor_duty: + ::std::default::Default::default(),} + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for DutyRoster { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + DutyRoster { + validator_duty: ref __self_0_0, + guarantor_duty: ref __self_0_1 } => { + let mut debug_trait_builder = + f.debug_struct("DutyRoster"); + let _ = + debug_trait_builder.field("validator_duty", + &&(*__self_0_0)); + let _ = + debug_trait_builder.field("guarantor_duty", + &&(*__self_0_1)); + debug_trait_builder.finish() + } + } + } + } + impl Slicable for DutyRoster { + fn decode(input: &mut I) -> Option { + Some(DutyRoster{validator_duty: Slicable::decode(input)?, + guarantor_duty: Slicable::decode(input)?,}) + } + fn encode(&self) -> Vec { + let mut v = Vec::new(); + v.extend(self.validator_duty.encode()); + v.extend(self.guarantor_duty.encode()); + v + } + fn using_encoded R>(&self, f: F) -> R { + f(&self.encode().as_slice()) + } + } + /// Extrinsic data for a parachain. + #[serde(rename_all = "camelCase")] + #[serde(deny_unknown_fields)] + #[structural_match] + pub struct Extrinsic; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for Extrinsic { + #[inline] + fn eq(&self, other: &Extrinsic) -> bool { + match *other { + Extrinsic => match *self { Extrinsic => true, }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for Extrinsic { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { { } } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for Extrinsic { + #[inline] + fn clone(&self) -> Extrinsic { + match *self { Extrinsic => Extrinsic, } + } + } + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_SERIALIZE_FOR_Extrinsic: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl _serde::Serialize for Extrinsic { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + _serde::Serializer::serialize_unit_struct(__serializer, + "Extrinsic") + } + } + }; + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_Extrinsic: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for Extrinsic { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + struct __Visitor; + impl <'de> _serde::de::Visitor<'de> for __Visitor { + type + Value + = + Extrinsic; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "unit struct Extrinsic") + } + #[inline] + fn visit_unit<__E>(self) + -> _serde::export::Result where + __E: _serde::de::Error { + _serde::export::Ok(Extrinsic) + } + } + _serde::Deserializer::deserialize_unit_struct(__deserializer, + "Extrinsic", + __Visitor) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for Extrinsic { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + Extrinsic => { + let mut debug_trait_builder = + f.debug_tuple("Extrinsic"); + debug_trait_builder.finish() + } + } + } + } + /// Candidate parachain block. + /// + /// https://github.com/w3f/polkadot-spec/blob/master/spec.md#candidate-para-chain-block + #[serde(rename_all = "camelCase")] + #[serde(deny_unknown_fields)] + #[structural_match] + pub struct Candidate { + /// The ID of the parachain this is a proposal for. + pub parachain_index: Id, + /// Collator's signature + pub collator_signature: runtime_primitives::Ed25519Signature, + /// Unprocessed ingress queue. + /// + /// Ordered by parachain ID and block number. + pub unprocessed_ingress: ConsolidatedIngress, + /// Block data + pub block: BlockData, + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for Candidate { + #[inline] + fn eq(&self, other: &Candidate) -> bool { + match *other { + Candidate { + parachain_index: ref __self_1_0, + collator_signature: ref __self_1_1, + unprocessed_ingress: ref __self_1_2, + block: ref __self_1_3 } => + match *self { + Candidate { + parachain_index: ref __self_0_0, + collator_signature: ref __self_0_1, + unprocessed_ingress: ref __self_0_2, + block: ref __self_0_3 } => + (*__self_0_0) == (*__self_1_0) && + (*__self_0_1) == (*__self_1_1) && + (*__self_0_2) == (*__self_1_2) && + (*__self_0_3) == (*__self_1_3), + }, + } + } + #[inline] + fn ne(&self, other: &Candidate) -> bool { + match *other { + Candidate { + parachain_index: ref __self_1_0, + collator_signature: ref __self_1_1, + unprocessed_ingress: ref __self_1_2, + block: ref __self_1_3 } => + match *self { + Candidate { + parachain_index: ref __self_0_0, + collator_signature: ref __self_0_1, + unprocessed_ingress: ref __self_0_2, + block: ref __self_0_3 } => + (*__self_0_0) != (*__self_1_0) || + (*__self_0_1) != (*__self_1_1) || + (*__self_0_2) != (*__self_1_2) || + (*__self_0_3) != (*__self_1_3), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for Candidate { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { + let _: ::std::cmp::AssertParamIsEq; + let _: + ::std::cmp::AssertParamIsEq; + let _: ::std::cmp::AssertParamIsEq; + let _: ::std::cmp::AssertParamIsEq; + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for Candidate { + #[inline] + fn clone(&self) -> Candidate { + match *self { + Candidate { + parachain_index: ref __self_0_0, + collator_signature: ref __self_0_1, + unprocessed_ingress: ref __self_0_2, + block: ref __self_0_3 } => + Candidate{parachain_index: + ::std::clone::Clone::clone(&(*__self_0_0)), + collator_signature: + ::std::clone::Clone::clone(&(*__self_0_1)), + unprocessed_ingress: + ::std::clone::Clone::clone(&(*__self_0_2)), + block: + ::std::clone::Clone::clone(&(*__self_0_3)),}, + } + } + } + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_SERIALIZE_FOR_Candidate: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl _serde::Serialize for Candidate { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + let mut __serde_state = + match _serde::Serializer::serialize_struct(__serializer, + "Candidate", + 0 + 1 + + 1 + + 1 + + 1) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, + "parachainIndex", + &self.parachain_index) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, + "collatorSignature", + &self.collator_signature) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, + "unprocessedIngress", + &self.unprocessed_ingress) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, + "block", + &self.block) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + _serde::ser::SerializeStruct::end(__serde_state) + } + } + }; + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_Candidate: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for Candidate { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + #[allow(non_camel_case_types)] + enum __Field { + __field0, + __field1, + __field2, + __field3, + } + struct __FieldVisitor; + impl <'de> _serde::de::Visitor<'de> for __FieldVisitor + { + type + Value + = + __Field; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "field identifier") + } + fn visit_u64<__E>(self, __value: u64) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + 0u64 => + _serde::export::Ok(__Field::__field0), + 1u64 => + _serde::export::Ok(__Field::__field1), + 2u64 => + _serde::export::Ok(__Field::__field2), + 3u64 => + _serde::export::Ok(__Field::__field3), + _ => + _serde::export::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value), + &"field index 0 <= i < 4")), + } + } + fn visit_str<__E>(self, __value: &str) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + "parachainIndex" => + _serde::export::Ok(__Field::__field0), + "collatorSignature" => + _serde::export::Ok(__Field::__field1), + "unprocessedIngress" => + _serde::export::Ok(__Field::__field2), + "block" => + _serde::export::Ok(__Field::__field3), + _ => { + _serde::export::Err(_serde::de::Error::unknown_field(__value, + FIELDS)) + } + } + } + fn visit_bytes<__E>(self, __value: &[u8]) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + b"parachainIndex" => + _serde::export::Ok(__Field::__field0), + b"collatorSignature" => + _serde::export::Ok(__Field::__field1), + b"unprocessedIngress" => + _serde::export::Ok(__Field::__field2), + b"block" => + _serde::export::Ok(__Field::__field3), + _ => { + let __value = + &_serde::export::from_utf8_lossy(__value); + _serde::export::Err(_serde::de::Error::unknown_field(__value, + FIELDS)) + } + } + } + } + impl <'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + _serde::Deserializer::deserialize_identifier(__deserializer, + __FieldVisitor) + } + } + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> + { + type + Value + = + Candidate; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "struct Candidate") + } + #[inline] + fn visit_seq<__A>(self, mut __seq: __A) + -> + _serde::export::Result where + __A: _serde::de::SeqAccess<'de> { + let __field0 = + match match _serde::de::SeqAccess::next_element::(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(0usize, + &"struct Candidate with 4 elements")); + } + }; + let __field1 = + match match _serde::de::SeqAccess::next_element::(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(1usize, + &"struct Candidate with 4 elements")); + } + }; + let __field2 = + match match _serde::de::SeqAccess::next_element::(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(2usize, + &"struct Candidate with 4 elements")); + } + }; + let __field3 = + match match _serde::de::SeqAccess::next_element::(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(3usize, + &"struct Candidate with 4 elements")); + } + }; + _serde::export::Ok(Candidate{parachain_index: + __field0, + collator_signature: + __field1, + unprocessed_ingress: + __field2, + block: + __field3,}) + } + #[inline] + fn visit_map<__A>(self, mut __map: __A) + -> + _serde::export::Result where + __A: _serde::de::MapAccess<'de> { + let mut __field0: _serde::export::Option = + _serde::export::None; + let mut __field1: + _serde::export::Option = + _serde::export::None; + let mut __field2: + _serde::export::Option = + _serde::export::None; + let mut __field3: + _serde::export::Option = + _serde::export::None; + while let _serde::export::Some(__key) = + match _serde::de::MapAccess::next_key::<__Field>(&mut __map) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + match __key { + __Field::__field0 => { + if _serde::export::Option::is_some(&__field0) + { + return _serde::export::Err(<__A::Error + as + _serde::de::Error>::duplicate_field("parachainIndex")); + } + __field0 = + _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => { + return _serde::export::Err(__err); + } + }); + } + __Field::__field1 => { + if _serde::export::Option::is_some(&__field1) + { + return _serde::export::Err(<__A::Error + as + _serde::de::Error>::duplicate_field("collatorSignature")); + } + __field1 = + _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => { + return _serde::export::Err(__err); + } + }); + } + __Field::__field2 => { + if _serde::export::Option::is_some(&__field2) + { + return _serde::export::Err(<__A::Error + as + _serde::de::Error>::duplicate_field("unprocessedIngress")); + } + __field2 = + _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => { + return _serde::export::Err(__err); + } + }); + } + __Field::__field3 => { + if _serde::export::Option::is_some(&__field3) + { + return _serde::export::Err(<__A::Error + as + _serde::de::Error>::duplicate_field("block")); + } + __field3 = + _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => { + return _serde::export::Err(__err); + } + }); + } + } + } + let __field0 = + match __field0 { + _serde::export::Some(__field0) => + __field0, + _serde::export::None => + match _serde::private::de::missing_field("parachainIndex") + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }, + }; + let __field1 = + match __field1 { + _serde::export::Some(__field1) => + __field1, + _serde::export::None => + match _serde::private::de::missing_field("collatorSignature") + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }, + }; + let __field2 = + match __field2 { + _serde::export::Some(__field2) => + __field2, + _serde::export::None => + match _serde::private::de::missing_field("unprocessedIngress") + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }, + }; + let __field3 = + match __field3 { + _serde::export::Some(__field3) => + __field3, + _serde::export::None => + match _serde::private::de::missing_field("block") + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }, + }; + _serde::export::Ok(Candidate{parachain_index: + __field0, + collator_signature: + __field1, + unprocessed_ingress: + __field2, + block: + __field3,}) + } + } + const FIELDS: &'static [&'static str] = + &["parachainIndex", "collatorSignature", + "unprocessedIngress", "block"]; + _serde::Deserializer::deserialize_struct(__deserializer, + "Candidate", + FIELDS, + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for Candidate { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + Candidate { + parachain_index: ref __self_0_0, + collator_signature: ref __self_0_1, + unprocessed_ingress: ref __self_0_2, + block: ref __self_0_3 } => { + let mut debug_trait_builder = + f.debug_struct("Candidate"); + let _ = + debug_trait_builder.field("parachain_index", + &&(*__self_0_0)); + let _ = + debug_trait_builder.field("collator_signature", + &&(*__self_0_1)); + let _ = + debug_trait_builder.field("unprocessed_ingress", + &&(*__self_0_2)); + let _ = + debug_trait_builder.field("block", + &&(*__self_0_3)); + debug_trait_builder.finish() + } + } + } + } + /// Candidate receipt type. + #[serde(rename_all = "camelCase")] + #[serde(deny_unknown_fields)] + #[structural_match] + pub struct CandidateReceipt { + /// The ID of the parachain this is a candidate for. + pub parachain_index: Id, + /// The collator's relay-chain account ID + pub collator: super::AccountId, + /// The head-data + pub head_data: HeadData, + /// Balance uploads to the relay chain. + pub balance_uploads: Vec<(super::AccountId, u64)>, + /// Egress queue roots. + pub egress_queue_roots: Vec<(Id, Hash)>, + /// Fees paid from the chain to the relay chain validators + pub fees: u64, + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for CandidateReceipt { + #[inline] + fn eq(&self, other: &CandidateReceipt) -> bool { + match *other { + CandidateReceipt { + parachain_index: ref __self_1_0, + collator: ref __self_1_1, + head_data: ref __self_1_2, + balance_uploads: ref __self_1_3, + egress_queue_roots: ref __self_1_4, + fees: ref __self_1_5 } => + match *self { + CandidateReceipt { + parachain_index: ref __self_0_0, + collator: ref __self_0_1, + head_data: ref __self_0_2, + balance_uploads: ref __self_0_3, + egress_queue_roots: ref __self_0_4, + fees: ref __self_0_5 } => + (*__self_0_0) == (*__self_1_0) && + (*__self_0_1) == (*__self_1_1) && + (*__self_0_2) == (*__self_1_2) && + (*__self_0_3) == (*__self_1_3) && + (*__self_0_4) == (*__self_1_4) && + (*__self_0_5) == (*__self_1_5), + }, + } + } + #[inline] + fn ne(&self, other: &CandidateReceipt) -> bool { + match *other { + CandidateReceipt { + parachain_index: ref __self_1_0, + collator: ref __self_1_1, + head_data: ref __self_1_2, + balance_uploads: ref __self_1_3, + egress_queue_roots: ref __self_1_4, + fees: ref __self_1_5 } => + match *self { + CandidateReceipt { + parachain_index: ref __self_0_0, + collator: ref __self_0_1, + head_data: ref __self_0_2, + balance_uploads: ref __self_0_3, + egress_queue_roots: ref __self_0_4, + fees: ref __self_0_5 } => + (*__self_0_0) != (*__self_1_0) || + (*__self_0_1) != (*__self_1_1) || + (*__self_0_2) != (*__self_1_2) || + (*__self_0_3) != (*__self_1_3) || + (*__self_0_4) != (*__self_1_4) || + (*__self_0_5) != (*__self_1_5), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for CandidateReceipt { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { + let _: ::std::cmp::AssertParamIsEq; + let _: ::std::cmp::AssertParamIsEq; + let _: ::std::cmp::AssertParamIsEq; + let _: + ::std::cmp::AssertParamIsEq>; + let _: ::std::cmp::AssertParamIsEq>; + let _: ::std::cmp::AssertParamIsEq; + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for CandidateReceipt { + #[inline] + fn clone(&self) -> CandidateReceipt { + match *self { + CandidateReceipt { + parachain_index: ref __self_0_0, + collator: ref __self_0_1, + head_data: ref __self_0_2, + balance_uploads: ref __self_0_3, + egress_queue_roots: ref __self_0_4, + fees: ref __self_0_5 } => + CandidateReceipt{parachain_index: + ::std::clone::Clone::clone(&(*__self_0_0)), + collator: + ::std::clone::Clone::clone(&(*__self_0_1)), + head_data: + ::std::clone::Clone::clone(&(*__self_0_2)), + balance_uploads: + ::std::clone::Clone::clone(&(*__self_0_3)), + egress_queue_roots: + ::std::clone::Clone::clone(&(*__self_0_4)), + fees: + ::std::clone::Clone::clone(&(*__self_0_5)),}, + } + } + } + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_SERIALIZE_FOR_CandidateReceipt: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl _serde::Serialize for CandidateReceipt { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + let mut __serde_state = + match _serde::Serializer::serialize_struct(__serializer, + "CandidateReceipt", + 0 + 1 + + 1 + + 1 + + 1 + + 1 + + 1) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, + "parachainIndex", + &self.parachain_index) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, + "collator", + &self.collator) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, + "headData", + &self.head_data) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, + "balanceUploads", + &self.balance_uploads) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, + "egressQueueRoots", + &self.egress_queue_roots) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, + "fees", + &self.fees) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + _serde::ser::SerializeStruct::end(__serde_state) + } + } + }; + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_CandidateReceipt: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for CandidateReceipt { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + #[allow(non_camel_case_types)] + enum __Field { + __field0, + __field1, + __field2, + __field3, + __field4, + __field5, + } + struct __FieldVisitor; + impl <'de> _serde::de::Visitor<'de> for __FieldVisitor + { + type + Value + = + __Field; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "field identifier") + } + fn visit_u64<__E>(self, __value: u64) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + 0u64 => + _serde::export::Ok(__Field::__field0), + 1u64 => + _serde::export::Ok(__Field::__field1), + 2u64 => + _serde::export::Ok(__Field::__field2), + 3u64 => + _serde::export::Ok(__Field::__field3), + 4u64 => + _serde::export::Ok(__Field::__field4), + 5u64 => + _serde::export::Ok(__Field::__field5), + _ => + _serde::export::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value), + &"field index 0 <= i < 6")), + } + } + fn visit_str<__E>(self, __value: &str) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + "parachainIndex" => + _serde::export::Ok(__Field::__field0), + "collator" => + _serde::export::Ok(__Field::__field1), + "headData" => + _serde::export::Ok(__Field::__field2), + "balanceUploads" => + _serde::export::Ok(__Field::__field3), + "egressQueueRoots" => + _serde::export::Ok(__Field::__field4), + "fees" => + _serde::export::Ok(__Field::__field5), + _ => { + _serde::export::Err(_serde::de::Error::unknown_field(__value, + FIELDS)) + } + } + } + fn visit_bytes<__E>(self, __value: &[u8]) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + b"parachainIndex" => + _serde::export::Ok(__Field::__field0), + b"collator" => + _serde::export::Ok(__Field::__field1), + b"headData" => + _serde::export::Ok(__Field::__field2), + b"balanceUploads" => + _serde::export::Ok(__Field::__field3), + b"egressQueueRoots" => + _serde::export::Ok(__Field::__field4), + b"fees" => + _serde::export::Ok(__Field::__field5), + _ => { + let __value = + &_serde::export::from_utf8_lossy(__value); + _serde::export::Err(_serde::de::Error::unknown_field(__value, + FIELDS)) + } + } + } + } + impl <'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + _serde::Deserializer::deserialize_identifier(__deserializer, + __FieldVisitor) + } + } + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> + { + type + Value + = + CandidateReceipt; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "struct CandidateReceipt") + } + #[inline] + fn visit_seq<__A>(self, mut __seq: __A) + -> + _serde::export::Result where + __A: _serde::de::SeqAccess<'de> { + let __field0 = + match match _serde::de::SeqAccess::next_element::(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(0usize, + &"struct CandidateReceipt with 6 elements")); + } + }; + let __field1 = + match match _serde::de::SeqAccess::next_element::(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(1usize, + &"struct CandidateReceipt with 6 elements")); + } + }; + let __field2 = + match match _serde::de::SeqAccess::next_element::(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(2usize, + &"struct CandidateReceipt with 6 elements")); + } + }; + let __field3 = + match match _serde::de::SeqAccess::next_element::>(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(3usize, + &"struct CandidateReceipt with 6 elements")); + } + }; + let __field4 = + match match _serde::de::SeqAccess::next_element::>(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(4usize, + &"struct CandidateReceipt with 6 elements")); + } + }; + let __field5 = + match match _serde::de::SeqAccess::next_element::(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(5usize, + &"struct CandidateReceipt with 6 elements")); + } + }; + _serde::export::Ok(CandidateReceipt{parachain_index: + __field0, + collator: + __field1, + head_data: + __field2, + balance_uploads: + __field3, + egress_queue_roots: + __field4, + fees: + __field5,}) + } + #[inline] + fn visit_map<__A>(self, mut __map: __A) + -> + _serde::export::Result where + __A: _serde::de::MapAccess<'de> { + let mut __field0: _serde::export::Option = + _serde::export::None; + let mut __field1: + _serde::export::Option = + _serde::export::None; + let mut __field2: + _serde::export::Option = + _serde::export::None; + let mut __field3: + _serde::export::Option> = + _serde::export::None; + let mut __field4: + _serde::export::Option> = + _serde::export::None; + let mut __field5: + _serde::export::Option = + _serde::export::None; + while let _serde::export::Some(__key) = + match _serde::de::MapAccess::next_key::<__Field>(&mut __map) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + match __key { + __Field::__field0 => { + if _serde::export::Option::is_some(&__field0) + { + return _serde::export::Err(<__A::Error + as + _serde::de::Error>::duplicate_field("parachainIndex")); + } + __field0 = + _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => { + return _serde::export::Err(__err); + } + }); + } + __Field::__field1 => { + if _serde::export::Option::is_some(&__field1) + { + return _serde::export::Err(<__A::Error + as + _serde::de::Error>::duplicate_field("collator")); + } + __field1 = + _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => { + return _serde::export::Err(__err); + } + }); + } + __Field::__field2 => { + if _serde::export::Option::is_some(&__field2) + { + return _serde::export::Err(<__A::Error + as + _serde::de::Error>::duplicate_field("headData")); + } + __field2 = + _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => { + return _serde::export::Err(__err); + } + }); + } + __Field::__field3 => { + if _serde::export::Option::is_some(&__field3) + { + return _serde::export::Err(<__A::Error + as + _serde::de::Error>::duplicate_field("balanceUploads")); + } + __field3 = + _serde::export::Some(match _serde::de::MapAccess::next_value::>(&mut __map) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => { + return _serde::export::Err(__err); + } + }); + } + __Field::__field4 => { + if _serde::export::Option::is_some(&__field4) + { + return _serde::export::Err(<__A::Error + as + _serde::de::Error>::duplicate_field("egressQueueRoots")); + } + __field4 = + _serde::export::Some(match _serde::de::MapAccess::next_value::>(&mut __map) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => { + return _serde::export::Err(__err); + } + }); + } + __Field::__field5 => { + if _serde::export::Option::is_some(&__field5) + { + return _serde::export::Err(<__A::Error + as + _serde::de::Error>::duplicate_field("fees")); + } + __field5 = + _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => { + return _serde::export::Err(__err); + } + }); + } + } + } + let __field0 = + match __field0 { + _serde::export::Some(__field0) => + __field0, + _serde::export::None => + match _serde::private::de::missing_field("parachainIndex") + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }, + }; + let __field1 = + match __field1 { + _serde::export::Some(__field1) => + __field1, + _serde::export::None => + match _serde::private::de::missing_field("collator") + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }, + }; + let __field2 = + match __field2 { + _serde::export::Some(__field2) => + __field2, + _serde::export::None => + match _serde::private::de::missing_field("headData") + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }, + }; + let __field3 = + match __field3 { + _serde::export::Some(__field3) => + __field3, + _serde::export::None => + match _serde::private::de::missing_field("balanceUploads") + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }, + }; + let __field4 = + match __field4 { + _serde::export::Some(__field4) => + __field4, + _serde::export::None => + match _serde::private::de::missing_field("egressQueueRoots") + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }, + }; + let __field5 = + match __field5 { + _serde::export::Some(__field5) => + __field5, + _serde::export::None => + match _serde::private::de::missing_field("fees") + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }, + }; + _serde::export::Ok(CandidateReceipt{parachain_index: + __field0, + collator: + __field1, + head_data: + __field2, + balance_uploads: + __field3, + egress_queue_roots: + __field4, + fees: + __field5,}) + } + } + const FIELDS: &'static [&'static str] = + &["parachainIndex", "collator", "headData", + "balanceUploads", "egressQueueRoots", "fees"]; + _serde::Deserializer::deserialize_struct(__deserializer, + "CandidateReceipt", + FIELDS, + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for CandidateReceipt { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + CandidateReceipt { + parachain_index: ref __self_0_0, + collator: ref __self_0_1, + head_data: ref __self_0_2, + balance_uploads: ref __self_0_3, + egress_queue_roots: ref __self_0_4, + fees: ref __self_0_5 } => { + let mut debug_trait_builder = + f.debug_struct("CandidateReceipt"); + let _ = + debug_trait_builder.field("parachain_index", + &&(*__self_0_0)); + let _ = + debug_trait_builder.field("collator", + &&(*__self_0_1)); + let _ = + debug_trait_builder.field("head_data", + &&(*__self_0_2)); + let _ = + debug_trait_builder.field("balance_uploads", + &&(*__self_0_3)); + let _ = + debug_trait_builder.field("egress_queue_roots", + &&(*__self_0_4)); + let _ = + debug_trait_builder.field("fees", + &&(*__self_0_5)); + debug_trait_builder.finish() + } + } + } + } + impl Slicable for CandidateReceipt { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + self.parachain_index.using_encoded(|s| v.extend(s)); + self.collator.using_encoded(|s| v.extend(s)); + self.head_data.0.using_encoded(|s| v.extend(s)); + self.balance_uploads.using_encoded(|s| v.extend(s)); + self.egress_queue_roots.using_encoded(|s| v.extend(s)); + self.fees.using_encoded(|s| v.extend(s)); + v + } + fn decode(input: &mut I) -> Option { + Some(CandidateReceipt{parachain_index: + Slicable::decode(input)?, + collator: Slicable::decode(input)?, + head_data: + Slicable::decode(input).map(HeadData)?, + balance_uploads: + Slicable::decode(input)?, + egress_queue_roots: + Slicable::decode(input)?, + fees: Slicable::decode(input)?,}) + } + } + impl CandidateReceipt { + /// Get the blake2_256 hash + #[cfg(feature = "std")] + pub fn hash(&self) -> Hash { + use runtime_primitives::traits::Hashing; + BlakeTwo256::hash_of(self) + } + } + impl PartialOrd for CandidateReceipt { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } + } + impl Ord for CandidateReceipt { + fn cmp(&self, other: &Self) -> Ordering { + self.parachain_index.cmp(&other.parachain_index).then_with(|| + self.head_data.cmp(&other.head_data)) + } + } + /// Parachain ingress queue message. + #[structural_match] + pub struct Message( + #[serde(with = "bytes")] + pub Vec); + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for Message { + #[inline] + fn eq(&self, other: &Message) -> bool { + match *other { + Message(ref __self_1_0) => + match *self { + Message(ref __self_0_0) => + (*__self_0_0) == (*__self_1_0), + }, + } + } + #[inline] + fn ne(&self, other: &Message) -> bool { + match *other { + Message(ref __self_1_0) => + match *self { + Message(ref __self_0_0) => + (*__self_0_0) != (*__self_1_0), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for Message { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { let _: ::std::cmp::AssertParamIsEq>; } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for Message { + #[inline] + fn clone(&self) -> Message { + match *self { + Message(ref __self_0_0) => + Message(::std::clone::Clone::clone(&(*__self_0_0))), + } + } + } + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_SERIALIZE_FOR_Message: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl _serde::Serialize for Message { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + _serde::Serializer::serialize_newtype_struct(__serializer, + "Message", + { + struct __SerializeWith<'__a> { + values: (&'__a Vec,), + phantom: _serde::export::PhantomData, + } + impl <'__a> + _serde::Serialize + for + __SerializeWith<'__a> + { + fn serialize<__S>(&self, + __s: + __S) + -> + _serde::export::Result<__S::Ok, + __S::Error> + where + __S: _serde::Serializer { + bytes::serialize(self.values.0, + __s) + } + } + &__SerializeWith{values: + (&self.0,), + phantom: + _serde::export::PhantomData::,} + }) + } + } + }; + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_Message: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for Message { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> + { + type + Value + = + Message; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "tuple struct Message") + } + #[inline] + fn visit_newtype_struct<__E>(self, __e: __E) + -> + _serde::export::Result where + __E: _serde::Deserializer<'de> { + let __field0: Vec = + match bytes::deserialize(__e) { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + _serde::export::Ok(Message(__field0)) + } + #[inline] + fn visit_seq<__A>(self, mut __seq: __A) + -> + _serde::export::Result where + __A: _serde::de::SeqAccess<'de> { + let __field0 = + match { + struct __DeserializeWith<'de> { + value: Vec, + phantom: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> + _serde::Deserialize<'de> for + __DeserializeWith<'de> { + fn deserialize<__D>(__deserializer: + __D) + -> + _serde::export::Result + where + __D: _serde::Deserializer<'de> { + _serde::export::Ok(__DeserializeWith{value: + match bytes::deserialize(__deserializer) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + phantom: + _serde::export::PhantomData, + lifetime: + _serde::export::PhantomData,}) + } + } + _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + |__wrap| + __wrap.value) + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(0usize, + &"tuple struct Message with 1 element")); + } + }; + _serde::export::Ok(Message(__field0)) + } + } + _serde::Deserializer::deserialize_newtype_struct(__deserializer, + "Message", + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for Message { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + Message(ref __self_0_0) => { + let mut debug_trait_builder = + f.debug_tuple("Message"); + let _ = debug_trait_builder.field(&&(*__self_0_0)); + debug_trait_builder.finish() + } + } + } + } + /// Consolidated ingress queue data. + /// + /// This is just an ordered vector of other parachains' egress queues, + /// obtained according to the routing rules. + #[structural_match] + pub struct ConsolidatedIngress(pub Vec<(Id, Vec)>); + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::default::Default for ConsolidatedIngress { + #[inline] + fn default() -> ConsolidatedIngress { + ConsolidatedIngress(::std::default::Default::default()) + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for ConsolidatedIngress { + #[inline] + fn eq(&self, other: &ConsolidatedIngress) -> bool { + match *other { + ConsolidatedIngress(ref __self_1_0) => + match *self { + ConsolidatedIngress(ref __self_0_0) => + (*__self_0_0) == (*__self_1_0), + }, + } + } + #[inline] + fn ne(&self, other: &ConsolidatedIngress) -> bool { + match *other { + ConsolidatedIngress(ref __self_1_0) => + match *self { + ConsolidatedIngress(ref __self_0_0) => + (*__self_0_0) != (*__self_1_0), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for ConsolidatedIngress { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { + let _: + ::std::cmp::AssertParamIsEq)>>; + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for ConsolidatedIngress { + #[inline] + fn clone(&self) -> ConsolidatedIngress { + match *self { + ConsolidatedIngress(ref __self_0_0) => + ConsolidatedIngress(::std::clone::Clone::clone(&(*__self_0_0))), + } + } + } + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_SERIALIZE_FOR_ConsolidatedIngress: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl _serde::Serialize for ConsolidatedIngress { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + _serde::Serializer::serialize_newtype_struct(__serializer, + "ConsolidatedIngress", + &self.0) + } + } + }; + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_ConsolidatedIngress: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for ConsolidatedIngress { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> + { + type + Value + = + ConsolidatedIngress; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "tuple struct ConsolidatedIngress") + } + #[inline] + fn visit_newtype_struct<__E>(self, __e: __E) + -> + _serde::export::Result where + __E: _serde::Deserializer<'de> { + let __field0: Vec<(Id, Vec)> = + match )> as + _serde::Deserialize>::deserialize(__e) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + _serde::export::Ok(ConsolidatedIngress(__field0)) + } + #[inline] + fn visit_seq<__A>(self, mut __seq: __A) + -> + _serde::export::Result where + __A: _serde::de::SeqAccess<'de> { + let __field0 = + match match _serde::de::SeqAccess::next_element::)>>(&mut __seq) + { + _serde::export::Ok(__val) => + __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(0usize, + &"tuple struct ConsolidatedIngress with 1 element")); + } + }; + _serde::export::Ok(ConsolidatedIngress(__field0)) + } + } + _serde::Deserializer::deserialize_newtype_struct(__deserializer, + "ConsolidatedIngress", + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for ConsolidatedIngress { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + ConsolidatedIngress(ref __self_0_0) => { + let mut debug_trait_builder = + f.debug_tuple("ConsolidatedIngress"); + let _ = debug_trait_builder.field(&&(*__self_0_0)); + debug_trait_builder.finish() + } + } + } + } + /// Parachain block data. + /// + /// contains everything required to validate para-block, may contain block and witness data + #[structural_match] + pub struct BlockData( + #[serde(with = "bytes")] + pub Vec); + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for BlockData { + #[inline] + fn eq(&self, other: &BlockData) -> bool { + match *other { + BlockData(ref __self_1_0) => + match *self { + BlockData(ref __self_0_0) => + (*__self_0_0) == (*__self_1_0), + }, + } + } + #[inline] + fn ne(&self, other: &BlockData) -> bool { + match *other { + BlockData(ref __self_1_0) => + match *self { + BlockData(ref __self_0_0) => + (*__self_0_0) != (*__self_1_0), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for BlockData { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { let _: ::std::cmp::AssertParamIsEq>; } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for BlockData { + #[inline] + fn clone(&self) -> BlockData { + match *self { + BlockData(ref __self_0_0) => + BlockData(::std::clone::Clone::clone(&(*__self_0_0))), + } + } + } + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_SERIALIZE_FOR_BlockData: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl _serde::Serialize for BlockData { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + _serde::Serializer::serialize_newtype_struct(__serializer, + "BlockData", + { + struct __SerializeWith<'__a> { + values: (&'__a Vec,), + phantom: _serde::export::PhantomData, + } + impl <'__a> + _serde::Serialize + for + __SerializeWith<'__a> + { + fn serialize<__S>(&self, + __s: + __S) + -> + _serde::export::Result<__S::Ok, + __S::Error> + where + __S: _serde::Serializer { + bytes::serialize(self.values.0, + __s) + } + } + &__SerializeWith{values: + (&self.0,), + phantom: + _serde::export::PhantomData::,} + }) + } + } + }; + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_BlockData: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for BlockData { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> + { + type + Value + = + BlockData; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "tuple struct BlockData") + } + #[inline] + fn visit_newtype_struct<__E>(self, __e: __E) + -> + _serde::export::Result where + __E: _serde::Deserializer<'de> { + let __field0: Vec = + match bytes::deserialize(__e) { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + _serde::export::Ok(BlockData(__field0)) + } + #[inline] + fn visit_seq<__A>(self, mut __seq: __A) + -> + _serde::export::Result where + __A: _serde::de::SeqAccess<'de> { + let __field0 = + match { + struct __DeserializeWith<'de> { + value: Vec, + phantom: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> + _serde::Deserialize<'de> for + __DeserializeWith<'de> { + fn deserialize<__D>(__deserializer: + __D) + -> + _serde::export::Result + where + __D: _serde::Deserializer<'de> { + _serde::export::Ok(__DeserializeWith{value: + match bytes::deserialize(__deserializer) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + phantom: + _serde::export::PhantomData, + lifetime: + _serde::export::PhantomData,}) + } + } + _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + |__wrap| + __wrap.value) + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(0usize, + &"tuple struct BlockData with 1 element")); + } + }; + _serde::export::Ok(BlockData(__field0)) + } + } + _serde::Deserializer::deserialize_newtype_struct(__deserializer, + "BlockData", + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for BlockData { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + BlockData(ref __self_0_0) => { + let mut debug_trait_builder = + f.debug_tuple("BlockData"); + let _ = debug_trait_builder.field(&&(*__self_0_0)); + debug_trait_builder.finish() + } + } + } + } + /// Parachain header raw bytes wrapper type. + #[structural_match] + pub struct Header( + #[serde(with = "bytes")] + pub Vec); + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for Header { + #[inline] + fn eq(&self, other: &Header) -> bool { + match *other { + Header(ref __self_1_0) => + match *self { + Header(ref __self_0_0) => + (*__self_0_0) == (*__self_1_0), + }, + } + } + #[inline] + fn ne(&self, other: &Header) -> bool { + match *other { + Header(ref __self_1_0) => + match *self { + Header(ref __self_0_0) => + (*__self_0_0) != (*__self_1_0), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for Header { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { let _: ::std::cmp::AssertParamIsEq>; } + } + } + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_SERIALIZE_FOR_Header: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl _serde::Serialize for Header { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + _serde::Serializer::serialize_newtype_struct(__serializer, + "Header", + { + struct __SerializeWith<'__a> { + values: (&'__a Vec,), + phantom: _serde::export::PhantomData

    , + } + impl <'__a> + _serde::Serialize + for + __SerializeWith<'__a> + { + fn serialize<__S>(&self, + __s: + __S) + -> + _serde::export::Result<__S::Ok, + __S::Error> + where + __S: _serde::Serializer { + bytes::serialize(self.values.0, + __s) + } + } + &__SerializeWith{values: + (&self.0,), + phantom: + _serde::export::PhantomData::
    ,} + }) + } + } + }; + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_Header: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for Header { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + struct __Visitor<'de> { + marker: _serde::export::PhantomData
    , + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> + { + type + Value + = + Header; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "tuple struct Header") + } + #[inline] + fn visit_newtype_struct<__E>(self, __e: __E) + -> + _serde::export::Result where + __E: _serde::Deserializer<'de> { + let __field0: Vec = + match bytes::deserialize(__e) { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + _serde::export::Ok(Header(__field0)) + } + #[inline] + fn visit_seq<__A>(self, mut __seq: __A) + -> + _serde::export::Result where + __A: _serde::de::SeqAccess<'de> { + let __field0 = + match { + struct __DeserializeWith<'de> { + value: Vec, + phantom: _serde::export::PhantomData
    , + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> + _serde::Deserialize<'de> for + __DeserializeWith<'de> { + fn deserialize<__D>(__deserializer: + __D) + -> + _serde::export::Result + where + __D: _serde::Deserializer<'de> { + _serde::export::Ok(__DeserializeWith{value: + match bytes::deserialize(__deserializer) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + phantom: + _serde::export::PhantomData, + lifetime: + _serde::export::PhantomData,}) + } + } + _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + |__wrap| + __wrap.value) + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(0usize, + &"tuple struct Header with 1 element")); + } + }; + _serde::export::Ok(Header(__field0)) + } + } + _serde::Deserializer::deserialize_newtype_struct(__deserializer, + "Header", + __Visitor{marker: + _serde::export::PhantomData::
    , + lifetime: + _serde::export::PhantomData,}) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for Header { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + Header(ref __self_0_0) => { + let mut debug_trait_builder = f.debug_tuple("Header"); + let _ = debug_trait_builder.field(&&(*__self_0_0)); + debug_trait_builder.finish() + } + } + } + } + /// Parachain head data included in the chain. + #[structural_match] + pub struct HeadData( + #[serde(with = "bytes")] + pub Vec); + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for HeadData { + #[inline] + fn eq(&self, other: &HeadData) -> bool { + match *other { + HeadData(ref __self_1_0) => + match *self { + HeadData(ref __self_0_0) => + (*__self_0_0) == (*__self_1_0), + }, + } + } + #[inline] + fn ne(&self, other: &HeadData) -> bool { + match *other { + HeadData(ref __self_1_0) => + match *self { + HeadData(ref __self_0_0) => + (*__self_0_0) != (*__self_1_0), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for HeadData { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { let _: ::std::cmp::AssertParamIsEq>; } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for HeadData { + #[inline] + fn clone(&self) -> HeadData { + match *self { + HeadData(ref __self_0_0) => + HeadData(::std::clone::Clone::clone(&(*__self_0_0))), + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialOrd for HeadData { + #[inline] + fn partial_cmp(&self, other: &HeadData) + -> ::std::option::Option<::std::cmp::Ordering> { + match *other { + HeadData(ref __self_1_0) => + match *self { + HeadData(ref __self_0_0) => + match ::std::cmp::PartialOrd::partial_cmp(&(*__self_0_0), + &(*__self_1_0)) + { + ::std::option::Option::Some(::std::cmp::Ordering::Equal) + => + ::std::option::Option::Some(::std::cmp::Ordering::Equal), + cmp => cmp, + }, + }, + } + } + #[inline] + fn lt(&self, other: &HeadData) -> bool { + match *other { + HeadData(ref __self_1_0) => + match *self { + HeadData(ref __self_0_0) => + (*__self_0_0) < (*__self_1_0), + }, + } + } + #[inline] + fn le(&self, other: &HeadData) -> bool { + match *other { + HeadData(ref __self_1_0) => + match *self { + HeadData(ref __self_0_0) => + (*__self_0_0) <= (*__self_1_0), + }, + } + } + #[inline] + fn gt(&self, other: &HeadData) -> bool { + match *other { + HeadData(ref __self_1_0) => + match *self { + HeadData(ref __self_0_0) => + (*__self_0_0) > (*__self_1_0), + }, + } + } + #[inline] + fn ge(&self, other: &HeadData) -> bool { + match *other { + HeadData(ref __self_1_0) => + match *self { + HeadData(ref __self_0_0) => + (*__self_0_0) >= (*__self_1_0), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Ord for HeadData { + #[inline] + fn cmp(&self, other: &HeadData) -> ::std::cmp::Ordering { + match *other { + HeadData(ref __self_1_0) => + match *self { + HeadData(ref __self_0_0) => + match ::std::cmp::Ord::cmp(&(*__self_0_0), + &(*__self_1_0)) { + ::std::cmp::Ordering::Equal => + ::std::cmp::Ordering::Equal, + cmp => cmp, + }, + }, + } + } + } + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_SERIALIZE_FOR_HeadData: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl _serde::Serialize for HeadData { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + _serde::Serializer::serialize_newtype_struct(__serializer, + "HeadData", + { + struct __SerializeWith<'__a> { + values: (&'__a Vec,), + phantom: _serde::export::PhantomData, + } + impl <'__a> + _serde::Serialize + for + __SerializeWith<'__a> + { + fn serialize<__S>(&self, + __s: + __S) + -> + _serde::export::Result<__S::Ok, + __S::Error> + where + __S: _serde::Serializer { + bytes::serialize(self.values.0, + __s) + } + } + &__SerializeWith{values: + (&self.0,), + phantom: + _serde::export::PhantomData::,} + }) + } + } + }; + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_HeadData: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for HeadData { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> + { + type + Value + = + HeadData; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "tuple struct HeadData") + } + #[inline] + fn visit_newtype_struct<__E>(self, __e: __E) + -> + _serde::export::Result where + __E: _serde::Deserializer<'de> { + let __field0: Vec = + match bytes::deserialize(__e) { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + _serde::export::Ok(HeadData(__field0)) + } + #[inline] + fn visit_seq<__A>(self, mut __seq: __A) + -> + _serde::export::Result where + __A: _serde::de::SeqAccess<'de> { + let __field0 = + match { + struct __DeserializeWith<'de> { + value: Vec, + phantom: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> + _serde::Deserialize<'de> for + __DeserializeWith<'de> { + fn deserialize<__D>(__deserializer: + __D) + -> + _serde::export::Result + where + __D: _serde::Deserializer<'de> { + _serde::export::Ok(__DeserializeWith{value: + match bytes::deserialize(__deserializer) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + phantom: + _serde::export::PhantomData, + lifetime: + _serde::export::PhantomData,}) + } + } + _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + |__wrap| + __wrap.value) + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(0usize, + &"tuple struct HeadData with 1 element")); + } + }; + _serde::export::Ok(HeadData(__field0)) + } + } + _serde::Deserializer::deserialize_newtype_struct(__deserializer, + "HeadData", + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for HeadData { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + HeadData(ref __self_0_0) => { + let mut debug_trait_builder = + f.debug_tuple("HeadData"); + let _ = debug_trait_builder.field(&&(*__self_0_0)); + debug_trait_builder.finish() + } + } + } + } + /// Parachain validation code. + #[structural_match] + pub struct ValidationCode( + #[serde(with = "bytes")] + pub Vec); + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for ValidationCode { + #[inline] + fn eq(&self, other: &ValidationCode) -> bool { + match *other { + ValidationCode(ref __self_1_0) => + match *self { + ValidationCode(ref __self_0_0) => + (*__self_0_0) == (*__self_1_0), + }, + } + } + #[inline] + fn ne(&self, other: &ValidationCode) -> bool { + match *other { + ValidationCode(ref __self_1_0) => + match *self { + ValidationCode(ref __self_0_0) => + (*__self_0_0) != (*__self_1_0), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for ValidationCode { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { let _: ::std::cmp::AssertParamIsEq>; } + } + } + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_SERIALIZE_FOR_ValidationCode: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl _serde::Serialize for ValidationCode { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + _serde::Serializer::serialize_newtype_struct(__serializer, + "ValidationCode", + { + struct __SerializeWith<'__a> { + values: (&'__a Vec,), + phantom: _serde::export::PhantomData, + } + impl <'__a> + _serde::Serialize + for + __SerializeWith<'__a> + { + fn serialize<__S>(&self, + __s: + __S) + -> + _serde::export::Result<__S::Ok, + __S::Error> + where + __S: _serde::Serializer { + bytes::serialize(self.values.0, + __s) + } + } + &__SerializeWith{values: + (&self.0,), + phantom: + _serde::export::PhantomData::,} + }) + } + } + }; + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_ValidationCode: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for ValidationCode { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> + { + type + Value + = + ValidationCode; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "tuple struct ValidationCode") + } + #[inline] + fn visit_newtype_struct<__E>(self, __e: __E) + -> + _serde::export::Result where + __E: _serde::Deserializer<'de> { + let __field0: Vec = + match bytes::deserialize(__e) { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + _serde::export::Ok(ValidationCode(__field0)) + } + #[inline] + fn visit_seq<__A>(self, mut __seq: __A) + -> + _serde::export::Result where + __A: _serde::de::SeqAccess<'de> { + let __field0 = + match { + struct __DeserializeWith<'de> { + value: Vec, + phantom: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> + _serde::Deserialize<'de> for + __DeserializeWith<'de> { + fn deserialize<__D>(__deserializer: + __D) + -> + _serde::export::Result + where + __D: _serde::Deserializer<'de> { + _serde::export::Ok(__DeserializeWith{value: + match bytes::deserialize(__deserializer) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + phantom: + _serde::export::PhantomData, + lifetime: + _serde::export::PhantomData,}) + } + } + _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + |__wrap| + __wrap.value) + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(0usize, + &"tuple struct ValidationCode with 1 element")); + } + }; + _serde::export::Ok(ValidationCode(__field0)) + } + } + _serde::Deserializer::deserialize_newtype_struct(__deserializer, + "ValidationCode", + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for ValidationCode { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + ValidationCode(ref __self_0_0) => { + let mut debug_trait_builder = + f.debug_tuple("ValidationCode"); + let _ = debug_trait_builder.field(&&(*__self_0_0)); + debug_trait_builder.finish() + } + } + } + } + /// Activitiy bit field + #[structural_match] + pub struct Activity( + #[serde(with = "bytes")] + pub Vec); + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for Activity { + #[inline] + fn eq(&self, other: &Activity) -> bool { + match *other { + Activity(ref __self_1_0) => + match *self { + Activity(ref __self_0_0) => + (*__self_0_0) == (*__self_1_0), + }, + } + } + #[inline] + fn ne(&self, other: &Activity) -> bool { + match *other { + Activity(ref __self_1_0) => + match *self { + Activity(ref __self_0_0) => + (*__self_0_0) != (*__self_1_0), + }, + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for Activity { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { let _: ::std::cmp::AssertParamIsEq>; } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for Activity { + #[inline] + fn clone(&self) -> Activity { + match *self { + Activity(ref __self_0_0) => + Activity(::std::clone::Clone::clone(&(*__self_0_0))), + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::default::Default for Activity { + #[inline] + fn default() -> Activity { + Activity(::std::default::Default::default()) + } + } + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_SERIALIZE_FOR_Activity: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl _serde::Serialize for Activity { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + _serde::Serializer::serialize_newtype_struct(__serializer, + "Activity", + { + struct __SerializeWith<'__a> { + values: (&'__a Vec,), + phantom: _serde::export::PhantomData, + } + impl <'__a> + _serde::Serialize + for + __SerializeWith<'__a> + { + fn serialize<__S>(&self, + __s: + __S) + -> + _serde::export::Result<__S::Ok, + __S::Error> + where + __S: _serde::Serializer { + bytes::serialize(self.values.0, + __s) + } + } + &__SerializeWith{values: + (&self.0,), + phantom: + _serde::export::PhantomData::,} + }) + } + } + }; + #[allow(non_upper_case_globals, + unused_attributes, + unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_Activity: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } + } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for Activity { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> + { + type + Value + = + Activity; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "tuple struct Activity") + } + #[inline] + fn visit_newtype_struct<__E>(self, __e: __E) + -> + _serde::export::Result where + __E: _serde::Deserializer<'de> { + let __field0: Vec = + match bytes::deserialize(__e) { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + }; + _serde::export::Ok(Activity(__field0)) + } + #[inline] + fn visit_seq<__A>(self, mut __seq: __A) + -> + _serde::export::Result where + __A: _serde::de::SeqAccess<'de> { + let __field0 = + match { + struct __DeserializeWith<'de> { + value: Vec, + phantom: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> + _serde::Deserialize<'de> for + __DeserializeWith<'de> { + fn deserialize<__D>(__deserializer: + __D) + -> + _serde::export::Result + where + __D: _serde::Deserializer<'de> { + _serde::export::Ok(__DeserializeWith{value: + match bytes::deserialize(__deserializer) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + phantom: + _serde::export::PhantomData, + lifetime: + _serde::export::PhantomData,}) + } + } + _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) + { + _serde::export::Ok(__val) + => + __val, + _serde::export::Err(__err) + => + { + return _serde::export::Err(__err); + } + }, + |__wrap| + __wrap.value) + } { + _serde::export::Some(__value) => + __value, + _serde::export::None => { + return _serde::export::Err(_serde::de::Error::invalid_length(0usize, + &"tuple struct Activity with 1 element")); + } + }; + _serde::export::Ok(Activity(__field0)) + } + } + _serde::Deserializer::deserialize_newtype_struct(__deserializer, + "Activity", + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for Activity { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match *self { + Activity(ref __self_0_0) => { + let mut debug_trait_builder = + f.debug_tuple("Activity"); + let _ = debug_trait_builder.field(&&(*__self_0_0)); + debug_trait_builder.finish() + } + } + } + } + impl Slicable for Activity { + fn decode(input: &mut I) -> Option { + Vec::::decode(input).map(Activity) + } + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } + } + #[repr(u8)] + #[structural_match] + #[rustc_copy_clone_marker] + enum StatementKind { + Candidate = 1, + Valid = 2, + Invalid = 3, + Available = 4, + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for StatementKind { + #[inline] + fn clone(&self) -> StatementKind { { *self } } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::marker::Copy for StatementKind { } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for StatementKind { + #[inline] + fn eq(&self, other: &StatementKind) -> bool { + { + let __self_vi = + unsafe { + ::std::intrinsics::discriminant_value(&*self) + } as u8; + let __arg_1_vi = + unsafe { + ::std::intrinsics::discriminant_value(&*other) + } as u8; + if true && __self_vi == __arg_1_vi { + match (&*self, &*other) { _ => true, } + } else { false } + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for StatementKind { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { { } } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for StatementKind { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match (&*self,) { + (&StatementKind::Candidate,) => { + let mut debug_trait_builder = + f.debug_tuple("Candidate"); + debug_trait_builder.finish() + } + (&StatementKind::Valid,) => { + let mut debug_trait_builder = f.debug_tuple("Valid"); + debug_trait_builder.finish() + } + (&StatementKind::Invalid,) => { + let mut debug_trait_builder = + f.debug_tuple("Invalid"); + debug_trait_builder.finish() + } + (&StatementKind::Available,) => { + let mut debug_trait_builder = + f.debug_tuple("Available"); + debug_trait_builder.finish() + } + } + } + } + /// Statements which can be made about parachain candidates. + #[structural_match] + pub enum Statement { + + /// Proposal of a parachain candidate. + Candidate(CandidateReceipt), + + /// State that a parachain candidate is valid. + Valid(Hash), + + /// Vote to commit to a candidate. + Invalid(Hash), + + /// Vote to advance round after inactive primary. + Available(Hash), + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::clone::Clone for Statement { + #[inline] + fn clone(&self) -> Statement { + match (&*self,) { + (&Statement::Candidate(ref __self_0),) => + Statement::Candidate(::std::clone::Clone::clone(&(*__self_0))), + (&Statement::Valid(ref __self_0),) => + Statement::Valid(::std::clone::Clone::clone(&(*__self_0))), + (&Statement::Invalid(ref __self_0),) => + Statement::Invalid(::std::clone::Clone::clone(&(*__self_0))), + (&Statement::Available(ref __self_0),) => + Statement::Available(::std::clone::Clone::clone(&(*__self_0))), + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::PartialEq for Statement { + #[inline] + fn eq(&self, other: &Statement) -> bool { + { + let __self_vi = + unsafe { + ::std::intrinsics::discriminant_value(&*self) + } as isize; + let __arg_1_vi = + unsafe { + ::std::intrinsics::discriminant_value(&*other) + } as isize; + if true && __self_vi == __arg_1_vi { + match (&*self, &*other) { + (&Statement::Candidate(ref __self_0), + &Statement::Candidate(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&Statement::Valid(ref __self_0), + &Statement::Valid(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&Statement::Invalid(ref __self_0), + &Statement::Invalid(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&Statement::Available(ref __self_0), + &Statement::Available(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + _ => unsafe { ::std::intrinsics::unreachable() } + } + } else { false } + } + } + #[inline] + fn ne(&self, other: &Statement) -> bool { + { + let __self_vi = + unsafe { + ::std::intrinsics::discriminant_value(&*self) + } as isize; + let __arg_1_vi = + unsafe { + ::std::intrinsics::discriminant_value(&*other) + } as isize; + if true && __self_vi == __arg_1_vi { + match (&*self, &*other) { + (&Statement::Candidate(ref __self_0), + &Statement::Candidate(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&Statement::Valid(ref __self_0), + &Statement::Valid(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&Statement::Invalid(ref __self_0), + &Statement::Invalid(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&Statement::Available(ref __self_0), + &Statement::Available(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + _ => unsafe { ::std::intrinsics::unreachable() } + } + } else { true } + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::cmp::Eq for Statement { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { + let _: ::std::cmp::AssertParamIsEq; + let _: ::std::cmp::AssertParamIsEq; + let _: ::std::cmp::AssertParamIsEq; + let _: ::std::cmp::AssertParamIsEq; + } + } + } + #[automatically_derived] + #[allow(unused_qualifications)] + impl ::std::fmt::Debug for Statement { + fn fmt(&self, f: &mut ::std::fmt::Formatter) + -> ::std::fmt::Result { + match (&*self,) { + (&Statement::Candidate(ref __self_0),) => { + let mut debug_trait_builder = + f.debug_tuple("Candidate"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&Statement::Valid(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Valid"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&Statement::Invalid(ref __self_0),) => { + let mut debug_trait_builder = + f.debug_tuple("Invalid"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&Statement::Available(ref __self_0),) => { + let mut debug_trait_builder = + f.debug_tuple("Available"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + } + } + } + impl Slicable for Statement { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Statement::Candidate(ref candidate) => { + v.push(StatementKind::Candidate as u8); + candidate.using_encoded(|s| v.extend(s)); + } + Statement::Valid(ref hash) => { + v.push(StatementKind::Valid as u8); + hash.using_encoded(|s| v.extend(s)); + } + Statement::Invalid(ref hash) => { + v.push(StatementKind::Invalid as u8); + hash.using_encoded(|s| v.extend(s)); + } + Statement::Available(ref hash) => { + v.push(StatementKind::Available as u8); + hash.using_encoded(|s| v.extend(s)); + } + } + v + } + fn decode(value: &mut I) -> Option { + match value.read_byte() { + Some(x) if x == StatementKind::Candidate as u8 => { + Slicable::decode(value).map(Statement::Candidate) + } + Some(x) if x == StatementKind::Valid as u8 => { + Slicable::decode(value).map(Statement::Valid) + } + Some(x) if x == StatementKind::Invalid as u8 => { + Slicable::decode(value).map(Statement::Invalid) + } + Some(x) if x == StatementKind::Available as u8 => { + Slicable::decode(value).map(Statement::Available) + } + _ => None, + } + } + } + } +} +mod parachains { + //! Main parachains logic. For now this is just the determination of which validators do what. + use primitives; + use rstd::prelude::*; + use codec::{Slicable, Joiner}; + use runtime_support::Hashable; + use runtime_primitives::traits::{Executable, RefInto, MaybeEmpty}; + use primitives::parachain::{Id, Chain, DutyRoster, CandidateReceipt}; + use {system, session}; + use substrate_runtime_support::{StorageValue, StorageMap}; + use substrate_runtime_support::dispatch::Result; + #[cfg(any(feature = "std", test))] + use rstd::marker::PhantomData; + #[cfg(any(feature = "std", test))] + use {runtime_io, runtime_primitives}; + pub trait Trait: system::Trait + session::Trait { + /// The position of the set_heads call in the block. + const + SET_POSITION: + u32; + type + PublicAux: RefInto + + MaybeEmpty; + } + #[cfg(feature = "std")] + #[doc = r" Parachains module."] + pub struct Module(::std::marker::PhantomData); + #[cfg(feature = "std")] + #[doc = r" Call type for parachains."] + pub enum Call { + __PhantomItem(::std::marker::PhantomData), + + #[allow(non_camel_case_types)] + set_heads(Vec), + } + #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] + const _IMPL_SERIALIZE_FOR_Call: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } } + }); + #[automatically_derived] + impl _serde::Serialize for Call { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + match *self { + Call::__PhantomItem(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "Call", + 0u32, + "__PhantomItem", + __field0), + Call::set_heads(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "Call", + 1u32, + "set_heads", + __field0), + } + } + } + }; + #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] + const _IMPL_DESERIALIZE_FOR_Call: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , + _serde :: export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } } + }); + #[automatically_derived] + impl <'de, T: Trait> _serde::Deserialize<'de> for Call { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + #[allow(non_camel_case_types)] + enum __Field { __field0, __field1, } + struct __FieldVisitor; + impl <'de> _serde::de::Visitor<'de> for __FieldVisitor { + type + Value + = + __Field; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "variant identifier") + } + fn visit_u64<__E>(self, __value: u64) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + 0u64 => _serde::export::Ok(__Field::__field0), + 1u64 => _serde::export::Ok(__Field::__field1), + _ => + _serde::export::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value), + &"variant index 0 <= i < 2")), + } + } + fn visit_str<__E>(self, __value: &str) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + "__PhantomItem" => + _serde::export::Ok(__Field::__field0), + "set_heads" => + _serde::export::Ok(__Field::__field1), + _ => { + _serde::export::Err(_serde::de::Error::unknown_variant(__value, + VARIANTS)) + } + } + } + fn visit_bytes<__E>(self, __value: &[u8]) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + b"__PhantomItem" => + _serde::export::Ok(__Field::__field0), + b"set_heads" => + _serde::export::Ok(__Field::__field1), + _ => { + let __value = + &_serde::export::from_utf8_lossy(__value); + _serde::export::Err(_serde::de::Error::unknown_variant(__value, + VARIANTS)) + } + } + } + } + impl <'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + _serde::Deserializer::deserialize_identifier(__deserializer, + __FieldVisitor) + } + } + struct __Visitor<'de, T: Trait> { + marker: _serde::export::PhantomData>, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de, T: Trait> _serde::de::Visitor<'de> for + __Visitor<'de, T> { + type + Value + = + Call; + fn expecting(&self, + __formatter: + &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "enum Call") + } + fn visit_enum<__A>(self, __data: __A) + -> _serde::export::Result + where __A: _serde::de::EnumAccess<'de> { + match match _serde::de::EnumAccess::variant(__data) + { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + (__Field::__field0, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::std::marker::PhantomData>(__variant), + Call::__PhantomItem), + (__Field::__field1, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::>(__variant), + Call::set_heads), + } + } + } + const VARIANTS: &'static [&'static str] = + &["__PhantomItem", "set_heads"]; + _serde::Deserializer::deserialize_enum(__deserializer, + "Call", VARIANTS, + __Visitor{marker: + _serde::export::PhantomData::>, + lifetime: + _serde::export::PhantomData,}) + } + } + }; + impl ::dispatch::Clone for Call { + fn clone(&self) -> Self { + match *self { + Call::set_heads(ref heads) => Call::set_heads(heads.clone()), + Call::__PhantomItem(_) => { + { + ::rt::begin_panic("internal error: entered unreachable code", + &("polkadot/runtime/src/parachains.rs", + 44u32, 1u32)) + } + } + } + } + } + impl ::dispatch::PartialEq for Call { + fn eq(&self, other: &Self) -> bool { + match *self { + Call::set_heads(ref heads) => { + let self_params = (heads,); + if let Call::set_heads(ref heads) = *other { + self_params == (heads,) + } else { + if let Call::__PhantomItem(_) = *other { + { + { + ::rt::begin_panic("internal error: entered unreachable code", + &("polkadot/runtime/src/parachains.rs", + 44u32, 1u32)) + } + } + } else { false } + } + } + Call::__PhantomItem(_) => { + { + ::rt::begin_panic("internal error: entered unreachable code", + &("polkadot/runtime/src/parachains.rs", + 44u32, 1u32)) + } + } + } + } + } + impl ::dispatch::Eq for Call { } + #[cfg(feature = "std")] + impl ::dispatch::fmt::Debug for Call { + fn fmt(&self, f: &mut ::dispatch::fmt::Formatter) + -> ::dispatch::result::Result<(), ::dispatch::fmt::Error> { + match *self { + Call::set_heads(ref heads) => + f.write_fmt(::std::fmt::Arguments::new_v1_formatted(&["", ""], + &match (&"set_heads", + &(heads.clone(),)) + { + (arg0, + arg1) + => + [::std::fmt::ArgumentV1::new(arg0, + ::std::fmt::Display::fmt), + ::std::fmt::ArgumentV1::new(arg1, + ::std::fmt::Debug::fmt)], + }, + &[::std::fmt::rt::v1::Argument{position: + ::std::fmt::rt::v1::Position::At(0usize), + format: + ::std::fmt::rt::v1::FormatSpec{fill: + ' ', + align: + ::std::fmt::rt::v1::Alignment::Unknown, + flags: + 0u32, + precision: + ::std::fmt::rt::v1::Count::Implied, + width: + ::std::fmt::rt::v1::Count::Implied,},}, + ::std::fmt::rt::v1::Argument{position: + ::std::fmt::rt::v1::Position::At(1usize), + format: + ::std::fmt::rt::v1::FormatSpec{fill: + ' ', + align: + ::std::fmt::rt::v1::Alignment::Unknown, + flags: + 0u32, + precision: + ::std::fmt::rt::v1::Count::Implied, + width: + ::std::fmt::rt::v1::Count::Implied,},}])), + Call::__PhantomItem(_) => { + { + ::rt::begin_panic("internal error: entered unreachable code", + &("polkadot/runtime/src/parachains.rs", + 44u32, 1u32)) + } + } + } + } + } + impl ::dispatch::Slicable for Call { + fn decode(input: &mut I) -> Option { + match input.read_byte()? { + 0 => { + let heads = ::dispatch::Slicable::decode(input)?; + Some(Call::set_heads(heads)) + } + _ => None, + } + } + fn encode(&self) -> ::dispatch::Vec { + let mut v = ::dispatch::Vec::new(); + match *self { + Call::set_heads(ref heads) => { + v.push(0 as u8); + heads.using_encoded(|s| v.extend(s)); + } + Call::__PhantomItem(_) => { + { + ::rt::begin_panic("internal error: entered unreachable code", + &("polkadot/runtime/src/parachains.rs", + 44u32, 1u32)) + } + } + } + v + } + fn using_encoded R>(&self, f: F) -> R { + f(self.encode().as_slice()) + } + } + impl ::dispatch::AuxDispatchable for Call { + type + Trait + = + T; + type + Aux + = + ::PublicAux; + fn dispatch(self, aux: &Self::Aux) -> ::dispatch::Result { + match self { + Call::set_heads(heads) => >::set_heads(aux, heads), + Call::__PhantomItem(_) => { + { + ::rt::begin_panic("__PhantomItem should never be used.", + &("polkadot/runtime/src/parachains.rs", + 44u32, 1u32)) + } + } + } + } + } + impl ::dispatch::AuxCallable for Module { + type + Call + = + Call; + } + impl Module { + pub fn aux_dispatch>(d: D, aux: &D::Aux) -> ::dispatch::Result { + d.dispatch(aux) + } + pub fn dispatch>(d: D) + -> ::dispatch::Result { + d.dispatch() + } + } + pub struct Parachains(::storage::generator::PhantomData); + impl ::storage::generator::StorageValue> for + Parachains { + type + Query + = + Vec; + /// Get the storage key. + fn key() -> &'static [u8] { b"para:chains" } + /// Load the value from the provided storage instance. + fn get(storage: &S) -> Self::Query { + storage.get_or_default(b"para:chains") + } + /// Take a value from storage, removing it afterwards. + fn take(storage: &S) -> Self::Query { + storage.take_or_default(b"para:chains") + } + } + pub struct Code(::storage::generator::PhantomData); + impl ::storage::generator::StorageMap> for Code + { + type + Query + = + Option>; + /// Get the prefix key in storage. + fn prefix() -> &'static [u8] { b"para:code" } + /// Get the storage key used to fetch a value corresponding to a specific key. + fn key_for(x: &Id) -> Vec { + let mut key = b"para:code".to_vec(); + key.extend(::codec::Slicable::encode(x)); + key + } + /// Load the value associated with the given key from the map. + fn get(key: &Id, storage: &S) -> Self::Query { + let key = + as + ::storage::generator::StorageMap>>::key_for(key); + storage.get(&key[..]) + } + /// Take the value, reading and removing it. + fn take(key: &Id, storage: &S) -> Self::Query { + let key = + as + ::storage::generator::StorageMap>>::key_for(key); + storage.take(&key[..]) + } + } + pub struct Heads(::storage::generator::PhantomData); + impl ::storage::generator::StorageMap> for Heads + { + type + Query + = + Option>; + /// Get the prefix key in storage. + fn prefix() -> &'static [u8] { b"para:head" } + /// Get the storage key used to fetch a value corresponding to a specific key. + fn key_for(x: &Id) -> Vec { + let mut key = b"para:head".to_vec(); + key.extend(::codec::Slicable::encode(x)); + key + } + /// Load the value associated with the given key from the map. + fn get(key: &Id, storage: &S) -> Self::Query { + let key = + as + ::storage::generator::StorageMap>>::key_for(key); + storage.get(&key[..]) + } + /// Take the value, reading and removing it. + fn take(key: &Id, storage: &S) -> Self::Query { + let key = + as + ::storage::generator::StorageMap>>::key_for(key); + storage.take(&key[..]) + } + } + struct DidUpdate(::storage::generator::PhantomData); + impl ::storage::generator::StorageValue for DidUpdate + { + type + Query + = + bool; + /// Get the storage key. + fn key() -> &'static [u8] { b"para:did" } + /// Load the value from the provided storage instance. + fn get(storage: &S) -> Self::Query { + storage.get_or_default(b"para:did") + } + /// Take a value from storage, removing it afterwards. + fn take(storage: &S) -> Self::Query { + storage.take_or_default(b"para:did") + } + } + trait Store { + type + Parachains; + type + Code; + type + Heads; + type + DidUpdate; + } + impl Store for Module { + type + Parachains + = + Parachains; + type + Code + = + Code; + type + Heads + = + Heads; + type + DidUpdate + = + DidUpdate; + } + impl Module { + pub fn active_parachains() -> Vec { + as + ::storage::generator::StorageValue>>::get(&::storage::RuntimeStorage) + } + pub fn parachain_code>(key: K) + -> Option> { + as + ::storage::generator::StorageMap>>::get(key.borrow(), + &::storage::RuntimeStorage) + } + pub fn parachain_head>(key: K) + -> Option> { + as + ::storage::generator::StorageMap>>::get(key.borrow(), + &::storage::RuntimeStorage) + } + } + impl Module { + /// Calculate the current block's duty roster using system's random seed. + pub fn calculate_duty_roster() -> DutyRoster { + let parachains = Self::active_parachains(); + let parachain_count = parachains.len(); + let validator_count = + >::validator_count() as usize; + let validators_per_parachain = + if parachain_count != 0 { + (validator_count - 1) / parachain_count + } else { 0 }; + let mut roles_val = + (0..validator_count).map(|i| + match i { + i if + i < + parachain_count * + validators_per_parachain + => { + let idx = + i / + validators_per_parachain; + Chain::Parachain(parachains[idx].clone()) + } + _ => Chain::Relay, + }).collect::>(); + let mut roles_gua = roles_val.clone(); + let random_seed = system::Module::::random_seed(); + let mut seed = + random_seed.to_vec().and(b"validator_role_pairs").blake2_256(); + for i in 0..(validator_count - 1) { + let offset = (i * 8 % 32) as usize; + let remaining = (validator_count - i) as usize; + let val_index = + u32::decode(&mut &seed[offset..offset + + 4]).expect("using 4 bytes for a 32-bit quantity") + as usize % remaining; + let gua_index = + u32::decode(&mut &seed[offset + + 4..offset + + 8]).expect("using 4 bytes for a 32-bit quantity") + as usize % remaining; + if offset == 24 { seed = seed.blake2_256(); } + roles_val.swap(remaining - 1, val_index); + roles_gua.swap(remaining - 1, gua_index); + } + DutyRoster{validator_duty: roles_val, guarantor_duty: roles_gua,} + } + /// Register a parachain with given code. + /// Fails if given ID is already used. + pub fn register_parachain(id: Id, code: Vec, + initial_head_data: Vec) { + let mut parachains = Self::active_parachains(); + match parachains.binary_search(&id) { + Ok(_) => { + ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Parachain with id ", + " already exists"], + &match (&id.into_inner(),) + { + (arg0,) + => + [::std::fmt::ArgumentV1::new(arg0, + ::std::fmt::Display::fmt)], + }, + &[::std::fmt::rt::v1::Argument{position: + ::std::fmt::rt::v1::Position::At(0usize), + format: + ::std::fmt::rt::v1::FormatSpec{fill: + ' ', + align: + ::std::fmt::rt::v1::Alignment::Unknown, + flags: + 0u32, + precision: + ::std::fmt::rt::v1::Count::Implied, + width: + ::std::fmt::rt::v1::Count::Implied,},}]), + &("polkadot/runtime/src/parachains.rs", + 123u32, 13u32)) + } + Err(idx) => parachains.insert(idx, id), + } + >::insert(id, code); + >::put(parachains); + >::insert(id, initial_head_data); + } + /// Deregister a parachain with given id + pub fn deregister_parachain(id: Id) { + let mut parachains = Self::active_parachains(); + match parachains.binary_search(&id) { + Ok(idx) => { parachains.remove(idx); } + Err(_) => { } + } + >::remove(id); + >::remove(id); + >::put(parachains); + } + fn set_heads(aux: &::PublicAux, + heads: Vec) -> Result { + { + if !aux.is_empty() { + { return Err("set_heads must not be signed"); }; + } + }; + { + if !!>::exists() { + { + return Err("Parachain heads must be updated only once in the block"); + }; + } + }; + { + if !(>::extrinsic_index() == + T::SET_POSITION) { + { + return Err("Parachain heads update extrinsic must be at position {} in the block"); + }; + } + }; + let active_parachains = Self::active_parachains(); + let mut iter = active_parachains.iter(); + for head in &heads { + { + if !iter.find(|&p| p == &head.parachain_index).is_some() { + { + return Err("Submitted candidate for unregistered or out-of-order parachain {}"); + }; + } + }; + } + for head in heads { + let id = head.parachain_index.clone(); + >::insert(id, head.head_data.0); + } + >::put(true); + Ok(()) + } + } + impl Executable for Module { + fn execute() { + if !::take() { + { + ::rt::begin_panic("Parachain heads must be updated once in the block", + &("polkadot/runtime/src/parachains.rs", + 179u32, 3u32)) + } + }; + } + } + /// Parachains module genesis configuration. + #[cfg(any(feature = "std", test))] + pub struct GenesisConfig { + /// The initial parachains, mapped to code. + pub parachains: Vec<(Id, Vec)>, + /// Phantom data. + pub phantom: PhantomData, + } + #[cfg(any(feature = "std", test))] + impl Default for GenesisConfig { + fn default() -> Self { + GenesisConfig{parachains: Vec::new(), phantom: PhantomData,} + } + } + #[cfg(any(feature = "std", test))] + impl runtime_primitives::BuildExternalities for + GenesisConfig { + fn build_externalities(mut self) -> runtime_io::TestExternalities { + use std::collections::HashMap; + use runtime_io::twox_128; + use codec::Slicable; + self.parachains.sort_unstable_by_key(|&(ref id, _)| id.clone()); + self.parachains.dedup_by_key(|&mut (ref id, _)| id.clone()); + let only_ids: Vec<_> = + self.parachains.iter().map(|&(ref id, _)| + id).cloned().collect(); + let mut map: HashMap<_, _> = + <[_]>::into_vec(box + [(twox_128(>::key()).to_vec(), + only_ids.encode())]).into_iter().collect(); + for (id, code) in self.parachains { + let key = twox_128(&>::key_for(&id)).to_vec(); + map.insert(key, code.encode()); + } + map.into() + } + } +} +use primitives::{AccountId, Balance, BlockNumber, Hash, Index, Log, + SessionKey}; +use runtime_primitives::{generic, + traits::{HasPublicAux, BlakeTwo256, Convert}}; +#[cfg(feature = "std")] +pub use runtime_primitives::BuildExternalities; +pub use consensus::Call as ConsensusCall; +pub use timestamp::Call as TimestampCall; +pub use parachains::Call as ParachainsCall; +pub use primitives::{Header, Block, UncheckedExtrinsic, Extrinsic}; +/// The position of the timestamp set extrinsic. +pub const TIMESTAMP_SET_POSITION: u32 = 0; +/// The position of the parachains set extrinsic. +pub const PARACHAINS_SET_POSITION: u32 = 1; +/// Concrete runtime type used to parameterize the various modules. +pub struct Concrete; +impl HasPublicAux for Concrete { + type + PublicAux + = + AccountId; +} +impl system::Trait for Concrete { + type + Index + = + Index; + type + BlockNumber + = + BlockNumber; + type + Hash + = + Hash; + type + Hashing + = + BlakeTwo256; + type + Digest + = + generic::Digest; + type + AccountId + = + AccountId; + type + Header + = + Header; +} +/// System module for this concrete runtime. +pub type System = system::Module; +impl consensus::Trait for Concrete { + type + PublicAux + = + ::PublicAux; + type + SessionKey + = + SessionKey; +} +/// Consensus module for this concrete runtime. +pub type Consensus = consensus::Module; +impl timestamp::Trait for Concrete { + const + SET_POSITION: + u32 + = + TIMESTAMP_SET_POSITION; + type + Value + = + u64; +} +/// Timestamp module for this concrete runtime. +pub type Timestamp = timestamp::Module; +/// Session key conversion. +pub struct SessionKeyConversion; +impl Convert for SessionKeyConversion { + fn convert(a: AccountId) -> SessionKey { a.0 } +} +impl session::Trait for Concrete { + type + ConvertAccountIdToSessionKey + = + SessionKeyConversion; +} +/// Session module for this concrete runtime. +pub type Session = session::Module; +impl staking::Trait for Concrete { + type + Balance + = + Balance; + type + DetermineContractAddress + = + BlakeTwo256; +} +/// Staking module for this concrete runtime. +pub type Staking = staking::Module; +impl democracy::Trait for Concrete { + type + Proposal + = + PrivCall; +} +/// Democracy module for this concrete runtime. +pub type Democracy = democracy::Module; +impl council::Trait for Concrete { } +/// Council module for this concrete runtime. +pub type Council = council::Module; +/// Council voting module for this concrete runtime. +pub type CouncilVoting = council::voting::Module; +impl parachains::Trait for Concrete { + const + SET_POSITION: + u32 + = + PARACHAINS_SET_POSITION; + type + PublicAux + = + ::PublicAux; +} +pub type Parachains = parachains::Module; +#[doc = r" Call type for polkadot transactions."] +#[structural_match] +pub enum Call { + Consensus(::Call), + Session(::Call), + Staking(::Call), + Timestamp(::Call), + Democracy(::Call), + Council(::Call), + CouncilVoting(::Call), + Parachains(::Call), +} +#[automatically_derived] +#[allow(unused_qualifications)] +impl ::std::clone::Clone for Call { + #[inline] + fn clone(&self) -> Call { + match (&*self,) { + (&Call::Consensus(ref __self_0),) => + Call::Consensus(::std::clone::Clone::clone(&(*__self_0))), + (&Call::Session(ref __self_0),) => + Call::Session(::std::clone::Clone::clone(&(*__self_0))), + (&Call::Staking(ref __self_0),) => + Call::Staking(::std::clone::Clone::clone(&(*__self_0))), + (&Call::Timestamp(ref __self_0),) => + Call::Timestamp(::std::clone::Clone::clone(&(*__self_0))), + (&Call::Democracy(ref __self_0),) => + Call::Democracy(::std::clone::Clone::clone(&(*__self_0))), + (&Call::Council(ref __self_0),) => + Call::Council(::std::clone::Clone::clone(&(*__self_0))), + (&Call::CouncilVoting(ref __self_0),) => + Call::CouncilVoting(::std::clone::Clone::clone(&(*__self_0))), + (&Call::Parachains(ref __self_0),) => + Call::Parachains(::std::clone::Clone::clone(&(*__self_0))), + } + } +} +#[automatically_derived] +#[allow(unused_qualifications)] +impl ::std::cmp::PartialEq for Call { + #[inline] + fn eq(&self, other: &Call) -> bool { + { + let __self_vi = + unsafe { ::std::intrinsics::discriminant_value(&*self) } as + isize; + let __arg_1_vi = + unsafe { ::std::intrinsics::discriminant_value(&*other) } as + isize; + if true && __self_vi == __arg_1_vi { + match (&*self, &*other) { + (&Call::Consensus(ref __self_0), + &Call::Consensus(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&Call::Session(ref __self_0), + &Call::Session(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&Call::Staking(ref __self_0), + &Call::Staking(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&Call::Timestamp(ref __self_0), + &Call::Timestamp(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&Call::Democracy(ref __self_0), + &Call::Democracy(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&Call::Council(ref __self_0), + &Call::Council(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&Call::CouncilVoting(ref __self_0), + &Call::CouncilVoting(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&Call::Parachains(ref __self_0), + &Call::Parachains(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + _ => unsafe { ::std::intrinsics::unreachable() } + } + } else { false } + } + } + #[inline] + fn ne(&self, other: &Call) -> bool { + { + let __self_vi = + unsafe { ::std::intrinsics::discriminant_value(&*self) } as + isize; + let __arg_1_vi = + unsafe { ::std::intrinsics::discriminant_value(&*other) } as + isize; + if true && __self_vi == __arg_1_vi { + match (&*self, &*other) { + (&Call::Consensus(ref __self_0), + &Call::Consensus(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&Call::Session(ref __self_0), + &Call::Session(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&Call::Staking(ref __self_0), + &Call::Staking(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&Call::Timestamp(ref __self_0), + &Call::Timestamp(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&Call::Democracy(ref __self_0), + &Call::Democracy(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&Call::Council(ref __self_0), + &Call::Council(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&Call::CouncilVoting(ref __self_0), + &Call::CouncilVoting(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&Call::Parachains(ref __self_0), + &Call::Parachains(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + _ => unsafe { ::std::intrinsics::unreachable() } + } + } else { true } + } + } +} +#[automatically_derived] +#[allow(unused_qualifications)] +impl ::std::cmp::Eq for Call { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + } + } +} +#[automatically_derived] +#[allow(unused_qualifications)] +impl ::std::fmt::Debug for Call { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + match (&*self,) { + (&Call::Consensus(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Consensus"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&Call::Session(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Session"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&Call::Staking(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Staking"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&Call::Timestamp(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Timestamp"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&Call::Democracy(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Democracy"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&Call::Council(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Council"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&Call::CouncilVoting(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("CouncilVoting"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&Call::Parachains(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Parachains"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + } + } +} +#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] +const _IMPL_SERIALIZE_FOR_Call: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , _serde :: + export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } } }); + #[automatically_derived] + impl _serde::Serialize for Call { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + match *self { + Call::Consensus(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "Call", + 0u32, + "Consensus", + __field0), + Call::Session(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "Call", + 1u32, + "Session", + __field0), + Call::Staking(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "Call", + 2u32, + "Staking", + __field0), + Call::Timestamp(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "Call", + 3u32, + "Timestamp", + __field0), + Call::Democracy(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "Call", + 4u32, + "Democracy", + __field0), + Call::Council(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "Call", + 5u32, + "Council", + __field0), + Call::CouncilVoting(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "Call", + 6u32, + "CouncilVoting", + __field0), + Call::Parachains(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "Call", + 7u32, + "Parachains", + __field0), + } + } + } + }; +#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] +const _IMPL_DESERIALIZE_FOR_Call: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , _serde :: + export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for Call { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + #[allow(non_camel_case_types)] + enum __Field { + __field0, + __field1, + __field2, + __field3, + __field4, + __field5, + __field6, + __field7, + } + struct __FieldVisitor; + impl <'de> _serde::de::Visitor<'de> for __FieldVisitor { + type + Value + = + __Field; + fn expecting(&self, + __formatter: &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "variant identifier") + } + fn visit_u64<__E>(self, __value: u64) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + 0u64 => _serde::export::Ok(__Field::__field0), + 1u64 => _serde::export::Ok(__Field::__field1), + 2u64 => _serde::export::Ok(__Field::__field2), + 3u64 => _serde::export::Ok(__Field::__field3), + 4u64 => _serde::export::Ok(__Field::__field4), + 5u64 => _serde::export::Ok(__Field::__field5), + 6u64 => _serde::export::Ok(__Field::__field6), + 7u64 => _serde::export::Ok(__Field::__field7), + _ => + _serde::export::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value), + &"variant index 0 <= i < 8")), + } + } + fn visit_str<__E>(self, __value: &str) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + "Consensus" => + _serde::export::Ok(__Field::__field0), + "Session" => + _serde::export::Ok(__Field::__field1), + "Staking" => + _serde::export::Ok(__Field::__field2), + "Timestamp" => + _serde::export::Ok(__Field::__field3), + "Democracy" => + _serde::export::Ok(__Field::__field4), + "Council" => + _serde::export::Ok(__Field::__field5), + "CouncilVoting" => + _serde::export::Ok(__Field::__field6), + "Parachains" => + _serde::export::Ok(__Field::__field7), + _ => { + _serde::export::Err(_serde::de::Error::unknown_variant(__value, + VARIANTS)) + } + } + } + fn visit_bytes<__E>(self, __value: &[u8]) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + b"Consensus" => + _serde::export::Ok(__Field::__field0), + b"Session" => + _serde::export::Ok(__Field::__field1), + b"Staking" => + _serde::export::Ok(__Field::__field2), + b"Timestamp" => + _serde::export::Ok(__Field::__field3), + b"Democracy" => + _serde::export::Ok(__Field::__field4), + b"Council" => + _serde::export::Ok(__Field::__field5), + b"CouncilVoting" => + _serde::export::Ok(__Field::__field6), + b"Parachains" => + _serde::export::Ok(__Field::__field7), + _ => { + let __value = + &_serde::export::from_utf8_lossy(__value); + _serde::export::Err(_serde::de::Error::unknown_variant(__value, + VARIANTS)) + } + } + } + } + impl <'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + _serde::Deserializer::deserialize_identifier(__deserializer, + __FieldVisitor) + } + } + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> { + type + Value + = + Call; + fn expecting(&self, + __formatter: &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "enum Call") + } + fn visit_enum<__A>(self, __data: __A) + -> _serde::export::Result where + __A: _serde::de::EnumAccess<'de> { + match match _serde::de::EnumAccess::variant(__data) { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + (__Field::__field0, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + Call::Consensus), + (__Field::__field1, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + Call::Session), + (__Field::__field2, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + Call::Staking), + (__Field::__field3, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + Call::Timestamp), + (__Field::__field4, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + Call::Democracy), + (__Field::__field5, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + Call::Council), + (__Field::__field6, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + Call::CouncilVoting), + (__Field::__field7, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + Call::Parachains), + } + } + } + const VARIANTS: &'static [&'static str] = + &["Consensus", "Session", "Staking", "Timestamp", + "Democracy", "Council", "CouncilVoting", "Parachains"]; + _serde::Deserializer::deserialize_enum(__deserializer, "Call", + VARIANTS, + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; +impl ::dispatch::Slicable for Call { + fn decode(input: &mut I) -> Option { + match input.read_byte()? { + 0 => Some(Call::Consensus(::dispatch::Slicable::decode(input)?)), + 1 => Some(Call::Session(::dispatch::Slicable::decode(input)?)), + 2 => Some(Call::Staking(::dispatch::Slicable::decode(input)?)), + 3 => Some(Call::Timestamp(::dispatch::Slicable::decode(input)?)), + 5 => Some(Call::Democracy(::dispatch::Slicable::decode(input)?)), + 6 => Some(Call::Council(::dispatch::Slicable::decode(input)?)), + 7 => + Some(Call::CouncilVoting(::dispatch::Slicable::decode(input)?)), + 8 => Some(Call::Parachains(::dispatch::Slicable::decode(input)?)), + _ => None, + } + } + fn encode(&self) -> ::dispatch::Vec { + let mut v = ::dispatch::Vec::new(); + match *self { + Call::Consensus(ref sub) => { + v.push(0 as u8); + sub.using_encoded(|s| v.extend(s)); + } + Call::Session(ref sub) => { + v.push(1 as u8); + sub.using_encoded(|s| v.extend(s)); + } + Call::Staking(ref sub) => { + v.push(2 as u8); + sub.using_encoded(|s| v.extend(s)); + } + Call::Timestamp(ref sub) => { + v.push(3 as u8); + sub.using_encoded(|s| v.extend(s)); + } + Call::Democracy(ref sub) => { + v.push(5 as u8); + sub.using_encoded(|s| v.extend(s)); + } + Call::Council(ref sub) => { + v.push(6 as u8); + sub.using_encoded(|s| v.extend(s)); + } + Call::CouncilVoting(ref sub) => { + v.push(7 as u8); + sub.using_encoded(|s| v.extend(s)); + } + Call::Parachains(ref sub) => { + v.push(8 as u8); + sub.using_encoded(|s| v.extend(s)); + } + } + v + } + fn using_encoded R>(&self, f: F) -> R { + f(self.encode().as_slice()) + } +} +impl ::dispatch::AuxDispatchable for Call { + type + Aux + = + ::PublicAux; + type + Trait + = + Call; + fn dispatch(self, aux: &::PublicAux) + -> ::dispatch::Result { + match self { + Call::Consensus(call) => call.dispatch(&aux), + Call::Session(call) => call.dispatch(&aux), + Call::Staking(call) => call.dispatch(&aux), + Call::Timestamp(call) => call.dispatch(&aux), + Call::Democracy(call) => call.dispatch(&aux), + Call::Council(call) => call.dispatch(&aux), + Call::CouncilVoting(call) => call.dispatch(&aux), + Call::Parachains(call) => call.dispatch(&aux), + } + } +} +impl ::dispatch::IsAuxSubType for Call { + fn is_aux_sub_type(&self) + -> Option<&::Call> { + if let Call::Consensus(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsAuxSubType for Call { + fn is_aux_sub_type(&self) + -> Option<&::Call> { + if let Call::Session(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsAuxSubType for Call { + fn is_aux_sub_type(&self) + -> Option<&::Call> { + if let Call::Staking(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsAuxSubType for Call { + fn is_aux_sub_type(&self) + -> Option<&::Call> { + if let Call::Timestamp(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsAuxSubType for Call { + fn is_aux_sub_type(&self) + -> Option<&::Call> { + if let Call::Democracy(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsAuxSubType for Call { + fn is_aux_sub_type(&self) + -> Option<&::Call> { + if let Call::Council(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsAuxSubType for Call { + fn is_aux_sub_type(&self) + -> Option<&::Call> { + if let Call::CouncilVoting(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsAuxSubType for Call { + fn is_aux_sub_type(&self) + -> Option<&::Call> { + if let Call::Parachains(ref r) = *self { Some(r) } else { None } + } +} +#[doc = r" Internal calls."] +#[structural_match] +pub enum PrivCall { + Consensus(::Call), + Session(::Call), + Staking(::Call), + Democracy(::Call), + Council(::Call), + CouncilVoting(::Call), +} +#[automatically_derived] +#[allow(unused_qualifications)] +impl ::std::clone::Clone for PrivCall { + #[inline] + fn clone(&self) -> PrivCall { + match (&*self,) { + (&PrivCall::Consensus(ref __self_0),) => + PrivCall::Consensus(::std::clone::Clone::clone(&(*__self_0))), + (&PrivCall::Session(ref __self_0),) => + PrivCall::Session(::std::clone::Clone::clone(&(*__self_0))), + (&PrivCall::Staking(ref __self_0),) => + PrivCall::Staking(::std::clone::Clone::clone(&(*__self_0))), + (&PrivCall::Democracy(ref __self_0),) => + PrivCall::Democracy(::std::clone::Clone::clone(&(*__self_0))), + (&PrivCall::Council(ref __self_0),) => + PrivCall::Council(::std::clone::Clone::clone(&(*__self_0))), + (&PrivCall::CouncilVoting(ref __self_0),) => + PrivCall::CouncilVoting(::std::clone::Clone::clone(&(*__self_0))), + } + } +} +#[automatically_derived] +#[allow(unused_qualifications)] +impl ::std::cmp::PartialEq for PrivCall { + #[inline] + fn eq(&self, other: &PrivCall) -> bool { + { + let __self_vi = + unsafe { ::std::intrinsics::discriminant_value(&*self) } as + isize; + let __arg_1_vi = + unsafe { ::std::intrinsics::discriminant_value(&*other) } as + isize; + if true && __self_vi == __arg_1_vi { + match (&*self, &*other) { + (&PrivCall::Consensus(ref __self_0), + &PrivCall::Consensus(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&PrivCall::Session(ref __self_0), + &PrivCall::Session(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&PrivCall::Staking(ref __self_0), + &PrivCall::Staking(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&PrivCall::Democracy(ref __self_0), + &PrivCall::Democracy(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&PrivCall::Council(ref __self_0), + &PrivCall::Council(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + (&PrivCall::CouncilVoting(ref __self_0), + &PrivCall::CouncilVoting(ref __arg_1_0)) => + (*__self_0) == (*__arg_1_0), + _ => unsafe { ::std::intrinsics::unreachable() } + } + } else { false } + } + } + #[inline] + fn ne(&self, other: &PrivCall) -> bool { + { + let __self_vi = + unsafe { ::std::intrinsics::discriminant_value(&*self) } as + isize; + let __arg_1_vi = + unsafe { ::std::intrinsics::discriminant_value(&*other) } as + isize; + if true && __self_vi == __arg_1_vi { + match (&*self, &*other) { + (&PrivCall::Consensus(ref __self_0), + &PrivCall::Consensus(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&PrivCall::Session(ref __self_0), + &PrivCall::Session(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&PrivCall::Staking(ref __self_0), + &PrivCall::Staking(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&PrivCall::Democracy(ref __self_0), + &PrivCall::Democracy(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&PrivCall::Council(ref __self_0), + &PrivCall::Council(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + (&PrivCall::CouncilVoting(ref __self_0), + &PrivCall::CouncilVoting(ref __arg_1_0)) => + (*__self_0) != (*__arg_1_0), + _ => unsafe { ::std::intrinsics::unreachable() } + } + } else { true } + } + } +} +#[automatically_derived] +#[allow(unused_qualifications)] +impl ::std::cmp::Eq for PrivCall { + #[inline] + #[doc(hidden)] + fn assert_receiver_is_total_eq(&self) -> () { + { + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + let _: + ::std::cmp::AssertParamIsEq<::Call>; + } + } +} +#[automatically_derived] +#[allow(unused_qualifications)] +impl ::std::fmt::Debug for PrivCall { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + match (&*self,) { + (&PrivCall::Consensus(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Consensus"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&PrivCall::Session(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Session"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&PrivCall::Staking(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Staking"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&PrivCall::Democracy(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Democracy"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&PrivCall::Council(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("Council"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + (&PrivCall::CouncilVoting(ref __self_0),) => { + let mut debug_trait_builder = f.debug_tuple("CouncilVoting"); + let _ = debug_trait_builder.field(&&(*__self_0)); + debug_trait_builder.finish() + } + } + } +} +#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] +const _IMPL_SERIALIZE_FOR_PrivCall: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , _serde :: + export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } } }); + #[automatically_derived] + impl _serde::Serialize for PrivCall { + fn serialize<__S>(&self, __serializer: __S) + -> _serde::export::Result<__S::Ok, __S::Error> where + __S: _serde::Serializer { + match *self { + PrivCall::Consensus(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "PrivCall", + 0u32, + "Consensus", + __field0), + PrivCall::Session(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "PrivCall", + 1u32, + "Session", + __field0), + PrivCall::Staking(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "PrivCall", + 2u32, + "Staking", + __field0), + PrivCall::Democracy(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "PrivCall", + 3u32, + "Democracy", + __field0), + PrivCall::Council(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "PrivCall", + 4u32, + "Council", + __field0), + PrivCall::CouncilVoting(ref __field0) => + _serde::Serializer::serialize_newtype_variant(__serializer, + "PrivCall", + 5u32, + "CouncilVoting", + __field0), + } + } + } + }; +#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] +const _IMPL_DESERIALIZE_FOR_PrivCall: () = + { + extern crate serde as _serde; + #[allow(unused_macros)] + macro_rules! try(( $ __expr : expr ) => { + match $ __expr { + _serde :: export :: Ok ( __val ) => __val , _serde :: + export :: Err ( __err ) => { + return _serde :: export :: Err ( __err ) ; } } }); + #[automatically_derived] + impl <'de> _serde::Deserialize<'de> for PrivCall { + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + #[allow(non_camel_case_types)] + enum __Field { + __field0, + __field1, + __field2, + __field3, + __field4, + __field5, + } + struct __FieldVisitor; + impl <'de> _serde::de::Visitor<'de> for __FieldVisitor { + type + Value + = + __Field; + fn expecting(&self, + __formatter: &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "variant identifier") + } + fn visit_u64<__E>(self, __value: u64) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + 0u64 => _serde::export::Ok(__Field::__field0), + 1u64 => _serde::export::Ok(__Field::__field1), + 2u64 => _serde::export::Ok(__Field::__field2), + 3u64 => _serde::export::Ok(__Field::__field3), + 4u64 => _serde::export::Ok(__Field::__field4), + 5u64 => _serde::export::Ok(__Field::__field5), + _ => + _serde::export::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value), + &"variant index 0 <= i < 6")), + } + } + fn visit_str<__E>(self, __value: &str) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + "Consensus" => + _serde::export::Ok(__Field::__field0), + "Session" => + _serde::export::Ok(__Field::__field1), + "Staking" => + _serde::export::Ok(__Field::__field2), + "Democracy" => + _serde::export::Ok(__Field::__field3), + "Council" => + _serde::export::Ok(__Field::__field4), + "CouncilVoting" => + _serde::export::Ok(__Field::__field5), + _ => { + _serde::export::Err(_serde::de::Error::unknown_variant(__value, + VARIANTS)) + } + } + } + fn visit_bytes<__E>(self, __value: &[u8]) + -> _serde::export::Result where + __E: _serde::de::Error { + match __value { + b"Consensus" => + _serde::export::Ok(__Field::__field0), + b"Session" => + _serde::export::Ok(__Field::__field1), + b"Staking" => + _serde::export::Ok(__Field::__field2), + b"Democracy" => + _serde::export::Ok(__Field::__field3), + b"Council" => + _serde::export::Ok(__Field::__field4), + b"CouncilVoting" => + _serde::export::Ok(__Field::__field5), + _ => { + let __value = + &_serde::export::from_utf8_lossy(__value); + _serde::export::Err(_serde::de::Error::unknown_variant(__value, + VARIANTS)) + } + } + } + } + impl <'de> _serde::Deserialize<'de> for __Field { + #[inline] + fn deserialize<__D>(__deserializer: __D) + -> _serde::export::Result where + __D: _serde::Deserializer<'de> { + _serde::Deserializer::deserialize_identifier(__deserializer, + __FieldVisitor) + } + } + struct __Visitor<'de> { + marker: _serde::export::PhantomData, + lifetime: _serde::export::PhantomData<&'de ()>, + } + impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> { + type + Value + = + PrivCall; + fn expecting(&self, + __formatter: &mut _serde::export::Formatter) + -> _serde::export::fmt::Result { + _serde::export::Formatter::write_str(__formatter, + "enum PrivCall") + } + fn visit_enum<__A>(self, __data: __A) + -> _serde::export::Result where + __A: _serde::de::EnumAccess<'de> { + match match _serde::de::EnumAccess::variant(__data) { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } { + (__Field::__field0, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + PrivCall::Consensus), + (__Field::__field1, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + PrivCall::Session), + (__Field::__field2, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + PrivCall::Staking), + (__Field::__field3, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + PrivCall::Democracy), + (__Field::__field4, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + PrivCall::Council), + (__Field::__field5, __variant) => + _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), + PrivCall::CouncilVoting), + } + } + } + const VARIANTS: &'static [&'static str] = + &["Consensus", "Session", "Staking", "Democracy", + "Council", "CouncilVoting"]; + _serde::Deserializer::deserialize_enum(__deserializer, + "PrivCall", VARIANTS, + __Visitor{marker: + _serde::export::PhantomData::, + lifetime: + _serde::export::PhantomData,}) + } + } + }; +impl ::dispatch::Slicable for PrivCall { + fn decode(input: &mut I) -> Option { + match input.read_byte()? { + 0 => + Some(PrivCall::Consensus(::dispatch::Slicable::decode(input)?)), + 1 => + Some(PrivCall::Session(::dispatch::Slicable::decode(input)?)), + 2 => + Some(PrivCall::Staking(::dispatch::Slicable::decode(input)?)), + 5 => + Some(PrivCall::Democracy(::dispatch::Slicable::decode(input)?)), + 6 => + Some(PrivCall::Council(::dispatch::Slicable::decode(input)?)), + 7 => + Some(PrivCall::CouncilVoting(::dispatch::Slicable::decode(input)?)), + _ => None, + } + } + fn encode(&self) -> ::dispatch::Vec { + let mut v = ::dispatch::Vec::new(); + match *self { + PrivCall::Consensus(ref sub) => { + v.push(0 as u8); + sub.using_encoded(|s| v.extend(s)); + } + PrivCall::Session(ref sub) => { + v.push(1 as u8); + sub.using_encoded(|s| v.extend(s)); + } + PrivCall::Staking(ref sub) => { + v.push(2 as u8); + sub.using_encoded(|s| v.extend(s)); + } + PrivCall::Democracy(ref sub) => { + v.push(5 as u8); + sub.using_encoded(|s| v.extend(s)); + } + PrivCall::Council(ref sub) => { + v.push(6 as u8); + sub.using_encoded(|s| v.extend(s)); + } + PrivCall::CouncilVoting(ref sub) => { + v.push(7 as u8); + sub.using_encoded(|s| v.extend(s)); + } + } + v + } + fn using_encoded R>(&self, f: F) -> R { + f(self.encode().as_slice()) + } +} +impl ::dispatch::Dispatchable for PrivCall { + type + Trait + = + PrivCall; + fn dispatch(self) -> ::dispatch::Result { + match self { + PrivCall::Consensus(call) => call.dispatch(), + PrivCall::Session(call) => call.dispatch(), + PrivCall::Staking(call) => call.dispatch(), + PrivCall::Democracy(call) => call.dispatch(), + PrivCall::Council(call) => call.dispatch(), + PrivCall::CouncilVoting(call) => call.dispatch(), + } + } +} +impl ::dispatch::IsSubType for PrivCall { + fn is_sub_type(&self) + -> Option<&::Call> { + if let PrivCall::Consensus(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsSubType for PrivCall { + fn is_sub_type(&self) + -> Option<&::Call> { + if let PrivCall::Session(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsSubType for PrivCall { + fn is_sub_type(&self) + -> Option<&::Call> { + if let PrivCall::Staking(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsSubType for PrivCall { + fn is_sub_type(&self) + -> Option<&::Call> { + if let PrivCall::Democracy(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsSubType for PrivCall { + fn is_sub_type(&self) + -> Option<&::Call> { + if let PrivCall::Council(ref r) = *self { Some(r) } else { None } + } +} +impl ::dispatch::IsSubType for PrivCall { + fn is_sub_type(&self) + -> Option<&::Call> { + if let PrivCall::CouncilVoting(ref r) = *self { + Some(r) + } else { None } + } +} +/// Executive: handles dispatch to the various modules. +pub type Executive = + executive::Executive; +#[cfg(any(feature = "std", test))] +pub type ConsensusConfig = consensus::GenesisConfig; +#[cfg(any(feature = "std", test))] +pub type SystemConfig = system::GenesisConfig; +#[cfg(any(feature = "std", test))] +pub type SessionConfig = session::GenesisConfig; +#[cfg(any(feature = "std", test))] +pub type StakingConfig = staking::GenesisConfig; +#[cfg(any(feature = "std", test))] +pub type DemocracyConfig = democracy::GenesisConfig; +#[cfg(any(feature = "std", test))] +pub type CouncilConfig = council::GenesisConfig; +#[cfg(any(feature = "std", test))] +pub type ParachainsConfig = parachains::GenesisConfig; +#[cfg(any(feature = "std", test))] +pub struct GenesisConfig { + pub consensus: Option, + pub system: Option, + pub session: Option, + pub staking: Option, + pub democracy: Option, + pub council: Option, + pub parachains: Option, +} +#[cfg(any(feature = "std", test))] +impl ::BuildExternalities for GenesisConfig { + fn build_externalities(self) -> ::BuiltExternalities { + let mut s = ::BuiltExternalities::new(); + if let Some(extra) = self.consensus { + s.extend(extra.build_externalities()); + } + if let Some(extra) = self.system { + s.extend(extra.build_externalities()); + } + if let Some(extra) = self.session { + s.extend(extra.build_externalities()); + } + if let Some(extra) = self.staking { + s.extend(extra.build_externalities()); + } + if let Some(extra) = self.democracy { + s.extend(extra.build_externalities()); + } + if let Some(extra) = self.council { + s.extend(extra.build_externalities()); + } + if let Some(extra) = self.parachains { + s.extend(extra.build_externalities()); + } + s + } +} +pub mod api { + /// Dispatch logic for the native runtime. + pub fn dispatch(method: &str, data: &[u8]) -> Option> { + match method { + "authorities" => { + { + let mut data = data; + let input = + match ::codec::Slicable::decode(&mut data) { + Some(input) => input, + None => { + ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], + &match (&"authorities",) + { + (arg0,) + => + [::std::fmt::ArgumentV1::new(arg0, + ::std::fmt::Display::fmt)], + }, + &[::std::fmt::rt::v1::Argument{position: + ::std::fmt::rt::v1::Position::At(0usize), + format: + ::std::fmt::rt::v1::FormatSpec{fill: + ' ', + align: + ::std::fmt::rt::v1::Alignment::Unknown, + flags: + 0u32, + precision: + ::std::fmt::rt::v1::Count::Implied, + width: + ::std::fmt::rt::v1::Count::Implied,},}]), + &("polkadot/runtime/src/lib.rs", + 195u32, 2u32)) + } + }; + let output = + (|()| super::Consensus::authorities())(input); + Some(::codec::Slicable::encode(&output)) + } + } + "initialise_block" => { + { + let mut data = data; + let input = + match ::codec::Slicable::decode(&mut data) { + Some(input) => input, + None => { + ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], + &match (&"initialise_block",) + { + (arg0,) + => + [::std::fmt::ArgumentV1::new(arg0, + ::std::fmt::Display::fmt)], + }, + &[::std::fmt::rt::v1::Argument{position: + ::std::fmt::rt::v1::Position::At(0usize), + format: + ::std::fmt::rt::v1::FormatSpec{fill: + ' ', + align: + ::std::fmt::rt::v1::Alignment::Unknown, + flags: + 0u32, + precision: + ::std::fmt::rt::v1::Count::Implied, + width: + ::std::fmt::rt::v1::Count::Implied,},}]), + &("polkadot/runtime/src/lib.rs", + 195u32, 2u32)) + } + }; + let output = + (|header| + super::Executive::initialise_block(&header))(input); + Some(::codec::Slicable::encode(&output)) + } + } + "apply_extrinsic" => { + { + let mut data = data; + let input = + match ::codec::Slicable::decode(&mut data) { + Some(input) => input, + None => { + ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], + &match (&"apply_extrinsic",) + { + (arg0,) + => + [::std::fmt::ArgumentV1::new(arg0, + ::std::fmt::Display::fmt)], + }, + &[::std::fmt::rt::v1::Argument{position: + ::std::fmt::rt::v1::Position::At(0usize), + format: + ::std::fmt::rt::v1::FormatSpec{fill: + ' ', + align: + ::std::fmt::rt::v1::Alignment::Unknown, + flags: + 0u32, + precision: + ::std::fmt::rt::v1::Count::Implied, + width: + ::std::fmt::rt::v1::Count::Implied,},}]), + &("polkadot/runtime/src/lib.rs", + 195u32, 2u32)) + } + }; + let output = + (|extrinsic| + super::Executive::apply_extrinsic(extrinsic))(input); + Some(::codec::Slicable::encode(&output)) + } + } + "execute_block" => { + { + let mut data = data; + let input = + match ::codec::Slicable::decode(&mut data) { + Some(input) => input, + None => { + ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], + &match (&"execute_block",) + { + (arg0,) + => + [::std::fmt::ArgumentV1::new(arg0, + ::std::fmt::Display::fmt)], + }, + &[::std::fmt::rt::v1::Argument{position: + ::std::fmt::rt::v1::Position::At(0usize), + format: + ::std::fmt::rt::v1::FormatSpec{fill: + ' ', + align: + ::std::fmt::rt::v1::Alignment::Unknown, + flags: + 0u32, + precision: + ::std::fmt::rt::v1::Count::Implied, + width: + ::std::fmt::rt::v1::Count::Implied,},}]), + &("polkadot/runtime/src/lib.rs", + 195u32, 2u32)) + } + }; + let output = + (|block| + super::Executive::execute_block(block))(input); + Some(::codec::Slicable::encode(&output)) + } + } + "finalise_block" => { + { + let mut data = data; + let input = + match ::codec::Slicable::decode(&mut data) { + Some(input) => input, + None => { + ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], + &match (&"finalise_block",) + { + (arg0,) + => + [::std::fmt::ArgumentV1::new(arg0, + ::std::fmt::Display::fmt)], + }, + &[::std::fmt::rt::v1::Argument{position: + ::std::fmt::rt::v1::Position::At(0usize), + format: + ::std::fmt::rt::v1::FormatSpec{fill: + ' ', + align: + ::std::fmt::rt::v1::Alignment::Unknown, + flags: + 0u32, + precision: + ::std::fmt::rt::v1::Count::Implied, + width: + ::std::fmt::rt::v1::Count::Implied,},}]), + &("polkadot/runtime/src/lib.rs", + 195u32, 2u32)) + } + }; + let output = + (|()| super::Executive::finalise_block())(input); + Some(::codec::Slicable::encode(&output)) + } + } + "validator_count" => { + { + let mut data = data; + let input = + match ::codec::Slicable::decode(&mut data) { + Some(input) => input, + None => { + ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], + &match (&"validator_count",) + { + (arg0,) + => + [::std::fmt::ArgumentV1::new(arg0, + ::std::fmt::Display::fmt)], + }, + &[::std::fmt::rt::v1::Argument{position: + ::std::fmt::rt::v1::Position::At(0usize), + format: + ::std::fmt::rt::v1::FormatSpec{fill: + ' ', + align: + ::std::fmt::rt::v1::Alignment::Unknown, + flags: + 0u32, + precision: + ::std::fmt::rt::v1::Count::Implied, + width: + ::std::fmt::rt::v1::Count::Implied,},}]), + &("polkadot/runtime/src/lib.rs", + 195u32, 2u32)) + } + }; + let output = + (|()| super::Session::validator_count())(input); + Some(::codec::Slicable::encode(&output)) + } + } + "validators" => { + { + let mut data = data; + let input = + match ::codec::Slicable::decode(&mut data) { + Some(input) => input, + None => { + ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], + &match (&"validators",) + { + (arg0,) + => + [::std::fmt::ArgumentV1::new(arg0, + ::std::fmt::Display::fmt)], + }, + &[::std::fmt::rt::v1::Argument{position: + ::std::fmt::rt::v1::Position::At(0usize), + format: + ::std::fmt::rt::v1::FormatSpec{fill: + ' ', + align: + ::std::fmt::rt::v1::Alignment::Unknown, + flags: + 0u32, + precision: + ::std::fmt::rt::v1::Count::Implied, + width: + ::std::fmt::rt::v1::Count::Implied,},}]), + &("polkadot/runtime/src/lib.rs", + 195u32, 2u32)) + } + }; + let output = (|()| super::Session::validators())(input); + Some(::codec::Slicable::encode(&output)) + } + } + _ => None, + } + } +} diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index f5e0baa5394e0..1f7a94cf8c24a 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -21,6 +21,7 @@ #[cfg(feature = "std")] #[macro_use] extern crate serde_derive; + #[cfg(feature = "std")] extern crate serde; @@ -28,7 +29,7 @@ extern crate serde; extern crate substrate_runtime_io as runtime_io; #[macro_use] -extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_support; #[macro_use] extern crate substrate_runtime_primitives as runtime_primitives; @@ -149,7 +150,7 @@ pub type Parachains = parachains::Module; impl_outer_dispatch! { /// Call type for polkadot transactions. #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum Call where aux: ::PublicAux { Consensus = 0, Session = 1, @@ -163,7 +164,7 @@ impl_outer_dispatch! { /// Internal calls. #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum PrivCall { Consensus = 0, Session = 1, diff --git a/polkadot/runtime/src/parachains.rs b/polkadot/runtime/src/parachains.rs index b1f0dbd47767e..5bd62afcf246c 100644 --- a/polkadot/runtime/src/parachains.rs +++ b/polkadot/runtime/src/parachains.rs @@ -19,14 +19,13 @@ use primitives; use rstd::prelude::*; use codec::{Slicable, Joiner}; -use runtime_support::Hashable; use runtime_primitives::traits::{Executable, RefInto, MaybeEmpty}; use primitives::parachain::{Id, Chain, DutyRoster, CandidateReceipt}; use {system, session}; -use runtime_support::{StorageValue, StorageMap}; -use runtime_support::dispatch::Result; +use substrate_runtime_support::{Hashable, StorageValue, StorageMap}; +use substrate_runtime_support::dispatch::Result; #[cfg(any(feature = "std", test))] use rstd::marker::PhantomData; @@ -43,12 +42,9 @@ pub trait Trait: system::Trait + session::Trait { decl_module! { /// Parachains module. - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct Module; /// Call type for parachains. - #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: ::PublicAux { // provide candidate receipts for parachains, in ascending order by id. diff --git a/polkadot/runtime/src/primitives.rs b/polkadot/runtime/src/primitives.rs index 34445a8c85227..156f071d5eba4 100644 --- a/polkadot/runtime/src/primitives.rs +++ b/polkadot/runtime/src/primitives.rs @@ -97,7 +97,7 @@ pub mod parachain { /// Unique identifier of a parachain. #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct Id(u32); impl From for u32 { @@ -199,7 +199,7 @@ pub mod parachain { /// Extrinsic data for a parachain. #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Extrinsic; @@ -208,7 +208,7 @@ pub mod parachain { /// /// https://github.com/w3f/polkadot-spec/blob/master/spec.md#candidate-para-chain-block #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Candidate { @@ -226,7 +226,7 @@ pub mod parachain { /// Candidate receipt type. #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Debug, Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct CandidateReceipt { @@ -295,7 +295,7 @@ pub mod parachain { /// Parachain ingress queue message. #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct Message(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Consolidated ingress queue data. @@ -303,34 +303,34 @@ pub mod parachain { /// This is just an ordered vector of other parachains' egress queues, /// obtained according to the routing rules. #[derive(Default, PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct ConsolidatedIngress(pub Vec<(Id, Vec)>); /// Parachain block data. /// /// contains everything required to validate para-block, may contain block and witness data #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Parachain header raw bytes wrapper type. #[derive(PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct Header(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Parachain head data included in the chain. #[derive(PartialEq, Eq, Clone, PartialOrd, Ord)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Parachain validation code. #[derive(PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Activitiy bit field #[derive(PartialEq, Eq, Clone, Default)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct Activity(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); impl Slicable for Activity { diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 1f886f4c60d04..b19c12818ae6c 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -20,7 +20,6 @@ pub use rstd::prelude::{Vec, Clone, Eq, PartialEq}; #[cfg(feature = "std")] pub use std::fmt; pub use rstd::result; -pub use rstd::marker::PhantomData; #[cfg(feature = "std")] use serde; pub use codec::{Slicable, Input}; @@ -47,6 +46,9 @@ pub trait AuxCallable { type Call: AuxDispatchable + Slicable + Clone + PartialEq + Eq; } +// dirty hack to work around serde_derive issue. +pub type AuxCallableCallFor = ::Call; + #[cfg(feature = "std")] pub trait Callable { type Call: Dispatchable + Slicable + ::serde::Serialize + Clone + PartialEq + Eq; @@ -56,6 +58,9 @@ pub trait Callable { type Call: Dispatchable + Slicable + Clone + PartialEq + Eq; } +// dirty hack to work around serde_derive issue. +pub type CallableCallFor = ::Call; + #[cfg(feature = "std")] pub trait Parameter: Slicable + serde::Serialize + Clone + Eq + fmt::Debug {} @@ -77,8 +82,17 @@ macro_rules! decl_module { pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident>; $($rest:tt)* ) => { + // TODO: switching based on std feature is because of an issue in + // serde-derive for when we attempt to derive `Deserialize` on these types, + // in a situation where we've imported `substrate_runtime_support` as another name. + #[cfg(feature = "std")] $(#[$attr])* - pub struct $mod_type<$trait_instance: $trait_name>($crate::dispatch::PhantomData<$trait_instance>); + pub struct $mod_type<$trait_instance: $trait_name>(::std::marker::PhantomData<$trait_instance>); + + #[cfg(not(feature = "std"))] + $(#[$attr])* + pub struct $mod_type<$trait_instance: $trait_name>(::core::marker::PhantomData<$trait_instance>); + decl_dispatch! { impl for $mod_type<$trait_instance: $trait_name>; $($rest)* @@ -89,8 +103,13 @@ macro_rules! decl_module { struct $mod_type:ident<$trait_instance:ident: $trait_name:ident>; $($rest:tt)* ) => { + #[cfg(feature = "std")] + $(#[$attr])* + struct $mod_type<$trait_instance: $trait_name>(::std::marker::PhantomData<$trait_instance>); + + #[cfg(not(feature = "std"))] $(#[$attr])* - struct $mod_type<$trait_instance: $trait_name>($crate::dispatch::PhantomData<$trait_instance>); + struct $mod_type<$trait_instance: $trait_name>(::core::marker::PhantomData<$trait_instance>); decl_dispatch! { impl for $mod_type<$trait_instance: $trait_name>; $($rest)* @@ -265,8 +284,8 @@ macro_rules! __decl_dispatch_module_with_aux { }; } -#[macro_export] /// Implement a single dispatch modules to create a pairing of a dispatch trait and enum. +#[macro_export] macro_rules! __decl_dispatch_module_common { ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; @@ -282,9 +301,20 @@ macro_rules! __decl_dispatch_module_common { = $id:expr ; )* ) => { + #[cfg(feature = "std")] $(#[$attr])* pub enum $call_type<$trait_instance: $trait_name> { - __PhantomItem($crate::dispatch::PhantomData<$trait_instance>), + __PhantomItem(::std::marker::PhantomData<$trait_instance>), + $( + #[allow(non_camel_case_types)] + $fn_name ( $( $param ),* ), + )* + } + + #[cfg(not(feature = "std"))] + $(#[$attr])* + pub enum $call_type<$trait_instance: $trait_name> { + __PhantomItem(::core::marker::PhantomData<$trait_instance>), $( #[allow(non_camel_case_types)] $fn_name ( $( $param ),* ), @@ -417,7 +447,7 @@ macro_rules! impl_outer_dispatch { $(#[$attr])* pub enum $call_type { $( - $camelcase ( <$camelcase as $crate::dispatch::AuxCallable>::Call ) + $camelcase ( $crate::dispatch::AuxCallableCallFor<$camelcase> ) ,)* } impl_outer_dispatch_common! { $call_type, $($camelcase = $id,)* } @@ -454,10 +484,10 @@ macro_rules! impl_outer_dispatch { } $( $rest:tt )* ) => { - $(#[$attr:meta])* + $(#[$attr])* pub enum $call_type { $( - $camelcase ( <$camelcase as $crate::dispatch::Callable>::Call ) + $camelcase ( $crate::dispatch::CallableCallFor<$camelcase> ) ,)* } impl_outer_dispatch_common! { $call_type, $($camelcase = $id,)* } diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index c73dcb69fec71..0f73c6b0b0e9e 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -64,18 +64,14 @@ pub trait Trait: system::Trait { } decl_module! { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn report_misbehavior(aux, report: MisbehaviorReport) -> Result = 0; } - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn set_code(new: Vec) -> Result = 0; fn set_storage(items: Vec) -> Result = 1; diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index fee1b01b2e798..b15128c656156 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -105,12 +105,9 @@ pub type VoteIndex = u32; pub trait Trait: democracy::Trait {} decl_module! { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn set_approvals(aux, votes: Vec, index: VoteIndex) -> Result = 0; fn reap_inactive_voter(aux, signed_index: u32, who: T::AccountId, who_index: u32, assumed_vote_index: VoteIndex) -> Result = 1; @@ -119,8 +116,7 @@ decl_module! { fn present_winner(aux, candidate: T::AccountId, total: T::Balance, index: VoteIndex) -> Result = 4; } - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn set_desired_seats(count: u32) -> Result = 0; fn remove_member(who: T::AccountId) -> Result = 1; diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index 99e36e99be985..9b59449dc35c3 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -26,11 +26,8 @@ use {system, democracy}; use super::{Trait, Module as Council}; decl_module! { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct Module; - #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn propose(aux, proposal: Box) -> Result = 0; @@ -38,7 +35,6 @@ decl_module! { fn veto(aux, proposal_hash: T::Hash) -> Result = 2; } - #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn set_cooloff_period(blocks: T::BlockNumber) -> Result = 0; diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 66dcfb21fbeea..75ea9408600d1 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -44,7 +44,7 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::result; -use primitives::traits::{Zero, Executable, RefInto, As}; +use primitives::traits::{Zero, Executable, RefInto, As, MaybeSerializeDebug}; use runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; use runtime_support::dispatch::Result; @@ -57,24 +57,20 @@ pub type PropIndex = u32; pub type ReferendumIndex = u32; pub trait Trait: staking::Trait + Sized { - type Proposal: Parameter + Dispatchable + IsSubType>; + type Proposal: Parameter + Dispatchable + IsSubType> + MaybeSerializeDebug; } decl_module! { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn propose(aux, proposal: Box, value: T::Balance) -> Result = 0; fn second(aux, proposal: PropIndex) -> Result = 1; fn vote(aux, ref_index: ReferendumIndex, approve_proposal: bool) -> Result = 2; } - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn start_referendum(proposal: Box, vote_threshold: VoteThreshold) -> Result = 0; fn cancel_referendum(ref_index: ReferendumIndex) -> Result = 1; diff --git a/substrate/runtime/democracy/src/vote_threshold.rs b/substrate/runtime/democracy/src/vote_threshold.rs index 5797d4176486a..8512417b03cc8 100644 --- a/substrate/runtime/democracy/src/vote_threshold.rs +++ b/substrate/runtime/democracy/src/vote_threshold.rs @@ -22,7 +22,7 @@ use rstd::ops::{Add, Mul, Div, Rem}; /// A means of determining if a vote is past pass threshold. #[derive(Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub enum VoteThreshold { /// A supermajority of approvals is needed to pass this vote. SuperMajorityApprove, diff --git a/substrate/runtime/executive/Cargo.toml b/substrate/runtime/executive/Cargo.toml index 64e2f89d06eed..5b1280c2490fa 100644 --- a/substrate/runtime/executive/Cargo.toml +++ b/substrate/runtime/executive/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } -serde_derive = { version = "1.0", optional = true } substrate-codec = { path = "../../codec", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } @@ -26,7 +25,6 @@ std = [ "substrate-runtime-std/std", "substrate-runtime-support/std", "serde/std", - "serde_derive", "substrate-codec/std", "substrate-runtime-primitives/std", "substrate-runtime-io/std", diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 1bac74d060203..f9079c3739f0b 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -21,10 +21,6 @@ #[cfg(feature = "std")] extern crate serde; -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_io as runtime_io; diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 64edb89de4b5e..5d95f28c539c1 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -54,18 +54,14 @@ pub trait Trait: consensus::Trait { } decl_module! { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn set_key(aux, key: T::SessionKey) -> Result = 0; } - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn set_length(new: T::BlockNumber) -> Result = 0; fn force_new_session() -> Result = 1; diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 505a7938ba011..c7a165b200a59 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -102,20 +102,16 @@ pub trait Trait: system::Trait + session::Trait { } decl_module! { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn transfer(aux, dest: T::AccountId, value: T::Balance) -> Result = 0; fn stake(aux) -> Result = 1; fn unstake(aux) -> Result = 2; } - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn set_sessions_per_era(new: T::BlockNumber) -> Result = 0; fn set_bonding_duration(new: T::BlockNumber) -> Result = 1; diff --git a/substrate/runtime/system/Cargo.toml b/substrate/runtime/system/Cargo.toml index 38fb97b582f5c..89d4e48e201b8 100644 --- a/substrate/runtime/system/Cargo.toml +++ b/substrate/runtime/system/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } -serde_derive = { version = "1.0", optional = true } safe-mix = { path = "../../../safe-mix", default_features = false} substrate-codec = { path = "../../codec", default_features = false } substrate-primitives = { path = "../../primitives", default_features = false } @@ -19,7 +18,6 @@ substrate-runtime-primitives = { path = "../primitives", default_features = fals default = ["std"] std = [ "serde/std", - "serde_derive", "safe-mix/std", "substrate-codec/std", "substrate-primitives/std", diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 626a2c117bddc..71523c8c01ecd 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -28,10 +28,6 @@ extern crate substrate_runtime_support as runtime_support; #[cfg(feature = "std")] extern crate serde; -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; extern crate substrate_runtime_primitives as primitives; @@ -78,8 +74,6 @@ pub trait Trait { } decl_module! { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; } diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 74d49b3840976..b6711468deabe 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -49,12 +49,9 @@ pub trait Trait: HasPublicAux + system::Trait { } decl_module! { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] pub struct Module; - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize))] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn set(aux, now: T::Value) -> Result = 0; } From c158c1631f1acfafb9e524f3e71b6fd1c7728135 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 2 Jun 2018 01:51:58 +0200 Subject: [PATCH 37/60] get demo-runtime compiling on std --- demo/runtime/src/lib.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 8ff61faf1b6c0..7241fef32c885 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -22,11 +22,18 @@ extern crate substrate_runtime_io as runtime_io; #[macro_use] -extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_support; #[macro_use] extern crate substrate_runtime_primitives as runtime_primitives; +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + +#[cfg(feature = "std")] +extern crate serde; + extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_council as council; @@ -121,6 +128,8 @@ pub type Council = council::Module; pub type CouncilVoting = council::voting::Module; impl_outer_dispatch! { + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum Call where aux: ::PublicAux { Consensus = 0, Session = 1, @@ -131,6 +140,8 @@ impl_outer_dispatch! { CouncilVoting = 7, } + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum PrivCall { Consensus = 0, Session = 1, From 91409b694a2ae12f3d91e9179ff05faad3542aa2 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 2 Jun 2018 02:21:29 +0200 Subject: [PATCH 38/60] port extrinsic-pool --- Cargo.lock | 1 - substrate/extrinsic-pool/Cargo.toml | 1 - substrate/extrinsic-pool/src/api.rs | 18 +++++++--------- substrate/extrinsic-pool/src/lib.rs | 1 - substrate/extrinsic-pool/src/listener.rs | 23 ++++++++++---------- substrate/extrinsic-pool/src/pool.rs | 20 ++++++++++-------- substrate/extrinsic-pool/src/watcher.rs | 27 +++++++++++------------- 7 files changed, 43 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c65b41318c4cd..14ee692f3b0c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1966,7 +1966,6 @@ dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-primitives 0.1.0", "transaction-pool 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/substrate/extrinsic-pool/Cargo.toml b/substrate/extrinsic-pool/Cargo.toml index aecd25ba8d5ee..88f639117b286 100644 --- a/substrate/extrinsic-pool/Cargo.toml +++ b/substrate/extrinsic-pool/Cargo.toml @@ -8,5 +8,4 @@ error-chain = "0.11" futures = "0.1" log = "0.3" parking_lot = "0.4" -substrate-primitives = { path = "../primitives" } transaction-pool = "1.12" diff --git a/substrate/extrinsic-pool/src/api.rs b/substrate/extrinsic-pool/src/api.rs index a7841e3ef6e70..ba76c45c046c5 100644 --- a/substrate/extrinsic-pool/src/api.rs +++ b/substrate/extrinsic-pool/src/api.rs @@ -16,12 +16,9 @@ //! External API for extrinsic pool. +use std::fmt; use std::ops::Deref; use txpool::{self, VerifiedTransaction}; -use primitives::{ - Hash, - block::{Extrinsic, ExtrinsicHash}, -}; /// Extrinsic pool error. pub trait Error: ::std::error::Error + Send + Sized { @@ -38,18 +35,19 @@ impl Error for txpool::Error { } /// Extrinsic pool. -pub trait ExtrinsicPool: Send + Sync + 'static { +pub trait ExtrinsicPool: Send + Sync + 'static { /// Error type type Error: Error; /// Submit a collection of extrinsics to the pool. - fn submit(&self, xt: Vec) -> Result, Self::Error>; + fn submit(&self, xt: Vec) -> Result, Self::Error>; } // Blanket implementation for anything that `Derefs` to the pool. -impl ExtrinsicPool for T where - T: Deref> + Send + Sync + 'static, - V: txpool::Verifier, +impl ExtrinsicPool for T where + Hash: ::std::hash::Hash + Eq + Copy + fmt::Debug + fmt::LowerHex + Default, + T: Deref> + Send + Sync + 'static, + V: txpool::Verifier, S: txpool::Scoring, V::VerifiedTransaction: txpool::VerifiedTransaction, E: From, @@ -58,7 +56,7 @@ impl ExtrinsicPool for T where { type Error = E; - fn submit(&self, xt: Vec) -> Result, Self::Error> { + fn submit(&self, xt: Vec) -> Result, Self::Error> { self.deref().submit(xt).map(|result| result.into_iter().map(|xt| *xt.hash()).collect()) } } diff --git a/substrate/extrinsic-pool/src/lib.rs b/substrate/extrinsic-pool/src/lib.rs index 35ed5e3d6e9e4..c7b44a57096e9 100644 --- a/substrate/extrinsic-pool/src/lib.rs +++ b/substrate/extrinsic-pool/src/lib.rs @@ -20,7 +20,6 @@ extern crate futures; extern crate parking_lot; -extern crate substrate_primitives as primitives; #[macro_use] extern crate log; diff --git a/substrate/extrinsic-pool/src/listener.rs b/substrate/extrinsic-pool/src/listener.rs index 948ad205dde7a..106c1f23e62f2 100644 --- a/substrate/extrinsic-pool/src/listener.rs +++ b/substrate/extrinsic-pool/src/listener.rs @@ -16,29 +16,29 @@ use std::{ sync::Arc, + fmt, collections::HashMap, }; -use primitives::Hash; use txpool; use watcher; #[derive(Default)] -pub struct Listener { - watchers: HashMap +pub struct Listener { + watchers: HashMap> } -impl Listener { - pub fn create_watcher>(&mut self, xt: Arc) -> watcher::Watcher { +impl Listener { + pub fn create_watcher>(&mut self, xt: Arc) -> watcher::Watcher { let sender = self.watchers.entry(*xt.hash()).or_insert_with(watcher::Sender::default); sender.new_watcher() } - pub fn broadcasted(&mut self, hash: &Hash, peers: Vec) { + pub fn broadcasted(&mut self, hash: &H, peers: Vec) { self.fire(hash, |watcher| watcher.broadcast(peers)); } - fn fire(&mut self, hash: &Hash, fun: F) { + fn fire(&mut self, hash: &H, fun: F) where F: FnOnce(&mut watcher::Sender) { let clean = if let Some(h) = self.watchers.get_mut(hash) { fun(h); h.is_done() @@ -52,7 +52,10 @@ impl Listener { } } -impl> txpool::Listener for Listener { +impl txpool::Listener for Listener where + H: ::std::hash::Hash + Eq + Copy + fmt::Debug + fmt::LowerHex + Default, + T: txpool::VerifiedTransaction, +{ fn added(&mut self, tx: &Arc, old: Option<&Arc>) { if let Some(old) = old { let hash = tx.hash(); @@ -81,9 +84,7 @@ impl> txpool::Listener for Listener fn mined(&mut self, tx: &Arc) { // TODO [ToDr] latest block number? - let header_hash = 1.into(); + let header_hash = Default::default(); self.fire(tx.hash(), |watcher| watcher.finalised(header_hash)) } } - - diff --git a/substrate/extrinsic-pool/src/pool.rs b/substrate/extrinsic-pool/src/pool.rs index 433a4dc2b47e2..c0e44b3edb7cc 100644 --- a/substrate/extrinsic-pool/src/pool.rs +++ b/substrate/extrinsic-pool/src/pool.rs @@ -16,6 +16,7 @@ use std::{ collections::HashMap, + fmt, marker::PhantomData, sync::{Arc, Weak}, }; @@ -23,28 +24,29 @@ use std::{ use futures::sync::mpsc; use parking_lot::{RwLock, Mutex}; use txpool; -use primitives::{Hash, block::Extrinsic}; use listener::Listener; use watcher::Watcher; /// Extrinsics pool. -pub struct Pool where - V: txpool::Verifier, +pub struct Pool where + Hash: ::std::hash::Hash + Eq + Copy + fmt::Debug + fmt::LowerHex, + V: txpool::Verifier, S: txpool::Scoring, { _error: Mutex>, pool: RwLock, >>, verifier: V, import_notification_sinks: Mutex>>>, } -impl Pool where - V: txpool::Verifier, +impl Pool where + Hash: ::std::hash::Hash + Eq + Copy + fmt::Debug + fmt::LowerHex + Default, + V: txpool::Verifier, S: txpool::Scoring, V::VerifiedTransaction: txpool::VerifiedTransaction, E: From, @@ -86,7 +88,7 @@ impl Pool where } /// Imports a bunch of extrinsics to the pool - pub fn submit(&self, xts: Vec) -> Result>, E> { + pub fn submit(&self, xts: Vec) -> Result>, E> { xts .into_iter() .map(|xt| self.verifier.verify_transaction(xt)) @@ -97,7 +99,7 @@ impl Pool where } /// Import a single extrinsic and starts to watch their progress in the pool. - pub fn submit_and_watch(&self, xt: Extrinsic) -> Result { + pub fn submit_and_watch(&self, xt: Ex) -> Result, E> { let xt = self.submit(vec![xt])?.pop().expect("One extrinsic passed; one result returned; qed"); Ok(self.pool.write().listener_mut().create_watcher(xt)) } @@ -122,7 +124,7 @@ impl Pool where /// Cull transactions from the queue and then compute the pending set. pub fn cull_and_get_pending(&self, ready: R, f: F) -> T where R: txpool::Ready + Clone, - F: FnOnce(txpool::PendingIterator) -> T, + F: FnOnce(txpool::PendingIterator>) -> T, { let mut pool = self.pool.write(); pool.cull(None, ready.clone()); diff --git a/substrate/extrinsic-pool/src/watcher.rs b/substrate/extrinsic-pool/src/watcher.rs index 3b3dc4cc532a9..e4d8b9921f8ff 100644 --- a/substrate/extrinsic-pool/src/watcher.rs +++ b/substrate/extrinsic-pool/src/watcher.rs @@ -15,17 +15,14 @@ // along with Polkadot. If not, see . use futures::sync::mpsc; -use primitives::{ - block::{HeaderHash, ExtrinsicHash} -}; /// Possible extrinsic status events #[derive(Debug, Clone)] -pub enum Status { +pub enum Status { /// Extrinsic has been finalised in block with given hash. - Finalised(HeaderHash), + Finalised(H), /// Some state change (perhaps another extrinsic was included) rendered this extrinsic invalid. - Usurped(ExtrinsicHash), + Usurped(H), /// The extrinsic has been broadcast to the given peers. Broadcast(Vec), /// Extrinsic has been dropped from the pool because of the limit. @@ -36,19 +33,19 @@ pub enum Status { /// /// Represents a stream of status updates for particular extrinsic. #[derive(Debug)] -pub struct Watcher { - receiver: mpsc::UnboundedReceiver, +pub struct Watcher { + receiver: mpsc::UnboundedReceiver>, } #[derive(Debug, Default)] -pub(crate) struct Sender { - receivers: Vec>, +pub(crate) struct Sender { + receivers: Vec>>, finalised: bool, } -impl Sender { +impl Sender { /// Add a new watcher to this sender object. - pub fn new_watcher(&mut self) -> Watcher { + pub fn new_watcher(&mut self) -> Watcher { let (tx, receiver) = mpsc::unbounded(); self.receivers.push(tx); Watcher { @@ -57,12 +54,12 @@ impl Sender { } /// Some state change (perhaps another extrinsic was included) rendered this extrinsic invalid. - pub fn usurped(&mut self, hash: ExtrinsicHash) { + pub fn usurped(&mut self, hash: H) { self.send(Status::Usurped(hash)) } /// Extrinsic has been finalised in block with given hash. - pub fn finalised(&mut self, hash: HeaderHash) { + pub fn finalised(&mut self, hash: H) { self.send(Status::Finalised(hash)); self.finalised = true; } @@ -82,7 +79,7 @@ impl Sender { self.finalised || self.receivers.is_empty() } - fn send(&mut self, status: Status) { + fn send(&mut self, status: Status) { self.receivers.retain(|sender| sender.unbounded_send(status.clone()).is_ok()) } } From 88629b33d23d738dd7fe1a9cf0bf4eecb58edfd7 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 2 Jun 2018 03:15:28 +0200 Subject: [PATCH 39/60] primitives reshuffling --- Cargo.lock | 7 +- Cargo.toml | 1 - polkadot/api/Cargo.toml | 1 - polkadot/api/src/lib.rs | 2 +- polkadot/cli/Cargo.toml | 1 - polkadot/cli/src/informant.rs | 3 +- polkadot/cli/src/lib.rs | 1 - polkadot/collator/Cargo.toml | 2 +- polkadot/collator/src/lib.rs | 6 +- polkadot/consensus/src/lib.rs | 2 +- polkadot/executor/Cargo.toml | 2 - polkadot/executor/src/lib.rs | 1 - polkadot/primitives/src/lib.rs | 380 ++++++++++++++++++ polkadot/runtime/src/lib.rs | 8 +- polkadot/runtime/src/primitives.rs | 413 -------------------- substrate/client/src/client.rs | 13 +- substrate/misbehavior-check/Cargo.toml | 3 +- substrate/misbehavior-check/src/lib.rs | 55 +-- substrate/runtime/primitives/src/generic.rs | 126 ++---- substrate/runtime/primitives/src/lib.rs | 22 ++ substrate/runtime/primitives/src/testing.rs | 3 +- substrate/test-client/src/client_ext.rs | 1 - substrate/test-runtime/src/lib.rs | 2 +- 23 files changed, 489 insertions(+), 566 deletions(-) delete mode 100644 polkadot/runtime/src/primitives.rs diff --git a/Cargo.lock b/Cargo.lock index 14ee692f3b0c5..af498a811938f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1224,7 +1224,6 @@ version = "0.1.0" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "polkadot-executor 0.1.0", - "polkadot-primitives 0.1.0", "polkadot-runtime 0.1.0", "substrate-client 0.1.0", "substrate-codec 0.1.0", @@ -1255,7 +1254,6 @@ dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "polkadot-executor 0.1.0", - "polkadot-primitives 0.1.0", "polkadot-runtime 0.1.0", "polkadot-service 0.1.0", "polkadot-transaction-pool 0.1.0", @@ -1280,7 +1278,7 @@ version = "0.1.0" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "polkadot-parachain 0.1.0", - "polkadot-primitives 0.1.0", + "polkadot-runtime 0.1.0", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", ] @@ -1318,8 +1316,6 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "polkadot-primitives 0.1.0", - "polkadot-runtime 0.1.0", "substrate-codec 0.1.0", "substrate-executor 0.1.0", "substrate-keyring 0.1.0", @@ -1987,6 +1983,7 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index d58205e310b19..40c6e8fdbf24c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,6 @@ members = [ "polkadot/executor", "polkadot/keystore", "polkadot/parachain", - "polkadot/primitives", "polkadot/runtime", "polkadot/service", "polkadot/statement-table", diff --git a/polkadot/api/Cargo.toml b/polkadot/api/Cargo.toml index 860536ac95913..76c523878e07e 100644 --- a/polkadot/api/Cargo.toml +++ b/polkadot/api/Cargo.toml @@ -7,7 +7,6 @@ authors = ["Parity Technologies "] error-chain = "0.11" polkadot-executor = { path = "../executor" } polkadot-runtime = { path = "../runtime" } -polkadot-primitives = { path = "../primitives" } substrate-codec = { path = "../../substrate/codec" } substrate-runtime-io = { path = "../../substrate/runtime-io" } substrate-runtime-executive = { path = "../../substrate/runtime/executive" } diff --git a/polkadot/api/src/lib.rs b/polkadot/api/src/lib.rs index bef92d4d9f509..6313f17ce546a 100644 --- a/polkadot/api/src/lib.rs +++ b/polkadot/api/src/lib.rs @@ -19,7 +19,6 @@ extern crate polkadot_executor; extern crate polkadot_runtime as runtime; -extern crate polkadot_primitives as primitives; extern crate substrate_codec as codec; extern crate substrate_runtime_io as runtime_io; extern crate substrate_client as client; @@ -37,6 +36,7 @@ extern crate substrate_keyring as keyring; pub mod full; pub mod light; +use polkadot_runtime::primitives as primitives; use primitives::{AccountId, BlockId, Hash, Index, SessionKey, Timestamp}; use primitives::parachain::{DutyRoster, CandidateReceipt, Id as ParaId}; use runtime::{Block, UncheckedExtrinsic}; diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index f80b3b1d9fc18..ed59ec8ae10ab 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -32,7 +32,6 @@ substrate-executor = { path = "../../substrate/executor" } substrate-primitives = { path = "../../substrate/primitives" } substrate-rpc = { path = "../../substrate/rpc" } substrate-rpc-servers = { path = "../../substrate/rpc-servers" } -polkadot-primitives = { path = "../primitives" } polkadot-executor = { path = "../executor" } polkadot-runtime = { path = "../runtime" } polkadot-service = { path = "../service" } diff --git a/polkadot/cli/src/informant.rs b/polkadot/cli/src/informant.rs index 54affa839ee61..8c5f6deca24ff 100644 --- a/polkadot/cli/src/informant.rs +++ b/polkadot/cli/src/informant.rs @@ -22,7 +22,6 @@ use service::Service; use tokio_core::reactor; use network::{SyncState, SyncProvider}; use runtime_support::Hashable; -use primitives::block::HeaderHash; use state_machine; use client::{self, BlockchainEvents}; @@ -45,7 +44,7 @@ pub fn start(service: &Service, handle: reactor::Handle) let sync_status = network.status(); if let Ok(best_block) = client.best_block_header() { - let hash: HeaderHash = best_block.blake2_256().into(); + let hash = best_block.hash(); let status = match (sync_status.sync.state, sync_status.sync.best_seen_block) { (SyncState::Idle, _) => "Idle".into(), (SyncState::Downloading, None) => "Syncing".into(), diff --git a/polkadot/cli/src/lib.rs b/polkadot/cli/src/lib.rs index f734b154cd0d8..18c66dbc570ca 100644 --- a/polkadot/cli/src/lib.rs +++ b/polkadot/cli/src/lib.rs @@ -40,7 +40,6 @@ extern crate substrate_network as network; extern crate substrate_rpc; extern crate substrate_rpc_servers as rpc; extern crate substrate_runtime_support as runtime_support; -extern crate polkadot_primitives; extern crate polkadot_executor; extern crate polkadot_runtime; extern crate polkadot_service as service; diff --git a/polkadot/collator/Cargo.toml b/polkadot/collator/Cargo.toml index 42fc14c666c18..530d804edf8fc 100644 --- a/polkadot/collator/Cargo.toml +++ b/polkadot/collator/Cargo.toml @@ -8,5 +8,5 @@ description = "Abstract collation logic" futures = "0.1.17" substrate-codec = { path = "../../substrate/codec", version = "0.1" } substrate-primitives = { path = "../../substrate/primitives", version = "0.1" } -polkadot-primitives = { path = "../primitives", version = "0.1" } +polkadot-runtime = { path = "../runtime", version = "0.1" } polkadot-parachain = { path = "../parachain", version = "0.1" } diff --git a/polkadot/collator/src/lib.rs b/polkadot/collator/src/lib.rs index 967a8e6de6fc7..c95ed08b1bfcb 100644 --- a/polkadot/collator/src/lib.rs +++ b/polkadot/collator/src/lib.rs @@ -47,12 +47,12 @@ extern crate futures; extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; -extern crate polkadot_primitives; +extern crate polkadot_runtime; use std::collections::{BTreeSet, BTreeMap}; use futures::{stream, Stream, Future, IntoFuture}; -use polkadot_primitives::parachain::{self, ConsolidatedIngress, Message, Id as ParaId}; +use polkadot_runtime::primitives::parachain::{self, ConsolidatedIngress, Message, Id as ParaId}; /// Parachain context needed for collation. /// @@ -149,7 +149,7 @@ mod tests { use std::collections::{HashMap, BTreeSet}; use futures::Future; - use polkadot_primitives::parachain::{Message, Id as ParaId}; + use polkadot_runtime::primitives::parachain::{Message, Id as ParaId}; pub struct DummyRelayChainCtx { egresses: HashMap>>, diff --git a/polkadot/consensus/src/lib.rs b/polkadot/consensus/src/lib.rs index def896548e400..2fa6c66b86326 100644 --- a/polkadot/consensus/src/lib.rs +++ b/polkadot/consensus/src/lib.rs @@ -35,7 +35,6 @@ extern crate polkadot_api; extern crate polkadot_collator as collator; extern crate polkadot_statement_table as table; extern crate polkadot_parachain as parachain; -extern crate polkadot_primitives; extern crate polkadot_transaction_pool as transaction_pool; extern crate polkadot_runtime; @@ -69,6 +68,7 @@ use codec::Slicable; use table::generic::Statement as GenericStatement; use runtime_support::Hashable; use polkadot_api::{PolkadotApi, BlockBuilder}; +use polkadot_runtime::primitives as polkadot_primitives; use polkadot_primitives::{Hash, Timestamp}; use polkadot_primitives::parachain::{Id as ParaId, Chain, DutyRoster, BlockData, Extrinsic, CandidateReceipt}; use primitives::block::{Block as SubstrateBlock, Header as SubstrateHeader, HeaderHash, Id as BlockId, Number as BlockNumber}; diff --git a/polkadot/executor/Cargo.toml b/polkadot/executor/Cargo.toml index cca94287b0c75..e6256a0a0b41d 100644 --- a/polkadot/executor/Cargo.toml +++ b/polkadot/executor/Cargo.toml @@ -14,8 +14,6 @@ substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-state-machine = { path = "../../substrate/state-machine" } substrate-executor = { path = "../../substrate/executor" } substrate-primitives = { path = "../../substrate/primitives" } -polkadot-primitives = { path = "../primitives" } -polkadot-runtime = { path = "../runtime" } [dev-dependencies] substrate-keyring = { path = "../../substrate/keyring" } diff --git a/polkadot/executor/src/lib.rs b/polkadot/executor/src/lib.rs index e5e096418bec4..bb2a6a8077da4 100644 --- a/polkadot/executor/src/lib.rs +++ b/polkadot/executor/src/lib.rs @@ -23,7 +23,6 @@ extern crate substrate_codec as codec; extern crate substrate_state_machine as state_machine; extern crate substrate_runtime_io as runtime_io; extern crate substrate_primitives as primitives; -extern crate polkadot_primitives as polkadot_primitives; extern crate ed25519; extern crate triehash; diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index 388d107fe74c1..ca1cde96c9639 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -31,4 +31,384 @@ extern crate substrate_codec as codec; pub mod parachain; use runtime_primitives::generic; +use codec::Slicable; +/// Block header type as expected by this runtime. +pub type Header = generic::Header; + +/// A log entry in the block. +#[derive(PartialEq, Eq, Clone, Default)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + +impl Slicable for Log { + fn decode(input: &mut I) -> Option { + Vec::::decode(input).map(Log) + } + + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } +} + +/// Something that identifies a block. +pub type BlockId = generic::BlockId; + +/// An index to a block. +/// 32-bits will allow for 136 years of blocks assuming 1 block per second. +/// TODO: switch to u32 +pub type BlockNumber = u64; + +/// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost +/// certainly continue to be the same as the substrate's `AuthorityId`. +pub type AccountId = substrate_primitives::hash::H256; + +/// The Ed25519 pub key of an session that belongs to an authority of the relay chain. This is +/// exactly equivalent to what the substrate calls an "authority". +pub type SessionKey = substrate_primitives::AuthorityId; + +/// Indentifier for a chain. 32-bit should be plenty. +pub type ChainId = u32; + +/// Index of a transaction in the relay chain. 32-bit should be plenty. +pub type Index = u32; + +/// A hash of some data used by the relay chain. +pub type Hash = substrate_primitives::H256; + +/// Alias to 512-bit hash when used in the context of a signature on the relay chain. +/// Equipped with logic for possibly "unsigned" messages. +pub type Signature = runtime_primitives::MaybeUnsigned; + +/// A timestamp: seconds since the unix epoch. +pub type Timestamp = u64; + +/// The balance of an account. +/// 128-bits (or 38 significant decimal figures) will allow for 10m currency (10^7) at a resolution +/// to all for one second's worth of an annualised 50% reward be paid to a unit holder (10^11 unit +/// denomination), or 10^18 total atomic units, to grow at 50%/year for 51 years (10^9 multiplier) +/// for an eventual total of 10^27 units (27 significant decimal figures). +/// We round denomination to 10^12 (12 sdf), and leave the other redundancy at the upper end so +/// that 32 bits may be multiplied with a balance in 128 bits without worrying about overflow. +pub type Balance = u128; + +/// Parachain data types. +pub mod parachain { + use super::*; + + /// Unique identifier of a parachain. + #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + pub struct Id(u32); + + impl From for u32 { + fn from(x: Id) -> Self { x.0 } + } + + impl From for Id { + fn from(x: u32) -> Self { Id(x) } + } + + impl Id { + /// Convert this Id into its inner representation. + pub fn into_inner(self) -> u32 { + self.0 + } + } + + impl Slicable for Id { + fn decode(input: &mut I) -> Option { + u32::decode(input).map(Id) + } + + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } + } + + /// Identifier for a chain, either one of a number of parachains or the relay chain. + #[derive(Copy, Clone, PartialEq)] + #[cfg_attr(feature = "std", derive(Debug))] + pub enum Chain { + /// The relay chain. + Relay, + /// A parachain of the given index. + Parachain(Id), + } + + impl Slicable for Chain { + fn decode(input: &mut I) -> Option { + let disc = input.read_byte()?; + + match disc { + 0 => Some(Chain::Relay), + 1 => Some(Chain::Parachain(Slicable::decode(input)?)), + _ => None, + } + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Chain::Relay => { v.push(0); } + Chain::Parachain(id) => { + v.push(1u8); + id.using_encoded(|s| v.extend(s)); + } + } + + v + } + + fn using_encoded R>(&self, f: F) -> R { + f(&self.encode().as_slice()) + } + } + + /// The duty roster specifying what jobs each validator must do. + #[derive(Clone, PartialEq)] + #[cfg_attr(feature = "std", derive(Default, Debug))] + pub struct DutyRoster { + /// Lookup from validator index to chain on which that validator has a duty to validate. + pub validator_duty: Vec, + /// Lookup from validator index to chain on which that validator has a duty to guarantee + /// availability. + pub guarantor_duty: Vec, + } + + impl Slicable for DutyRoster { + fn decode(input: &mut I) -> Option { + Some(DutyRoster { + validator_duty: Slicable::decode(input)?, + guarantor_duty: Slicable::decode(input)?, + }) + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + v.extend(self.validator_duty.encode()); + v.extend(self.guarantor_duty.encode()); + + v + } + + fn using_encoded R>(&self, f: F) -> R { + f(&self.encode().as_slice()) + } + } + + /// Extrinsic data for a parachain. + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] + #[cfg_attr(feature = "std", serde(deny_unknown_fields))] + pub struct Extrinsic; + + /// Candidate parachain block. + /// + /// https://github.com/w3f/polkadot-spec/blob/master/spec.md#candidate-para-chain-block + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] + #[cfg_attr(feature = "std", serde(deny_unknown_fields))] + pub struct Candidate { + /// The ID of the parachain this is a proposal for. + pub parachain_index: Id, + /// Collator's signature + pub collator_signature: runtime_primitives::Ed25519Signature, + /// Unprocessed ingress queue. + /// + /// Ordered by parachain ID and block number. + pub unprocessed_ingress: ConsolidatedIngress, + /// Block data + pub block: BlockData, + } + + /// Candidate receipt type. + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] + #[cfg_attr(feature = "std", serde(deny_unknown_fields))] + pub struct CandidateReceipt { + /// The ID of the parachain this is a candidate for. + pub parachain_index: Id, + /// The collator's relay-chain account ID + pub collator: super::AccountId, + /// The head-data + pub head_data: HeadData, + /// Balance uploads to the relay chain. + pub balance_uploads: Vec<(super::AccountId, u64)>, + /// Egress queue roots. + pub egress_queue_roots: Vec<(Id, Hash)>, + /// Fees paid from the chain to the relay chain validators + pub fees: u64, + } + + impl Slicable for CandidateReceipt { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + self.parachain_index.using_encoded(|s| v.extend(s)); + self.collator.using_encoded(|s| v.extend(s)); + self.head_data.0.using_encoded(|s| v.extend(s)); + self.balance_uploads.using_encoded(|s| v.extend(s)); + self.egress_queue_roots.using_encoded(|s| v.extend(s)); + self.fees.using_encoded(|s| v.extend(s)); + + v + } + + fn decode(input: &mut I) -> Option { + Some(CandidateReceipt { + parachain_index: Slicable::decode(input)?, + collator: Slicable::decode(input)?, + head_data: Slicable::decode(input).map(HeadData)?, + balance_uploads: Slicable::decode(input)?, + egress_queue_roots: Slicable::decode(input)?, + fees: Slicable::decode(input)?, + }) + } + } + + impl CandidateReceipt { + /// Get the blake2_256 hash + #[cfg(feature = "std")] + pub fn hash(&self) -> Hash { + use runtime_primitives::traits::Hashing; + BlakeTwo256::hash_of(self) + } + } + + impl PartialOrd for CandidateReceipt { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } + } + + impl Ord for CandidateReceipt { + fn cmp(&self, other: &Self) -> Ordering { + // TODO: compare signatures or something more sane + self.parachain_index.cmp(&other.parachain_index) + .then_with(|| self.head_data.cmp(&other.head_data)) + } + } + + /// Parachain ingress queue message. + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + pub struct Message(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + /// Consolidated ingress queue data. + /// + /// This is just an ordered vector of other parachains' egress queues, + /// obtained according to the routing rules. + #[derive(Default, PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + pub struct ConsolidatedIngress(pub Vec<(Id, Vec)>); + + /// Parachain block data. + /// + /// contains everything required to validate para-block, may contain block and witness data + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + /// Parachain header raw bytes wrapper type. + #[derive(PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + pub struct Header(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + /// Parachain head data included in the chain. + #[derive(PartialEq, Eq, Clone, PartialOrd, Ord)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + /// Parachain validation code. + #[derive(PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + /// Activitiy bit field + #[derive(PartialEq, Eq, Clone, Default)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + pub struct Activity(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + impl Slicable for Activity { + fn decode(input: &mut I) -> Option { + Vec::::decode(input).map(Activity) + } + + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } + } + + #[derive(Clone, Copy, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug))] + #[repr(u8)] + enum StatementKind { + Candidate = 1, + Valid = 2, + Invalid = 3, + Available = 4, + } + + /// Statements which can be made about parachain candidates. + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug))] + pub enum Statement { + /// Proposal of a parachain candidate. + Candidate(CandidateReceipt), + /// State that a parachain candidate is valid. + Valid(Hash), + /// Vote to commit to a candidate. + Invalid(Hash), + /// Vote to advance round after inactive primary. + Available(Hash), + } + + impl Slicable for Statement { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Statement::Candidate(ref candidate) => { + v.push(StatementKind::Candidate as u8); + candidate.using_encoded(|s| v.extend(s)); + } + Statement::Valid(ref hash) => { + v.push(StatementKind::Valid as u8); + hash.using_encoded(|s| v.extend(s)); + } + Statement::Invalid(ref hash) => { + v.push(StatementKind::Invalid as u8); + hash.using_encoded(|s| v.extend(s)); + } + Statement::Available(ref hash) => { + v.push(StatementKind::Available as u8); + hash.using_encoded(|s| v.extend(s)); + } + } + + v + } + + fn decode(value: &mut I) -> Option { + match value.read_byte() { + Some(x) if x == StatementKind::Candidate as u8 => { + Slicable::decode(value).map(Statement::Candidate) + } + Some(x) if x == StatementKind::Valid as u8 => { + Slicable::decode(value).map(Statement::Valid) + } + Some(x) if x == StatementKind::Invalid as u8 => { + Slicable::decode(value).map(Statement::Invalid) + } + Some(x) if x == StatementKind::Available as u8 => { + Slicable::decode(value).map(Statement::Available) + } + _ => None, + } + } + } +} diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index 1f7a94cf8c24a..dc1ad921dbbb8 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -55,7 +55,6 @@ extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; extern crate substrate_runtime_timestamp as timestamp; -pub mod primitives; mod parachains; use primitives::{AccountId, Balance, BlockNumber, Hash, Index, Log, SessionKey}; @@ -74,6 +73,13 @@ pub const TIMESTAMP_SET_POSITION: u32 = 0; /// The position of the parachains set extrinsic. pub const PARACHAINS_SET_POSITION: u32 = 1; +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Extrinsic type as expected by this runtime. +pub type Extrinsic = generic::Extrinsic; + /// Concrete runtime type used to parameterize the various modules. pub struct Concrete; diff --git a/polkadot/runtime/src/primitives.rs b/polkadot/runtime/src/primitives.rs deleted file mode 100644 index 156f071d5eba4..0000000000000 --- a/polkadot/runtime/src/primitives.rs +++ /dev/null @@ -1,413 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Primitive types for the polkadot runtime. - -use codec::{Slicable, Input}; -use rstd::prelude::*; -use rstd::cmp::Ordering; -use substrate_primitives; -use runtime_primitives::{self, generic, traits::BlakeTwo256}; -use super::Call; - -#[cfg(feature = "std")] -use substrate_primitives::bytes; - -/// Block header type as expected by this runtime. -pub type Header = generic::Header; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type as expected by this runtime. -pub type Extrinsic = generic::Extrinsic; - -/// Something that identifies a block. -pub type BlockId = generic::BlockId; - -/// A log entry in the block. -#[derive(PartialEq, Eq, Clone, Default)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -impl Slicable for Log { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Log) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } -} - -/// An index to a block. -/// 32-bits will allow for 136 years of blocks assuming 1 block per second. -/// TODO: switch to u32 -pub type BlockNumber = u64; - -/// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost -/// certainly continue to be the same as the substrate's `AuthorityId`. -pub type AccountId = substrate_primitives::hash::H256; - -/// The Ed25519 pub key of an session that belongs to an authority of the relay chain. This is -/// exactly equivalent to what the substrate calls an "authority". -pub type SessionKey = substrate_primitives::AuthorityId; - -/// Indentifier for a chain. 32-bit should be plenty. -pub type ChainId = u32; - -/// Index of a transaction in the relay chain. 32-bit should be plenty. -pub type Index = u32; - -/// A hash of some data used by the relay chain. -pub type Hash = substrate_primitives::H256; - -/// Alias to 512-bit hash when used in the context of a signature on the relay chain. -/// Equipped with logic for possibly "unsigned" messages. -pub type Signature = runtime_primitives::MaybeUnsigned; - -/// A timestamp: seconds since the unix epoch. -pub type Timestamp = u64; - -/// The balance of an account. -/// 128-bits (or 38 significant decimal figures) will allow for 10m currency (10^7) at a resolution -/// to all for one second's worth of an annualised 50% reward be paid to a unit holder (10^11 unit -/// denomination), or 10^18 total atomic units, to grow at 50%/year for 51 years (10^9 multiplier) -/// for an eventual total of 10^27 units (27 significant decimal figures). -/// We round denomination to 10^12 (12 sdf), and leave the other redundancy at the upper end so -/// that 32 bits may be multiplied with a balance in 128 bits without worrying about overflow. -pub type Balance = u128; - -/// Parachain data types. -pub mod parachain { - use super::*; - - /// Unique identifier of a parachain. - #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct Id(u32); - - impl From for u32 { - fn from(x: Id) -> Self { x.0 } - } - - impl From for Id { - fn from(x: u32) -> Self { Id(x) } - } - - impl Id { - /// Convert this Id into its inner representation. - pub fn into_inner(self) -> u32 { - self.0 - } - } - - impl Slicable for Id { - fn decode(input: &mut I) -> Option { - u32::decode(input).map(Id) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } - } - - /// Identifier for a chain, either one of a number of parachains or the relay chain. - #[derive(Copy, Clone, PartialEq)] - #[cfg_attr(feature = "std", derive(Debug))] - pub enum Chain { - /// The relay chain. - Relay, - /// A parachain of the given index. - Parachain(Id), - } - - impl Slicable for Chain { - fn decode(input: &mut I) -> Option { - let disc = input.read_byte()?; - - match disc { - 0 => Some(Chain::Relay), - 1 => Some(Chain::Parachain(Slicable::decode(input)?)), - _ => None, - } - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Chain::Relay => { v.push(0); } - Chain::Parachain(id) => { - v.push(1u8); - id.using_encoded(|s| v.extend(s)); - } - } - - v - } - - fn using_encoded R>(&self, f: F) -> R { - f(&self.encode().as_slice()) - } - } - - /// The duty roster specifying what jobs each validator must do. - #[derive(Clone, PartialEq)] - #[cfg_attr(feature = "std", derive(Default, Debug))] - pub struct DutyRoster { - /// Lookup from validator index to chain on which that validator has a duty to validate. - pub validator_duty: Vec, - /// Lookup from validator index to chain on which that validator has a duty to guarantee - /// availability. - pub guarantor_duty: Vec, - } - - impl Slicable for DutyRoster { - fn decode(input: &mut I) -> Option { - Some(DutyRoster { - validator_duty: Slicable::decode(input)?, - guarantor_duty: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - v.extend(self.validator_duty.encode()); - v.extend(self.guarantor_duty.encode()); - - v - } - - fn using_encoded R>(&self, f: F) -> R { - f(&self.encode().as_slice()) - } - } - - /// Extrinsic data for a parachain. - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] - #[cfg_attr(feature = "std", serde(deny_unknown_fields))] - pub struct Extrinsic; - - /// Candidate parachain block. - /// - /// https://github.com/w3f/polkadot-spec/blob/master/spec.md#candidate-para-chain-block - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] - #[cfg_attr(feature = "std", serde(deny_unknown_fields))] - pub struct Candidate { - /// The ID of the parachain this is a proposal for. - pub parachain_index: Id, - /// Collator's signature - pub collator_signature: runtime_primitives::Ed25519Signature, - /// Unprocessed ingress queue. - /// - /// Ordered by parachain ID and block number. - pub unprocessed_ingress: ConsolidatedIngress, - /// Block data - pub block: BlockData, - } - - /// Candidate receipt type. - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] - #[cfg_attr(feature = "std", serde(deny_unknown_fields))] - pub struct CandidateReceipt { - /// The ID of the parachain this is a candidate for. - pub parachain_index: Id, - /// The collator's relay-chain account ID - pub collator: super::AccountId, - /// The head-data - pub head_data: HeadData, - /// Balance uploads to the relay chain. - pub balance_uploads: Vec<(super::AccountId, u64)>, - /// Egress queue roots. - pub egress_queue_roots: Vec<(Id, Hash)>, - /// Fees paid from the chain to the relay chain validators - pub fees: u64, - } - - impl Slicable for CandidateReceipt { - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - self.parachain_index.using_encoded(|s| v.extend(s)); - self.collator.using_encoded(|s| v.extend(s)); - self.head_data.0.using_encoded(|s| v.extend(s)); - self.balance_uploads.using_encoded(|s| v.extend(s)); - self.egress_queue_roots.using_encoded(|s| v.extend(s)); - self.fees.using_encoded(|s| v.extend(s)); - - v - } - - fn decode(input: &mut I) -> Option { - Some(CandidateReceipt { - parachain_index: Slicable::decode(input)?, - collator: Slicable::decode(input)?, - head_data: Slicable::decode(input).map(HeadData)?, - balance_uploads: Slicable::decode(input)?, - egress_queue_roots: Slicable::decode(input)?, - fees: Slicable::decode(input)?, - }) - } - } - - impl CandidateReceipt { - /// Get the blake2_256 hash - #[cfg(feature = "std")] - pub fn hash(&self) -> Hash { - use runtime_primitives::traits::Hashing; - BlakeTwo256::hash_of(self) - } - } - - impl PartialOrd for CandidateReceipt { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } - } - - impl Ord for CandidateReceipt { - fn cmp(&self, other: &Self) -> Ordering { - // TODO: compare signatures or something more sane - self.parachain_index.cmp(&other.parachain_index) - .then_with(|| self.head_data.cmp(&other.head_data)) - } - } - - /// Parachain ingress queue message. - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct Message(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - /// Consolidated ingress queue data. - /// - /// This is just an ordered vector of other parachains' egress queues, - /// obtained according to the routing rules. - #[derive(Default, PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct ConsolidatedIngress(pub Vec<(Id, Vec)>); - - /// Parachain block data. - /// - /// contains everything required to validate para-block, may contain block and witness data - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - /// Parachain header raw bytes wrapper type. - #[derive(PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct Header(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - /// Parachain head data included in the chain. - #[derive(PartialEq, Eq, Clone, PartialOrd, Ord)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - /// Parachain validation code. - #[derive(PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - /// Activitiy bit field - #[derive(PartialEq, Eq, Clone, Default)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct Activity(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - impl Slicable for Activity { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Activity) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } - } - - #[derive(Clone, Copy, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug))] - #[repr(u8)] - enum StatementKind { - Candidate = 1, - Valid = 2, - Invalid = 3, - Available = 4, - } - - /// Statements which can be made about parachain candidates. - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug))] - pub enum Statement { - /// Proposal of a parachain candidate. - Candidate(CandidateReceipt), - /// State that a parachain candidate is valid. - Valid(Hash), - /// Vote to commit to a candidate. - Invalid(Hash), - /// Vote to advance round after inactive primary. - Available(Hash), - } - - impl Slicable for Statement { - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Statement::Candidate(ref candidate) => { - v.push(StatementKind::Candidate as u8); - candidate.using_encoded(|s| v.extend(s)); - } - Statement::Valid(ref hash) => { - v.push(StatementKind::Valid as u8); - hash.using_encoded(|s| v.extend(s)); - } - Statement::Invalid(ref hash) => { - v.push(StatementKind::Invalid as u8); - hash.using_encoded(|s| v.extend(s)); - } - Statement::Available(ref hash) => { - v.push(StatementKind::Available as u8); - hash.using_encoded(|s| v.extend(s)); - } - } - - v - } - - fn decode(value: &mut I) -> Option { - match value.read_byte() { - Some(x) if x == StatementKind::Candidate as u8 => { - Slicable::decode(value).map(Statement::Candidate) - } - Some(x) if x == StatementKind::Valid as u8 => { - Slicable::decode(value).map(Statement::Valid) - } - Some(x) if x == StatementKind::Invalid as u8 => { - Slicable::decode(value).map(Statement::Invalid) - } - Some(x) if x == StatementKind::Available as u8 => { - Slicable::decode(value).map(Statement::Available) - } - _ => None, - } - } - } -} diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 9e4607f91b8fb..258600b0d01b7 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -300,8 +300,7 @@ impl Client where blockchain::BlockStatus::InChain => {}, blockchain::BlockStatus::Unknown => return Ok(ImportResult::UnknownParent), } - let hash: block::HeaderHash = header.blake2_256().into(); - + let hash = header.hash(); let _import_lock = self.import_lock.lock(); *self.importing_block.write() = Some(hash); let result = self.execute_and_import_block(origin, hash, header, justification, body); @@ -312,11 +311,12 @@ impl Client where fn execute_and_import_block( &self, origin: BlockOrigin, - hash: HeaderHash, - header: block::Header, - justification: bft::Justification, - body: Option, + hash: Block::Hash, + header: Block::Header, + justification: bft::Justification, + body: Option>, ) -> error::Result { + let parent_hash = header.parent_hash().clone(); match self.backend.blockchain().status(BlockId::Hash(hash))? { blockchain::BlockStatus::InChain => return Ok(ImportResult::AlreadyInChain), blockchain::BlockStatus::Unknown => {}, @@ -339,7 +339,6 @@ impl Client where }; let is_new_best = header.number() == &(self.backend.blockchain().info()?.best_number + One::one()); - let hash = header.hash(); trace!("Imported {}, (#{}), best={}, origin={:?}", hash, header.number(), is_new_best, origin); transaction.set_block_data(header.clone(), body, Some(justification.uncheck().into()), is_new_best)?; if let Some(storage_update) = storage_update { diff --git a/substrate/misbehavior-check/Cargo.toml b/substrate/misbehavior-check/Cargo.toml index 58d27f45c7e20..3ab615b2d411a 100644 --- a/substrate/misbehavior-check/Cargo.toml +++ b/substrate/misbehavior-check/Cargo.toml @@ -6,6 +6,7 @@ authors = ["Parity Technologies "] [dependencies] substrate-codec = { path = "../codec", default-features = false } substrate-primitives = { path = "../primitives", default-features = false } +substrate-runtime-primitives = { path = "../runtime/primitives", default-features = false } substrate-runtime-io = { path = "../runtime-io", default-features = false } [dev-dependencies] @@ -14,4 +15,4 @@ substrate-keyring = { path = "../keyring" } [features] default = ["std"] -std = ["substrate-codec/std", "substrate-primitives/std", "substrate-runtime-io/std"] +std = ["substrate-codec/std", "substrate-primitives/std", "substrate-runtime-primitives/std", "substrate-runtime-io/std"] diff --git a/substrate/misbehavior-check/src/lib.rs b/substrate/misbehavior-check/src/lib.rs index 71236ef457ee6..1c7ff08e4bce0 100644 --- a/substrate/misbehavior-check/src/lib.rs +++ b/substrate/misbehavior-check/src/lib.rs @@ -21,6 +21,7 @@ extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; extern crate substrate_runtime_io as runtime_io; +extern crate substrate_runtime_primitives as runtime_primitives; #[cfg(test)] extern crate substrate_bft; @@ -29,23 +30,27 @@ extern crate substrate_keyring as keyring; use codec::Slicable; use primitives::{AuthorityId, Signature}; -use primitives::block::HeaderHash; -use primitives::bft::{Action, Message, MisbehaviorKind}; + +use runtime_primitives::bft::{Action, Message, MisbehaviorKind}; // check a message signature. returns true if signed by that authority. -fn check_message_sig(message: Message, signature: &Signature, from: &AuthorityId) -> bool { - let msg = message.encode(); +fn check_message_sig( + message: Message, + signature: &Signature, + from: &AuthorityId +) -> bool { + let msg: Vec = message.encode(); runtime_io::ed25519_verify(&signature.0, &msg, from) } -fn prepare(parent: HeaderHash, round_number: u32, hash: HeaderHash) -> Message { +fn prepare(parent: H, round_number: u32, hash: H) -> Message { Message { parent, action: Action::Prepare(round_number, hash), } } -fn commit(parent: HeaderHash, round_number: u32, hash: HeaderHash) -> Message { +fn commit(parent: H, round_number: u32, hash: H) -> Message { Message { parent, action: Action::Commit(round_number, hash), @@ -57,21 +62,21 @@ fn commit(parent: HeaderHash, round_number: u32, hash: HeaderHash) -> Message { /// Doesn't check that the header hash in question is /// valid or whether the misbehaving authority was part of /// the set at that block. -pub fn evaluate_misbehavior( +pub fn evaluate_misbehavior( misbehaved: &AuthorityId, - parent_hash: HeaderHash, - kind: &MisbehaviorKind, + parent_hash: H, + kind: &MisbehaviorKind, ) -> bool { match *kind { MisbehaviorKind::BftDoublePrepare(round, (h_1, ref s_1), (h_2, ref s_2)) => { s_1 != s_2 && - check_message_sig(prepare(parent_hash, round, h_1), s_1, misbehaved) && - check_message_sig(prepare(parent_hash, round, h_2), s_2, misbehaved) + check_message_sig::(prepare::(parent_hash, round, h_1), s_1, misbehaved) && + check_message_sig::(prepare::(parent_hash, round, h_2), s_2, misbehaved) } MisbehaviorKind::BftDoubleCommit(round, (h_1, ref s_1), (h_2, ref s_2)) => { s_1 != s_2 && - check_message_sig(commit(parent_hash, round, h_1), s_1, misbehaved) && - check_message_sig(commit(parent_hash, round, h_2), s_2, misbehaved) + check_message_sig::(commit::(parent_hash, round, h_1), s_1, misbehaved) && + check_message_sig::(commit::(parent_hash, round, h_2), s_2, misbehaved) } } } @@ -84,8 +89,12 @@ mod tests { use keyring::ed25519; use keyring::Keyring; - fn sign_prepare(key: &ed25519::Pair, round: u32, hash: HeaderHash, parent_hash: HeaderHash) -> (HeaderHash, Signature) { - let msg = substrate_bft::sign_message( + use runtime_primitives::testing::{H256, Block as RawBlock}; + + type Block = RawBlock; + + fn sign_prepare(key: &ed25519::Pair, round: u32, hash: H256, parent_hash: H256) -> (H256, Signature) { + let msg = substrate_bft::sign_message::( generic::Message::Vote(generic::Vote::Prepare(round as _, hash)), key, parent_hash @@ -97,8 +106,8 @@ mod tests { } } - fn sign_commit(key: &ed25519::Pair, round: u32, hash: HeaderHash, parent_hash: HeaderHash) -> (HeaderHash, Signature) { - let msg = substrate_bft::sign_message( + fn sign_commit(key: &ed25519::Pair, round: u32, hash: H256, parent_hash: H256) -> (H256, Signature) { + let msg = substrate_bft::sign_message::( generic::Message::Vote(generic::Vote::Commit(round as _, hash)), key, parent_hash @@ -117,7 +126,7 @@ mod tests { let hash_1 = [0; 32].into(); let hash_2 = [1; 32].into(); - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &key.public().0, parent_hash, &MisbehaviorKind::BftDoublePrepare( @@ -129,7 +138,7 @@ mod tests { // same signature twice is not misbehavior. let signed = sign_prepare(&key, 1, hash_1, parent_hash); - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &key.public().0, parent_hash, &MisbehaviorKind::BftDoublePrepare( @@ -140,7 +149,7 @@ mod tests { ) == false); // misbehavior has wrong target. - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &Keyring::Two.to_raw_public(), parent_hash, &MisbehaviorKind::BftDoublePrepare( @@ -158,7 +167,7 @@ mod tests { let hash_1 = [0; 32].into(); let hash_2 = [1; 32].into(); - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &key.public().0, parent_hash, &MisbehaviorKind::BftDoubleCommit( @@ -170,7 +179,7 @@ mod tests { // same signature twice is not misbehavior. let signed = sign_commit(&key, 1, hash_1, parent_hash); - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &key.public().0, parent_hash, &MisbehaviorKind::BftDoubleCommit( @@ -181,7 +190,7 @@ mod tests { ) == false); // misbehavior has wrong target. - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &Keyring::Two.to_raw_public(), parent_hash, &MisbehaviorKind::BftDoubleCommit( diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index a5e1f1a17b24d..534b84048e11c 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -85,27 +85,7 @@ impl traits::Checkable for UncheckedExtrinsic type Checked = CheckedExtrinsic; fn check(self) -> Result { - // TODO: unfortunately this is a lifetime relationship that can't - // be expressed without higher-kinded lifetimes. - struct LazyEncode { - inner: F, - encoded: Option>, - } - - impl Vec> traits::Lazy<[u8]> for LazyEncode { - fn get(&mut self) -> &[u8] { - self.encoded.get_or_insert_with(&self.inner).as_slice() - } - } - - let sig_ok = { - self.signature.verify( - LazyEncode { inner: || self.extrinsic.encode(), encoded: None }, - &self.extrinsic.signed, - ) - }; - - if sig_ok { + if ::verify_encoded_lazy(&self.signature, &self.extrinsic, &self.extrinsic.signed) { Ok(CheckedExtrinsic(self)) } else { Err(self) @@ -355,6 +335,7 @@ impl Slicable for Header traits::Header for Header where Number: Member + ::rstd::hash::Hash + Copy + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, Hashing: HashingT, @@ -394,6 +375,19 @@ impl traits::Header for Header Header where + Number: Member + ::rstd::hash::Hash + Copy + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, + Hashing: HashingT, + DigestItem: Member + Default + Slicable, + Hashing::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Slicable, + { + /// Convenience helper for computing the hash of the header without having + /// to import the trait. + pub fn hash(&self) -> Hashing::Output { + Hashing::hash_of(self) + } +} + /// Something to identify a block. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] @@ -417,72 +411,24 @@ impl fmt::Display for BlockId { /// Abstraction over a substrate block. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Block { +pub struct Block { /// The block header. - pub header: Header, + pub header: Header, /// The accompanying extrinsics. - pub extrinsics: Vec>, + pub extrinsics: Vec, } -// Hack to work around the fact that deriving deserialize doesn't work nicely with -// the `Hashing` trait used as a parameter. -#[cfg(feature = "std")] -impl<'a, Number, Hashing: HashingT, DigestItem, AccountId, Index, Call, Signature> Deserialize<'a> for Block where - Number: 'a + Deserialize<'a>, - Hashing::Output: 'a + Deserialize<'a>, - DigestItem: 'a + Deserialize<'a>, - AccountId: 'a + Deserialize<'a>, - Index: 'a + Deserialize<'a>, - Call: 'a + Deserialize<'a>, - Signature: 'a + Deserialize<'a>, -{ - fn deserialize>(de: D) -> Result { - // dummy struct that uses the hash type directly. - #[derive(Deserialize)] - #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] - struct Inner { - header: DeserializeHeader, - extrinsics: Vec, - } - - let inner = Inner::< - Number, - Hashing::Output, - DigestItem, - UncheckedExtrinsic, - >::deserialize(de)?; - - Ok(Block { - header: inner.header.into(), - extrinsics: inner.extrinsics, - }) - } -} - -impl Slicable - for Block -where - Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, - Hashing: HashingT, - DigestItem: Member + Default, - ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, - AccountId: Member + Default + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, - Signature: Member + Default + traits::Verify, - Header: traits::Header, - UncheckedExtrinsic: Slicable, - Extrinsic: Slicable, -{ +impl Slicable for Block { fn decode(input: &mut I) -> Option { Some(Block { header: Slicable::decode(input)?, extrinsics: Slicable::decode(input)?, }) } + fn encode(&self) -> Vec { let mut v: Vec = Vec::new(); v.extend(self.header.encode()); @@ -491,24 +437,13 @@ where } } -impl traits::Block - for Block +impl traits::Block for Block where - Number: Member + MaybeDisplay + SimpleArithmetic + Slicable, - Hashing: HashingT, - Hashing::Output: ::rstd::hash::Hash, - DigestItem: Member + Default, - ::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, - AccountId: Member + Default + MaybeDisplay, - Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member, - Signature: Member + Default + traits::Verify, - Header: traits::Header, - UncheckedExtrinsic: Slicable, - Extrinsic: Slicable, + Header: HeaderT, + Extrinsic: Member + Slicable, { - type Extrinsic = UncheckedExtrinsic; - type Header = Header; + type Extrinsic = Extrinsic; + type Header = Header; type Hash = ::Hash; fn header(&self) -> &Self::Header { @@ -532,13 +467,8 @@ mod tests { use super::{Digest, Header, UncheckedExtrinsic, Extrinsic}; type Block = super::Block< - u64, - ::traits::BlakeTwo256, - Vec, - H256, - u64, - u64, - ::Ed25519Signature + Header>, + UncheckedExtrinsic, >; #[test] diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index c52d25306c085..fbea148819e1f 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -121,6 +121,28 @@ impl From for MaybeUnsigned { } } +/// Verify a signature on an encoded value in a lazy manner. This can be +/// an optimization if the signature scheme has an "unsigned" escape hash. +pub fn verify_encoded_lazy(sig: &V, item: &T, signer: &V::Signer) -> bool { + // TODO: unfortunately this is a lifetime relationship that can't + // be expressed without higher-kinded lifetimes. + struct LazyEncode { + inner: F, + encoded: Option>, + } + + impl Vec> traits::Lazy<[u8]> for LazyEncode { + fn get(&mut self) -> &[u8] { + self.encoded.get_or_insert_with(&self.inner).as_slice() + } + } + + sig.verify( + LazyEncode { inner: || item.encode(), encoded: None }, + signer, + ) +} + #[macro_export] macro_rules! __impl_outer_config_types { ($concrete:ident $config:ident $snake:ident $($rest:ident)*) => { diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index a4e990b890eb4..27e675b04fe80 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -20,9 +20,10 @@ use serde::{Serialize, de::DeserializeOwned}; use std::fmt::Debug; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; -use substrate_primitives::H256; use traits::{self, Checkable, Applyable, BlakeTwo256}; +pub use substrate_primitives::H256; + #[derive(Default, PartialEq, Eq, Clone, Serialize, Deserialize, Debug)] pub struct Digest { pub logs: Vec, diff --git a/substrate/test-client/src/client_ext.rs b/substrate/test-client/src/client_ext.rs index 57302a5974a90..919e2ab412e4a 100644 --- a/substrate/test-client/src/client_ext.rs +++ b/substrate/test-client/src/client_ext.rs @@ -19,7 +19,6 @@ use client::{self, Client}; use keyring::Keyring; use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; -use runtime_primitives::traits::Header; use runtime; use bft; use {Backend, Executor, NativeExecutor}; diff --git a/substrate/test-runtime/src/lib.rs b/substrate/test-runtime/src/lib.rs index eddf4e45ee3bd..9bfcbc3e1134d 100644 --- a/substrate/test-runtime/src/lib.rs +++ b/substrate/test-runtime/src/lib.rs @@ -85,7 +85,7 @@ pub type Index = u64; /// The digest of a block. pub type Digest = runtime_primitives::generic::Digest>; /// A test block. -pub type Block = runtime_primitives::generic::Block, AccountId, Index, Call, Ed25519Signature>; +pub type Block = runtime_primitives::generic::Block; /// A test block's header. pub type Header = runtime_primitives::generic::Header>; /// Extrinsic From defce8223dbaade9e77e3ce7a103db62c1226dfb Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 2 Jun 2018 03:22:04 +0200 Subject: [PATCH 40/60] get network compiling again --- demo/runtime/src/lib.rs | 2 +- polkadot/runtime/src/lib.rs | 2 +- substrate/network/src/consensus.rs | 41 +++++++++++++++++------------- substrate/network/src/protocol.rs | 2 +- substrate/network/src/test/mod.rs | 2 +- 5 files changed, 28 insertions(+), 21 deletions(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 7241fef32c885..83503885a6737 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -155,7 +155,7 @@ impl_outer_dispatch! { /// Block header type as expected by this runtime. pub type Header = generic::Header>; /// Block type as expected by this runtime. -pub type Block = generic::Block, AccountId, Index, Call, Signature>; +pub type Block = generic::Block; /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type as expected by this runtime. diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index dc1ad921dbbb8..d933cd5e6ca01 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -74,7 +74,7 @@ pub const TIMESTAMP_SET_POSITION: u32 = 0; pub const PARACHAINS_SET_POSITION: u32 = 1; /// Block type as expected by this runtime. -pub type Block = generic::Block; +pub type Block = generic::Block; /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type as expected by this runtime. diff --git a/substrate/network/src/consensus.rs b/substrate/network/src/consensus.rs index 215a7dd411f63..60abb9b2d4277 100644 --- a/substrate/network/src/consensus.rs +++ b/substrate/network/src/consensus.rs @@ -43,7 +43,7 @@ pub struct Consensus { impl Consensus where B::Header: HeaderT { /// Create a new instance. - pub fn new() -> Consensus { + pub fn new() -> Self { Consensus { peers: HashMap::new(), bft_message_sink: None, @@ -170,8 +170,7 @@ impl Consensus where B::Header: HeaderT { if timestamp >= now - MESSAGE_LIFETIME && best_header.map_or(true, |header| match *message { - Message::BftMessage(ref msg) => &msg.parent_hash != header.parent_hash(), - Message::Statement(ref msg) => &msg.parent_hash != header.parent_hash(), + GenericMessage::BftMessage(ref msg) => &msg.parent_hash != header.parent_hash(), _ => true, }) { @@ -192,32 +191,33 @@ impl Consensus where B::Header: HeaderT { #[cfg(test)] mod tests { - use primitives::Hash; - use primitives::bft::Justification; - use primitives::block::{HeaderHash, Header}; + use runtime_primitives::bft::Justification; + use runtime_primitives::testing::{H256, Header, Block as RawBlock}; use std::time::Instant; - use message::{self, Message}; + use message::{self, generic::Message as GenericMessage}; use super::{Consensus, MESSAGE_LIFETIME}; + type Block = RawBlock; + #[test] fn collects_garbage() { - let prev_hash = HeaderHash::random(); - let best_hash = HeaderHash::random(); - let mut consensus = Consensus::new(); + let prev_hash = H256::random(); + let best_hash = H256::random(); + let mut consensus = Consensus::::new(); let now = Instant::now(); - let m1_hash = Hash::random(); - let m2_hash = Hash::random(); - let m1 = Message::BftMessage(message::LocalizedBftMessage { + let m1_hash = H256::random(); + let m2_hash = H256::random(); + let m1 = GenericMessage::BftMessage(message::LocalizedBftMessage { parent_hash: prev_hash, - message: message::BftMessage::Auxiliary(Justification { + message: message::generic::BftMessage::Auxiliary(Justification { round_number: 0, hash: Default::default(), signatures: Default::default(), }), }); - let m2 = Message::BftMessage(message::LocalizedBftMessage { + let m2 = GenericMessage::BftMessage(message::LocalizedBftMessage { parent_hash: best_hash, - message: message::BftMessage::Auxiliary(Justification { + message: message::generic::BftMessage::Auxiliary(Justification { round_number: 0, hash: Default::default(), signatures: Default::default(), @@ -234,7 +234,14 @@ mod tests { assert_eq!(consensus.message_hashes.len(), 2); // random header, nothing should be cleared - let mut header = Header::from_block_number(0); + let mut header = Header { + parent_hash: H256::default(), + number: 0, + state_root: H256::default(), + extrinsics_root: H256::default(), + digest: Default::default(), + }; + consensus.collect_garbage(Some(&header)); assert_eq!(consensus.messages.len(), 2); assert_eq!(consensus.message_hashes.len(), 2); diff --git a/substrate/network/src/protocol.rs b/substrate/network/src/protocol.rs index 974051f40066c..d49b7be1c8139 100644 --- a/substrate/network/src/protocol.rs +++ b/substrate/network/src/protocol.rs @@ -22,7 +22,7 @@ use parking_lot::{RwLock, Mutex}; use serde_json; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing, HashingFor}; use runtime_primitives::generic::BlockId; -use network::{PeerId, NodeId}; +use network::PeerId; use message::{self, Message}; use message::generic::Message as GenericMessage; diff --git a/substrate/network/src/test/mod.rs b/substrate/network/src/test/mod.rs index e8c7219df6630..cc69a37c83eb0 100644 --- a/substrate/network/src/test/mod.rs +++ b/substrate/network/src/test/mod.rs @@ -203,7 +203,7 @@ impl TransactionPool for EmptyTransactionPool { None } - fn on_broadcasted(&self, _: HashMap>) {} + fn on_broadcasted(&self, _: HashMap>) {} } pub struct TestNet { From 4ec367020561c45ec1f57d4530d64c4b607221b1 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 2 Jun 2018 03:32:38 +0200 Subject: [PATCH 41/60] remove debugging file --- expanded.rs | 6603 --------------------------------------------------- 1 file changed, 6603 deletions(-) delete mode 100644 expanded.rs diff --git a/expanded.rs b/expanded.rs deleted file mode 100644 index 40eb674a1a27e..0000000000000 --- a/expanded.rs +++ /dev/null @@ -1,6603 +0,0 @@ -#![feature(prelude_import)] -#![no_std] -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! The Polkadot runtime. This can be compiled with ``#[no_std]`, ready for Wasm. -#[prelude_import] -use std::prelude::v1::*; -#[macro_use] -extern crate std; - - -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - -#[cfg(feature = "std")] -extern crate serde; - -#[macro_use] -extern crate substrate_runtime_io as runtime_io; - -#[macro_use] -extern crate substrate_runtime_support; - -#[macro_use] -extern crate substrate_runtime_primitives as runtime_primitives; - - - -#[macro_use] -extern crate substrate_primitives; - -extern crate substrate_runtime_std as rstd; -extern crate substrate_codec as codec; -extern crate substrate_runtime_consensus as consensus; -extern crate substrate_runtime_council as council; -extern crate substrate_runtime_democracy as democracy; -extern crate substrate_runtime_executive as executive; -extern crate substrate_runtime_session as session; -extern crate substrate_runtime_staking as staking; -extern crate substrate_runtime_system as system; -extern crate substrate_runtime_timestamp as timestamp; - -pub mod primitives { - - - - - - - // TODO: Option - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // 71000000 - // 0101010101010101010101010101010101010101010101010101010101010101 - // e703000000000000 - // 00 - // df0f0200 - // 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - - - - - //! Primitive types for the polkadot runtime. - use codec::{Slicable, Input}; - use rstd::prelude::*; - use rstd::cmp::Ordering; - use substrate_primitives; - use runtime_primitives::{self, generic, traits::BlakeTwo256}; - use super::Call; - #[cfg(feature = "std")] - use substrate_primitives::bytes; - /// Block header type as expected by this runtime. - pub type Header = generic::Header; - /// Block type as expected by this runtime. - pub type Block = - generic::Block; - /// Unchecked extrinsic type as expected by this runtime. - pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; - /// Extrinsic type as expected by this runtime. - pub type Extrinsic = generic::Extrinsic; - /// Something that identifies a block. - pub type BlockId = generic::BlockId; - /// A log entry in the block. - #[structural_match] - pub struct Log( - #[serde(with = "bytes")] - pub Vec); - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for Log { - #[inline] - fn eq(&self, other: &Log) -> bool { - match *other { - Log(ref __self_1_0) => - match *self { - Log(ref __self_0_0) => (*__self_0_0) == (*__self_1_0), - }, - } - } - #[inline] - fn ne(&self, other: &Log) -> bool { - match *other { - Log(ref __self_1_0) => - match *self { - Log(ref __self_0_0) => (*__self_0_0) != (*__self_1_0), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for Log { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { let _: ::std::cmp::AssertParamIsEq>; } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for Log { - #[inline] - fn clone(&self) -> Log { - match *self { - Log(ref __self_0_0) => - Log(::std::clone::Clone::clone(&(*__self_0_0))), - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::default::Default for Log { - #[inline] - fn default() -> Log { Log(::std::default::Default::default()) } - } - #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] - const _IMPL_SERIALIZE_FOR_Log: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } } - }); - #[automatically_derived] - impl _serde::Serialize for Log { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - _serde::Serializer::serialize_newtype_struct(__serializer, - "Log", - { - struct __SerializeWith<'__a> { - values: (&'__a Vec,), - phantom: _serde::export::PhantomData, - } - impl <'__a> - _serde::Serialize - for - __SerializeWith<'__a> - { - fn serialize<__S>(&self, - __s: - __S) - -> - _serde::export::Result<__S::Ok, - __S::Error> - where - __S: _serde::Serializer { - bytes::serialize(self.values.0, - __s) - } - } - &__SerializeWith{values: - (&self.0,), - phantom: - _serde::export::PhantomData::,} - }) - } - } - }; - #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_Log: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } } - }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for Log { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> { - type - Value - = - Log; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "tuple struct Log") - } - #[inline] - fn visit_newtype_struct<__E>(self, __e: __E) - -> _serde::export::Result - where __E: _serde::Deserializer<'de> { - let __field0: Vec = - match bytes::deserialize(__e) { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - _serde::export::Ok(Log(__field0)) - } - #[inline] - fn visit_seq<__A>(self, mut __seq: __A) - -> _serde::export::Result - where __A: _serde::de::SeqAccess<'de> { - let __field0 = - match { - struct __DeserializeWith<'de> { - value: Vec, - phantom: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::Deserialize<'de> - for __DeserializeWith<'de> { - fn deserialize<__D>(__deserializer: - __D) - -> - _serde::export::Result - where - __D: _serde::Deserializer<'de> { - _serde::export::Ok(__DeserializeWith{value: - match bytes::deserialize(__deserializer) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - phantom: - _serde::export::PhantomData, - lifetime: - _serde::export::PhantomData,}) - } - } - _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => { - return _serde::export::Err(__err); - } - }, - |__wrap| - __wrap.value) - } { - _serde::export::Some(__value) => __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(0usize, - &"tuple struct Log with 1 element")); - } - }; - _serde::export::Ok(Log(__field0)) - } - } - _serde::Deserializer::deserialize_newtype_struct(__deserializer, - "Log", - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for Log { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - match *self { - Log(ref __self_0_0) => { - let mut debug_trait_builder = f.debug_tuple("Log"); - let _ = debug_trait_builder.field(&&(*__self_0_0)); - debug_trait_builder.finish() - } - } - } - } - impl Slicable for Log { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Log) - } - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } - } - /// An index to a block. - /// 32-bits will allow for 136 years of blocks assuming 1 block per second. - /// TODO: switch to u32 - pub type BlockNumber = u64; - /// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost - /// certainly continue to be the same as the substrate's `AuthorityId`. - pub type AccountId = substrate_primitives::hash::H256; - /// The Ed25519 pub key of an session that belongs to an authority of the relay chain. This is - /// exactly equivalent to what the substrate calls an "authority". - pub type SessionKey = substrate_primitives::AuthorityId; - /// Indentifier for a chain. 32-bit should be plenty. - pub type ChainId = u32; - /// Index of a transaction in the relay chain. 32-bit should be plenty. - pub type Index = u32; - /// A hash of some data used by the relay chain. - pub type Hash = substrate_primitives::H256; - /// Alias to 512-bit hash when used in the context of a signature on the relay chain. - /// Equipped with logic for possibly "unsigned" messages. - pub type Signature = - runtime_primitives::MaybeUnsigned; - /// A timestamp: seconds since the unix epoch. - pub type Timestamp = u64; - /// The balance of an account. - /// 128-bits (or 38 significant decimal figures) will allow for 10m currency (10^7) at a resolution - /// to all for one second's worth of an annualised 50% reward be paid to a unit holder (10^11 unit - /// denomination), or 10^18 total atomic units, to grow at 50%/year for 51 years (10^9 multiplier) - /// for an eventual total of 10^27 units (27 significant decimal figures). - /// We round denomination to 10^12 (12 sdf), and leave the other redundancy at the upper end so - /// that 32 bits may be multiplied with a balance in 128 bits without worrying about overflow. - pub type Balance = u128; - /// Parachain data types. - pub mod parachain { - use super::*; - /// Unique identifier of a parachain. - #[structural_match] - #[rustc_copy_clone_marker] - pub struct Id(u32); - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for Id { - #[inline] - fn eq(&self, other: &Id) -> bool { - match *other { - Id(ref __self_1_0) => - match *self { - Id(ref __self_0_0) => (*__self_0_0) == (*__self_1_0), - }, - } - } - #[inline] - fn ne(&self, other: &Id) -> bool { - match *other { - Id(ref __self_1_0) => - match *self { - Id(ref __self_0_0) => (*__self_0_0) != (*__self_1_0), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for Id { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { let _: ::std::cmp::AssertParamIsEq; } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialOrd for Id { - #[inline] - fn partial_cmp(&self, other: &Id) - -> ::std::option::Option<::std::cmp::Ordering> { - match *other { - Id(ref __self_1_0) => - match *self { - Id(ref __self_0_0) => - match ::std::cmp::PartialOrd::partial_cmp(&(*__self_0_0), - &(*__self_1_0)) - { - ::std::option::Option::Some(::std::cmp::Ordering::Equal) - => - ::std::option::Option::Some(::std::cmp::Ordering::Equal), - cmp => cmp, - }, - }, - } - } - #[inline] - fn lt(&self, other: &Id) -> bool { - match *other { - Id(ref __self_1_0) => - match *self { - Id(ref __self_0_0) => (*__self_0_0) < (*__self_1_0), - }, - } - } - #[inline] - fn le(&self, other: &Id) -> bool { - match *other { - Id(ref __self_1_0) => - match *self { - Id(ref __self_0_0) => (*__self_0_0) <= (*__self_1_0), - }, - } - } - #[inline] - fn gt(&self, other: &Id) -> bool { - match *other { - Id(ref __self_1_0) => - match *self { - Id(ref __self_0_0) => (*__self_0_0) > (*__self_1_0), - }, - } - } - #[inline] - fn ge(&self, other: &Id) -> bool { - match *other { - Id(ref __self_1_0) => - match *self { - Id(ref __self_0_0) => (*__self_0_0) >= (*__self_1_0), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Ord for Id { - #[inline] - fn cmp(&self, other: &Id) -> ::std::cmp::Ordering { - match *other { - Id(ref __self_1_0) => - match *self { - Id(ref __self_0_0) => - match ::std::cmp::Ord::cmp(&(*__self_0_0), - &(*__self_1_0)) { - ::std::cmp::Ordering::Equal => - ::std::cmp::Ordering::Equal, - cmp => cmp, - }, - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::hash::Hash for Id { - fn hash<__H: ::std::hash::Hasher>(&self, state: &mut __H) -> () { - match *self { - Id(ref __self_0_0) => { - ::std::hash::Hash::hash(&(*__self_0_0), state) - } - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for Id { - #[inline] - fn clone(&self) -> Id { - { let _: ::std::clone::AssertParamIsClone; *self } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::marker::Copy for Id { } - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_SERIALIZE_FOR_Id: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl _serde::Serialize for Id { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - _serde::Serializer::serialize_newtype_struct(__serializer, - "Id", - &self.0) - } - } - }; - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_Id: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for Id { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> - { - type - Value - = - Id; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "tuple struct Id") - } - #[inline] - fn visit_newtype_struct<__E>(self, __e: __E) - -> - _serde::export::Result where - __E: _serde::Deserializer<'de> { - let __field0: u32 = - match ::deserialize(__e) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - _serde::export::Ok(Id(__field0)) - } - #[inline] - fn visit_seq<__A>(self, mut __seq: __A) - -> - _serde::export::Result where - __A: _serde::de::SeqAccess<'de> { - let __field0 = - match match _serde::de::SeqAccess::next_element::(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(0usize, - &"tuple struct Id with 1 element")); - } - }; - _serde::export::Ok(Id(__field0)) - } - } - _serde::Deserializer::deserialize_newtype_struct(__deserializer, - "Id", - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for Id { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - Id(ref __self_0_0) => { - let mut debug_trait_builder = f.debug_tuple("Id"); - let _ = debug_trait_builder.field(&&(*__self_0_0)); - debug_trait_builder.finish() - } - } - } - } - impl From for u32 { - fn from(x: Id) -> Self { x.0 } - } - impl From for Id { - fn from(x: u32) -> Self { Id(x) } - } - impl Id { - /// Convert this Id into its inner representation. - pub fn into_inner(self) -> u32 { self.0 } - } - impl Slicable for Id { - fn decode(input: &mut I) -> Option { - u32::decode(input).map(Id) - } - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } - } - /// Identifier for a chain, either one of a number of parachains or the relay chain. - #[rustc_copy_clone_marker] - pub enum Chain { - - /// The relay chain. - Relay, - - /// A parachain of the given index. - Parachain(Id), - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::marker::Copy for Chain { } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for Chain { - #[inline] - fn clone(&self) -> Chain { - { let _: ::std::clone::AssertParamIsClone; *self } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for Chain { - #[inline] - fn eq(&self, other: &Chain) -> bool { - { - let __self_vi = - unsafe { - ::std::intrinsics::discriminant_value(&*self) - } as isize; - let __arg_1_vi = - unsafe { - ::std::intrinsics::discriminant_value(&*other) - } as isize; - if true && __self_vi == __arg_1_vi { - match (&*self, &*other) { - (&Chain::Parachain(ref __self_0), - &Chain::Parachain(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - _ => true, - } - } else { false } - } - } - #[inline] - fn ne(&self, other: &Chain) -> bool { - { - let __self_vi = - unsafe { - ::std::intrinsics::discriminant_value(&*self) - } as isize; - let __arg_1_vi = - unsafe { - ::std::intrinsics::discriminant_value(&*other) - } as isize; - if true && __self_vi == __arg_1_vi { - match (&*self, &*other) { - (&Chain::Parachain(ref __self_0), - &Chain::Parachain(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - _ => false, - } - } else { true } - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for Chain { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match (&*self,) { - (&Chain::Relay,) => { - let mut debug_trait_builder = f.debug_tuple("Relay"); - debug_trait_builder.finish() - } - (&Chain::Parachain(ref __self_0),) => { - let mut debug_trait_builder = - f.debug_tuple("Parachain"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - } - } - } - impl Slicable for Chain { - fn decode(input: &mut I) -> Option { - let disc = input.read_byte()?; - match disc { - 0 => Some(Chain::Relay), - 1 => Some(Chain::Parachain(Slicable::decode(input)?)), - _ => None, - } - } - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Chain::Relay => { v.push(0); } - Chain::Parachain(id) => { - v.push(1u8); - id.using_encoded(|s| v.extend(s)); - } - } - v - } - fn using_encoded R>(&self, f: F) -> R { - f(&self.encode().as_slice()) - } - } - /// The duty roster specifying what jobs each validator must do. - pub struct DutyRoster { - /// Lookup from validator index to chain on which that validator has a duty to validate. - pub validator_duty: Vec, - /// Lookup from validator index to chain on which that validator has a duty to guarantee - /// availability. - pub guarantor_duty: Vec, - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for DutyRoster { - #[inline] - fn clone(&self) -> DutyRoster { - match *self { - DutyRoster { - validator_duty: ref __self_0_0, - guarantor_duty: ref __self_0_1 } => - DutyRoster{validator_duty: - ::std::clone::Clone::clone(&(*__self_0_0)), - guarantor_duty: - ::std::clone::Clone::clone(&(*__self_0_1)),}, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for DutyRoster { - #[inline] - fn eq(&self, other: &DutyRoster) -> bool { - match *other { - DutyRoster { - validator_duty: ref __self_1_0, - guarantor_duty: ref __self_1_1 } => - match *self { - DutyRoster { - validator_duty: ref __self_0_0, - guarantor_duty: ref __self_0_1 } => - (*__self_0_0) == (*__self_1_0) && - (*__self_0_1) == (*__self_1_1), - }, - } - } - #[inline] - fn ne(&self, other: &DutyRoster) -> bool { - match *other { - DutyRoster { - validator_duty: ref __self_1_0, - guarantor_duty: ref __self_1_1 } => - match *self { - DutyRoster { - validator_duty: ref __self_0_0, - guarantor_duty: ref __self_0_1 } => - (*__self_0_0) != (*__self_1_0) || - (*__self_0_1) != (*__self_1_1), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::default::Default for DutyRoster { - #[inline] - fn default() -> DutyRoster { - DutyRoster{validator_duty: ::std::default::Default::default(), - guarantor_duty: - ::std::default::Default::default(),} - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for DutyRoster { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - DutyRoster { - validator_duty: ref __self_0_0, - guarantor_duty: ref __self_0_1 } => { - let mut debug_trait_builder = - f.debug_struct("DutyRoster"); - let _ = - debug_trait_builder.field("validator_duty", - &&(*__self_0_0)); - let _ = - debug_trait_builder.field("guarantor_duty", - &&(*__self_0_1)); - debug_trait_builder.finish() - } - } - } - } - impl Slicable for DutyRoster { - fn decode(input: &mut I) -> Option { - Some(DutyRoster{validator_duty: Slicable::decode(input)?, - guarantor_duty: Slicable::decode(input)?,}) - } - fn encode(&self) -> Vec { - let mut v = Vec::new(); - v.extend(self.validator_duty.encode()); - v.extend(self.guarantor_duty.encode()); - v - } - fn using_encoded R>(&self, f: F) -> R { - f(&self.encode().as_slice()) - } - } - /// Extrinsic data for a parachain. - #[serde(rename_all = "camelCase")] - #[serde(deny_unknown_fields)] - #[structural_match] - pub struct Extrinsic; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for Extrinsic { - #[inline] - fn eq(&self, other: &Extrinsic) -> bool { - match *other { - Extrinsic => match *self { Extrinsic => true, }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for Extrinsic { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { { } } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for Extrinsic { - #[inline] - fn clone(&self) -> Extrinsic { - match *self { Extrinsic => Extrinsic, } - } - } - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_SERIALIZE_FOR_Extrinsic: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl _serde::Serialize for Extrinsic { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - _serde::Serializer::serialize_unit_struct(__serializer, - "Extrinsic") - } - } - }; - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_Extrinsic: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for Extrinsic { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - struct __Visitor; - impl <'de> _serde::de::Visitor<'de> for __Visitor { - type - Value - = - Extrinsic; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "unit struct Extrinsic") - } - #[inline] - fn visit_unit<__E>(self) - -> _serde::export::Result where - __E: _serde::de::Error { - _serde::export::Ok(Extrinsic) - } - } - _serde::Deserializer::deserialize_unit_struct(__deserializer, - "Extrinsic", - __Visitor) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for Extrinsic { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - Extrinsic => { - let mut debug_trait_builder = - f.debug_tuple("Extrinsic"); - debug_trait_builder.finish() - } - } - } - } - /// Candidate parachain block. - /// - /// https://github.com/w3f/polkadot-spec/blob/master/spec.md#candidate-para-chain-block - #[serde(rename_all = "camelCase")] - #[serde(deny_unknown_fields)] - #[structural_match] - pub struct Candidate { - /// The ID of the parachain this is a proposal for. - pub parachain_index: Id, - /// Collator's signature - pub collator_signature: runtime_primitives::Ed25519Signature, - /// Unprocessed ingress queue. - /// - /// Ordered by parachain ID and block number. - pub unprocessed_ingress: ConsolidatedIngress, - /// Block data - pub block: BlockData, - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for Candidate { - #[inline] - fn eq(&self, other: &Candidate) -> bool { - match *other { - Candidate { - parachain_index: ref __self_1_0, - collator_signature: ref __self_1_1, - unprocessed_ingress: ref __self_1_2, - block: ref __self_1_3 } => - match *self { - Candidate { - parachain_index: ref __self_0_0, - collator_signature: ref __self_0_1, - unprocessed_ingress: ref __self_0_2, - block: ref __self_0_3 } => - (*__self_0_0) == (*__self_1_0) && - (*__self_0_1) == (*__self_1_1) && - (*__self_0_2) == (*__self_1_2) && - (*__self_0_3) == (*__self_1_3), - }, - } - } - #[inline] - fn ne(&self, other: &Candidate) -> bool { - match *other { - Candidate { - parachain_index: ref __self_1_0, - collator_signature: ref __self_1_1, - unprocessed_ingress: ref __self_1_2, - block: ref __self_1_3 } => - match *self { - Candidate { - parachain_index: ref __self_0_0, - collator_signature: ref __self_0_1, - unprocessed_ingress: ref __self_0_2, - block: ref __self_0_3 } => - (*__self_0_0) != (*__self_1_0) || - (*__self_0_1) != (*__self_1_1) || - (*__self_0_2) != (*__self_1_2) || - (*__self_0_3) != (*__self_1_3), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for Candidate { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { - let _: ::std::cmp::AssertParamIsEq; - let _: - ::std::cmp::AssertParamIsEq; - let _: ::std::cmp::AssertParamIsEq; - let _: ::std::cmp::AssertParamIsEq; - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for Candidate { - #[inline] - fn clone(&self) -> Candidate { - match *self { - Candidate { - parachain_index: ref __self_0_0, - collator_signature: ref __self_0_1, - unprocessed_ingress: ref __self_0_2, - block: ref __self_0_3 } => - Candidate{parachain_index: - ::std::clone::Clone::clone(&(*__self_0_0)), - collator_signature: - ::std::clone::Clone::clone(&(*__self_0_1)), - unprocessed_ingress: - ::std::clone::Clone::clone(&(*__self_0_2)), - block: - ::std::clone::Clone::clone(&(*__self_0_3)),}, - } - } - } - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_SERIALIZE_FOR_Candidate: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl _serde::Serialize for Candidate { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - let mut __serde_state = - match _serde::Serializer::serialize_struct(__serializer, - "Candidate", - 0 + 1 + - 1 + - 1 + - 1) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, - "parachainIndex", - &self.parachain_index) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, - "collatorSignature", - &self.collator_signature) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, - "unprocessedIngress", - &self.unprocessed_ingress) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, - "block", - &self.block) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - _serde::ser::SerializeStruct::end(__serde_state) - } - } - }; - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_Candidate: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for Candidate { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum __Field { - __field0, - __field1, - __field2, - __field3, - } - struct __FieldVisitor; - impl <'de> _serde::de::Visitor<'de> for __FieldVisitor - { - type - Value - = - __Field; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "field identifier") - } - fn visit_u64<__E>(self, __value: u64) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - 0u64 => - _serde::export::Ok(__Field::__field0), - 1u64 => - _serde::export::Ok(__Field::__field1), - 2u64 => - _serde::export::Ok(__Field::__field2), - 3u64 => - _serde::export::Ok(__Field::__field3), - _ => - _serde::export::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value), - &"field index 0 <= i < 4")), - } - } - fn visit_str<__E>(self, __value: &str) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - "parachainIndex" => - _serde::export::Ok(__Field::__field0), - "collatorSignature" => - _serde::export::Ok(__Field::__field1), - "unprocessedIngress" => - _serde::export::Ok(__Field::__field2), - "block" => - _serde::export::Ok(__Field::__field3), - _ => { - _serde::export::Err(_serde::de::Error::unknown_field(__value, - FIELDS)) - } - } - } - fn visit_bytes<__E>(self, __value: &[u8]) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - b"parachainIndex" => - _serde::export::Ok(__Field::__field0), - b"collatorSignature" => - _serde::export::Ok(__Field::__field1), - b"unprocessedIngress" => - _serde::export::Ok(__Field::__field2), - b"block" => - _serde::export::Ok(__Field::__field3), - _ => { - let __value = - &_serde::export::from_utf8_lossy(__value); - _serde::export::Err(_serde::de::Error::unknown_field(__value, - FIELDS)) - } - } - } - } - impl <'de> _serde::Deserialize<'de> for __Field { - #[inline] - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - _serde::Deserializer::deserialize_identifier(__deserializer, - __FieldVisitor) - } - } - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> - { - type - Value - = - Candidate; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "struct Candidate") - } - #[inline] - fn visit_seq<__A>(self, mut __seq: __A) - -> - _serde::export::Result where - __A: _serde::de::SeqAccess<'de> { - let __field0 = - match match _serde::de::SeqAccess::next_element::(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(0usize, - &"struct Candidate with 4 elements")); - } - }; - let __field1 = - match match _serde::de::SeqAccess::next_element::(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(1usize, - &"struct Candidate with 4 elements")); - } - }; - let __field2 = - match match _serde::de::SeqAccess::next_element::(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(2usize, - &"struct Candidate with 4 elements")); - } - }; - let __field3 = - match match _serde::de::SeqAccess::next_element::(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(3usize, - &"struct Candidate with 4 elements")); - } - }; - _serde::export::Ok(Candidate{parachain_index: - __field0, - collator_signature: - __field1, - unprocessed_ingress: - __field2, - block: - __field3,}) - } - #[inline] - fn visit_map<__A>(self, mut __map: __A) - -> - _serde::export::Result where - __A: _serde::de::MapAccess<'de> { - let mut __field0: _serde::export::Option = - _serde::export::None; - let mut __field1: - _serde::export::Option = - _serde::export::None; - let mut __field2: - _serde::export::Option = - _serde::export::None; - let mut __field3: - _serde::export::Option = - _serde::export::None; - while let _serde::export::Some(__key) = - match _serde::de::MapAccess::next_key::<__Field>(&mut __map) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - match __key { - __Field::__field0 => { - if _serde::export::Option::is_some(&__field0) - { - return _serde::export::Err(<__A::Error - as - _serde::de::Error>::duplicate_field("parachainIndex")); - } - __field0 = - _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => { - return _serde::export::Err(__err); - } - }); - } - __Field::__field1 => { - if _serde::export::Option::is_some(&__field1) - { - return _serde::export::Err(<__A::Error - as - _serde::de::Error>::duplicate_field("collatorSignature")); - } - __field1 = - _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => { - return _serde::export::Err(__err); - } - }); - } - __Field::__field2 => { - if _serde::export::Option::is_some(&__field2) - { - return _serde::export::Err(<__A::Error - as - _serde::de::Error>::duplicate_field("unprocessedIngress")); - } - __field2 = - _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => { - return _serde::export::Err(__err); - } - }); - } - __Field::__field3 => { - if _serde::export::Option::is_some(&__field3) - { - return _serde::export::Err(<__A::Error - as - _serde::de::Error>::duplicate_field("block")); - } - __field3 = - _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => { - return _serde::export::Err(__err); - } - }); - } - } - } - let __field0 = - match __field0 { - _serde::export::Some(__field0) => - __field0, - _serde::export::None => - match _serde::private::de::missing_field("parachainIndex") - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }, - }; - let __field1 = - match __field1 { - _serde::export::Some(__field1) => - __field1, - _serde::export::None => - match _serde::private::de::missing_field("collatorSignature") - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }, - }; - let __field2 = - match __field2 { - _serde::export::Some(__field2) => - __field2, - _serde::export::None => - match _serde::private::de::missing_field("unprocessedIngress") - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }, - }; - let __field3 = - match __field3 { - _serde::export::Some(__field3) => - __field3, - _serde::export::None => - match _serde::private::de::missing_field("block") - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }, - }; - _serde::export::Ok(Candidate{parachain_index: - __field0, - collator_signature: - __field1, - unprocessed_ingress: - __field2, - block: - __field3,}) - } - } - const FIELDS: &'static [&'static str] = - &["parachainIndex", "collatorSignature", - "unprocessedIngress", "block"]; - _serde::Deserializer::deserialize_struct(__deserializer, - "Candidate", - FIELDS, - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for Candidate { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - Candidate { - parachain_index: ref __self_0_0, - collator_signature: ref __self_0_1, - unprocessed_ingress: ref __self_0_2, - block: ref __self_0_3 } => { - let mut debug_trait_builder = - f.debug_struct("Candidate"); - let _ = - debug_trait_builder.field("parachain_index", - &&(*__self_0_0)); - let _ = - debug_trait_builder.field("collator_signature", - &&(*__self_0_1)); - let _ = - debug_trait_builder.field("unprocessed_ingress", - &&(*__self_0_2)); - let _ = - debug_trait_builder.field("block", - &&(*__self_0_3)); - debug_trait_builder.finish() - } - } - } - } - /// Candidate receipt type. - #[serde(rename_all = "camelCase")] - #[serde(deny_unknown_fields)] - #[structural_match] - pub struct CandidateReceipt { - /// The ID of the parachain this is a candidate for. - pub parachain_index: Id, - /// The collator's relay-chain account ID - pub collator: super::AccountId, - /// The head-data - pub head_data: HeadData, - /// Balance uploads to the relay chain. - pub balance_uploads: Vec<(super::AccountId, u64)>, - /// Egress queue roots. - pub egress_queue_roots: Vec<(Id, Hash)>, - /// Fees paid from the chain to the relay chain validators - pub fees: u64, - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for CandidateReceipt { - #[inline] - fn eq(&self, other: &CandidateReceipt) -> bool { - match *other { - CandidateReceipt { - parachain_index: ref __self_1_0, - collator: ref __self_1_1, - head_data: ref __self_1_2, - balance_uploads: ref __self_1_3, - egress_queue_roots: ref __self_1_4, - fees: ref __self_1_5 } => - match *self { - CandidateReceipt { - parachain_index: ref __self_0_0, - collator: ref __self_0_1, - head_data: ref __self_0_2, - balance_uploads: ref __self_0_3, - egress_queue_roots: ref __self_0_4, - fees: ref __self_0_5 } => - (*__self_0_0) == (*__self_1_0) && - (*__self_0_1) == (*__self_1_1) && - (*__self_0_2) == (*__self_1_2) && - (*__self_0_3) == (*__self_1_3) && - (*__self_0_4) == (*__self_1_4) && - (*__self_0_5) == (*__self_1_5), - }, - } - } - #[inline] - fn ne(&self, other: &CandidateReceipt) -> bool { - match *other { - CandidateReceipt { - parachain_index: ref __self_1_0, - collator: ref __self_1_1, - head_data: ref __self_1_2, - balance_uploads: ref __self_1_3, - egress_queue_roots: ref __self_1_4, - fees: ref __self_1_5 } => - match *self { - CandidateReceipt { - parachain_index: ref __self_0_0, - collator: ref __self_0_1, - head_data: ref __self_0_2, - balance_uploads: ref __self_0_3, - egress_queue_roots: ref __self_0_4, - fees: ref __self_0_5 } => - (*__self_0_0) != (*__self_1_0) || - (*__self_0_1) != (*__self_1_1) || - (*__self_0_2) != (*__self_1_2) || - (*__self_0_3) != (*__self_1_3) || - (*__self_0_4) != (*__self_1_4) || - (*__self_0_5) != (*__self_1_5), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for CandidateReceipt { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { - let _: ::std::cmp::AssertParamIsEq; - let _: ::std::cmp::AssertParamIsEq; - let _: ::std::cmp::AssertParamIsEq; - let _: - ::std::cmp::AssertParamIsEq>; - let _: ::std::cmp::AssertParamIsEq>; - let _: ::std::cmp::AssertParamIsEq; - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for CandidateReceipt { - #[inline] - fn clone(&self) -> CandidateReceipt { - match *self { - CandidateReceipt { - parachain_index: ref __self_0_0, - collator: ref __self_0_1, - head_data: ref __self_0_2, - balance_uploads: ref __self_0_3, - egress_queue_roots: ref __self_0_4, - fees: ref __self_0_5 } => - CandidateReceipt{parachain_index: - ::std::clone::Clone::clone(&(*__self_0_0)), - collator: - ::std::clone::Clone::clone(&(*__self_0_1)), - head_data: - ::std::clone::Clone::clone(&(*__self_0_2)), - balance_uploads: - ::std::clone::Clone::clone(&(*__self_0_3)), - egress_queue_roots: - ::std::clone::Clone::clone(&(*__self_0_4)), - fees: - ::std::clone::Clone::clone(&(*__self_0_5)),}, - } - } - } - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_SERIALIZE_FOR_CandidateReceipt: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl _serde::Serialize for CandidateReceipt { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - let mut __serde_state = - match _serde::Serializer::serialize_struct(__serializer, - "CandidateReceipt", - 0 + 1 + - 1 + - 1 + - 1 + - 1 + - 1) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, - "parachainIndex", - &self.parachain_index) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, - "collator", - &self.collator) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, - "headData", - &self.head_data) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, - "balanceUploads", - &self.balance_uploads) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, - "egressQueueRoots", - &self.egress_queue_roots) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - match _serde::ser::SerializeStruct::serialize_field(&mut __serde_state, - "fees", - &self.fees) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - _serde::ser::SerializeStruct::end(__serde_state) - } - } - }; - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_CandidateReceipt: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for CandidateReceipt { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum __Field { - __field0, - __field1, - __field2, - __field3, - __field4, - __field5, - } - struct __FieldVisitor; - impl <'de> _serde::de::Visitor<'de> for __FieldVisitor - { - type - Value - = - __Field; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "field identifier") - } - fn visit_u64<__E>(self, __value: u64) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - 0u64 => - _serde::export::Ok(__Field::__field0), - 1u64 => - _serde::export::Ok(__Field::__field1), - 2u64 => - _serde::export::Ok(__Field::__field2), - 3u64 => - _serde::export::Ok(__Field::__field3), - 4u64 => - _serde::export::Ok(__Field::__field4), - 5u64 => - _serde::export::Ok(__Field::__field5), - _ => - _serde::export::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value), - &"field index 0 <= i < 6")), - } - } - fn visit_str<__E>(self, __value: &str) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - "parachainIndex" => - _serde::export::Ok(__Field::__field0), - "collator" => - _serde::export::Ok(__Field::__field1), - "headData" => - _serde::export::Ok(__Field::__field2), - "balanceUploads" => - _serde::export::Ok(__Field::__field3), - "egressQueueRoots" => - _serde::export::Ok(__Field::__field4), - "fees" => - _serde::export::Ok(__Field::__field5), - _ => { - _serde::export::Err(_serde::de::Error::unknown_field(__value, - FIELDS)) - } - } - } - fn visit_bytes<__E>(self, __value: &[u8]) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - b"parachainIndex" => - _serde::export::Ok(__Field::__field0), - b"collator" => - _serde::export::Ok(__Field::__field1), - b"headData" => - _serde::export::Ok(__Field::__field2), - b"balanceUploads" => - _serde::export::Ok(__Field::__field3), - b"egressQueueRoots" => - _serde::export::Ok(__Field::__field4), - b"fees" => - _serde::export::Ok(__Field::__field5), - _ => { - let __value = - &_serde::export::from_utf8_lossy(__value); - _serde::export::Err(_serde::de::Error::unknown_field(__value, - FIELDS)) - } - } - } - } - impl <'de> _serde::Deserialize<'de> for __Field { - #[inline] - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - _serde::Deserializer::deserialize_identifier(__deserializer, - __FieldVisitor) - } - } - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> - { - type - Value - = - CandidateReceipt; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "struct CandidateReceipt") - } - #[inline] - fn visit_seq<__A>(self, mut __seq: __A) - -> - _serde::export::Result where - __A: _serde::de::SeqAccess<'de> { - let __field0 = - match match _serde::de::SeqAccess::next_element::(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(0usize, - &"struct CandidateReceipt with 6 elements")); - } - }; - let __field1 = - match match _serde::de::SeqAccess::next_element::(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(1usize, - &"struct CandidateReceipt with 6 elements")); - } - }; - let __field2 = - match match _serde::de::SeqAccess::next_element::(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(2usize, - &"struct CandidateReceipt with 6 elements")); - } - }; - let __field3 = - match match _serde::de::SeqAccess::next_element::>(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(3usize, - &"struct CandidateReceipt with 6 elements")); - } - }; - let __field4 = - match match _serde::de::SeqAccess::next_element::>(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(4usize, - &"struct CandidateReceipt with 6 elements")); - } - }; - let __field5 = - match match _serde::de::SeqAccess::next_element::(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(5usize, - &"struct CandidateReceipt with 6 elements")); - } - }; - _serde::export::Ok(CandidateReceipt{parachain_index: - __field0, - collator: - __field1, - head_data: - __field2, - balance_uploads: - __field3, - egress_queue_roots: - __field4, - fees: - __field5,}) - } - #[inline] - fn visit_map<__A>(self, mut __map: __A) - -> - _serde::export::Result where - __A: _serde::de::MapAccess<'de> { - let mut __field0: _serde::export::Option = - _serde::export::None; - let mut __field1: - _serde::export::Option = - _serde::export::None; - let mut __field2: - _serde::export::Option = - _serde::export::None; - let mut __field3: - _serde::export::Option> = - _serde::export::None; - let mut __field4: - _serde::export::Option> = - _serde::export::None; - let mut __field5: - _serde::export::Option = - _serde::export::None; - while let _serde::export::Some(__key) = - match _serde::de::MapAccess::next_key::<__Field>(&mut __map) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - match __key { - __Field::__field0 => { - if _serde::export::Option::is_some(&__field0) - { - return _serde::export::Err(<__A::Error - as - _serde::de::Error>::duplicate_field("parachainIndex")); - } - __field0 = - _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => { - return _serde::export::Err(__err); - } - }); - } - __Field::__field1 => { - if _serde::export::Option::is_some(&__field1) - { - return _serde::export::Err(<__A::Error - as - _serde::de::Error>::duplicate_field("collator")); - } - __field1 = - _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => { - return _serde::export::Err(__err); - } - }); - } - __Field::__field2 => { - if _serde::export::Option::is_some(&__field2) - { - return _serde::export::Err(<__A::Error - as - _serde::de::Error>::duplicate_field("headData")); - } - __field2 = - _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => { - return _serde::export::Err(__err); - } - }); - } - __Field::__field3 => { - if _serde::export::Option::is_some(&__field3) - { - return _serde::export::Err(<__A::Error - as - _serde::de::Error>::duplicate_field("balanceUploads")); - } - __field3 = - _serde::export::Some(match _serde::de::MapAccess::next_value::>(&mut __map) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => { - return _serde::export::Err(__err); - } - }); - } - __Field::__field4 => { - if _serde::export::Option::is_some(&__field4) - { - return _serde::export::Err(<__A::Error - as - _serde::de::Error>::duplicate_field("egressQueueRoots")); - } - __field4 = - _serde::export::Some(match _serde::de::MapAccess::next_value::>(&mut __map) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => { - return _serde::export::Err(__err); - } - }); - } - __Field::__field5 => { - if _serde::export::Option::is_some(&__field5) - { - return _serde::export::Err(<__A::Error - as - _serde::de::Error>::duplicate_field("fees")); - } - __field5 = - _serde::export::Some(match _serde::de::MapAccess::next_value::(&mut __map) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => { - return _serde::export::Err(__err); - } - }); - } - } - } - let __field0 = - match __field0 { - _serde::export::Some(__field0) => - __field0, - _serde::export::None => - match _serde::private::de::missing_field("parachainIndex") - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }, - }; - let __field1 = - match __field1 { - _serde::export::Some(__field1) => - __field1, - _serde::export::None => - match _serde::private::de::missing_field("collator") - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }, - }; - let __field2 = - match __field2 { - _serde::export::Some(__field2) => - __field2, - _serde::export::None => - match _serde::private::de::missing_field("headData") - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }, - }; - let __field3 = - match __field3 { - _serde::export::Some(__field3) => - __field3, - _serde::export::None => - match _serde::private::de::missing_field("balanceUploads") - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }, - }; - let __field4 = - match __field4 { - _serde::export::Some(__field4) => - __field4, - _serde::export::None => - match _serde::private::de::missing_field("egressQueueRoots") - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }, - }; - let __field5 = - match __field5 { - _serde::export::Some(__field5) => - __field5, - _serde::export::None => - match _serde::private::de::missing_field("fees") - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }, - }; - _serde::export::Ok(CandidateReceipt{parachain_index: - __field0, - collator: - __field1, - head_data: - __field2, - balance_uploads: - __field3, - egress_queue_roots: - __field4, - fees: - __field5,}) - } - } - const FIELDS: &'static [&'static str] = - &["parachainIndex", "collator", "headData", - "balanceUploads", "egressQueueRoots", "fees"]; - _serde::Deserializer::deserialize_struct(__deserializer, - "CandidateReceipt", - FIELDS, - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for CandidateReceipt { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - CandidateReceipt { - parachain_index: ref __self_0_0, - collator: ref __self_0_1, - head_data: ref __self_0_2, - balance_uploads: ref __self_0_3, - egress_queue_roots: ref __self_0_4, - fees: ref __self_0_5 } => { - let mut debug_trait_builder = - f.debug_struct("CandidateReceipt"); - let _ = - debug_trait_builder.field("parachain_index", - &&(*__self_0_0)); - let _ = - debug_trait_builder.field("collator", - &&(*__self_0_1)); - let _ = - debug_trait_builder.field("head_data", - &&(*__self_0_2)); - let _ = - debug_trait_builder.field("balance_uploads", - &&(*__self_0_3)); - let _ = - debug_trait_builder.field("egress_queue_roots", - &&(*__self_0_4)); - let _ = - debug_trait_builder.field("fees", - &&(*__self_0_5)); - debug_trait_builder.finish() - } - } - } - } - impl Slicable for CandidateReceipt { - fn encode(&self) -> Vec { - let mut v = Vec::new(); - self.parachain_index.using_encoded(|s| v.extend(s)); - self.collator.using_encoded(|s| v.extend(s)); - self.head_data.0.using_encoded(|s| v.extend(s)); - self.balance_uploads.using_encoded(|s| v.extend(s)); - self.egress_queue_roots.using_encoded(|s| v.extend(s)); - self.fees.using_encoded(|s| v.extend(s)); - v - } - fn decode(input: &mut I) -> Option { - Some(CandidateReceipt{parachain_index: - Slicable::decode(input)?, - collator: Slicable::decode(input)?, - head_data: - Slicable::decode(input).map(HeadData)?, - balance_uploads: - Slicable::decode(input)?, - egress_queue_roots: - Slicable::decode(input)?, - fees: Slicable::decode(input)?,}) - } - } - impl CandidateReceipt { - /// Get the blake2_256 hash - #[cfg(feature = "std")] - pub fn hash(&self) -> Hash { - use runtime_primitives::traits::Hashing; - BlakeTwo256::hash_of(self) - } - } - impl PartialOrd for CandidateReceipt { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } - } - impl Ord for CandidateReceipt { - fn cmp(&self, other: &Self) -> Ordering { - self.parachain_index.cmp(&other.parachain_index).then_with(|| - self.head_data.cmp(&other.head_data)) - } - } - /// Parachain ingress queue message. - #[structural_match] - pub struct Message( - #[serde(with = "bytes")] - pub Vec); - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for Message { - #[inline] - fn eq(&self, other: &Message) -> bool { - match *other { - Message(ref __self_1_0) => - match *self { - Message(ref __self_0_0) => - (*__self_0_0) == (*__self_1_0), - }, - } - } - #[inline] - fn ne(&self, other: &Message) -> bool { - match *other { - Message(ref __self_1_0) => - match *self { - Message(ref __self_0_0) => - (*__self_0_0) != (*__self_1_0), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for Message { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { let _: ::std::cmp::AssertParamIsEq>; } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for Message { - #[inline] - fn clone(&self) -> Message { - match *self { - Message(ref __self_0_0) => - Message(::std::clone::Clone::clone(&(*__self_0_0))), - } - } - } - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_SERIALIZE_FOR_Message: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl _serde::Serialize for Message { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - _serde::Serializer::serialize_newtype_struct(__serializer, - "Message", - { - struct __SerializeWith<'__a> { - values: (&'__a Vec,), - phantom: _serde::export::PhantomData, - } - impl <'__a> - _serde::Serialize - for - __SerializeWith<'__a> - { - fn serialize<__S>(&self, - __s: - __S) - -> - _serde::export::Result<__S::Ok, - __S::Error> - where - __S: _serde::Serializer { - bytes::serialize(self.values.0, - __s) - } - } - &__SerializeWith{values: - (&self.0,), - phantom: - _serde::export::PhantomData::,} - }) - } - } - }; - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_Message: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for Message { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> - { - type - Value - = - Message; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "tuple struct Message") - } - #[inline] - fn visit_newtype_struct<__E>(self, __e: __E) - -> - _serde::export::Result where - __E: _serde::Deserializer<'de> { - let __field0: Vec = - match bytes::deserialize(__e) { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - _serde::export::Ok(Message(__field0)) - } - #[inline] - fn visit_seq<__A>(self, mut __seq: __A) - -> - _serde::export::Result where - __A: _serde::de::SeqAccess<'de> { - let __field0 = - match { - struct __DeserializeWith<'de> { - value: Vec, - phantom: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> - _serde::Deserialize<'de> for - __DeserializeWith<'de> { - fn deserialize<__D>(__deserializer: - __D) - -> - _serde::export::Result - where - __D: _serde::Deserializer<'de> { - _serde::export::Ok(__DeserializeWith{value: - match bytes::deserialize(__deserializer) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - phantom: - _serde::export::PhantomData, - lifetime: - _serde::export::PhantomData,}) - } - } - _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - |__wrap| - __wrap.value) - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(0usize, - &"tuple struct Message with 1 element")); - } - }; - _serde::export::Ok(Message(__field0)) - } - } - _serde::Deserializer::deserialize_newtype_struct(__deserializer, - "Message", - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for Message { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - Message(ref __self_0_0) => { - let mut debug_trait_builder = - f.debug_tuple("Message"); - let _ = debug_trait_builder.field(&&(*__self_0_0)); - debug_trait_builder.finish() - } - } - } - } - /// Consolidated ingress queue data. - /// - /// This is just an ordered vector of other parachains' egress queues, - /// obtained according to the routing rules. - #[structural_match] - pub struct ConsolidatedIngress(pub Vec<(Id, Vec)>); - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::default::Default for ConsolidatedIngress { - #[inline] - fn default() -> ConsolidatedIngress { - ConsolidatedIngress(::std::default::Default::default()) - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for ConsolidatedIngress { - #[inline] - fn eq(&self, other: &ConsolidatedIngress) -> bool { - match *other { - ConsolidatedIngress(ref __self_1_0) => - match *self { - ConsolidatedIngress(ref __self_0_0) => - (*__self_0_0) == (*__self_1_0), - }, - } - } - #[inline] - fn ne(&self, other: &ConsolidatedIngress) -> bool { - match *other { - ConsolidatedIngress(ref __self_1_0) => - match *self { - ConsolidatedIngress(ref __self_0_0) => - (*__self_0_0) != (*__self_1_0), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for ConsolidatedIngress { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { - let _: - ::std::cmp::AssertParamIsEq)>>; - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for ConsolidatedIngress { - #[inline] - fn clone(&self) -> ConsolidatedIngress { - match *self { - ConsolidatedIngress(ref __self_0_0) => - ConsolidatedIngress(::std::clone::Clone::clone(&(*__self_0_0))), - } - } - } - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_SERIALIZE_FOR_ConsolidatedIngress: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl _serde::Serialize for ConsolidatedIngress { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - _serde::Serializer::serialize_newtype_struct(__serializer, - "ConsolidatedIngress", - &self.0) - } - } - }; - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_ConsolidatedIngress: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for ConsolidatedIngress { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> - { - type - Value - = - ConsolidatedIngress; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "tuple struct ConsolidatedIngress") - } - #[inline] - fn visit_newtype_struct<__E>(self, __e: __E) - -> - _serde::export::Result where - __E: _serde::Deserializer<'de> { - let __field0: Vec<(Id, Vec)> = - match )> as - _serde::Deserialize>::deserialize(__e) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - _serde::export::Ok(ConsolidatedIngress(__field0)) - } - #[inline] - fn visit_seq<__A>(self, mut __seq: __A) - -> - _serde::export::Result where - __A: _serde::de::SeqAccess<'de> { - let __field0 = - match match _serde::de::SeqAccess::next_element::)>>(&mut __seq) - { - _serde::export::Ok(__val) => - __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(0usize, - &"tuple struct ConsolidatedIngress with 1 element")); - } - }; - _serde::export::Ok(ConsolidatedIngress(__field0)) - } - } - _serde::Deserializer::deserialize_newtype_struct(__deserializer, - "ConsolidatedIngress", - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for ConsolidatedIngress { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - ConsolidatedIngress(ref __self_0_0) => { - let mut debug_trait_builder = - f.debug_tuple("ConsolidatedIngress"); - let _ = debug_trait_builder.field(&&(*__self_0_0)); - debug_trait_builder.finish() - } - } - } - } - /// Parachain block data. - /// - /// contains everything required to validate para-block, may contain block and witness data - #[structural_match] - pub struct BlockData( - #[serde(with = "bytes")] - pub Vec); - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for BlockData { - #[inline] - fn eq(&self, other: &BlockData) -> bool { - match *other { - BlockData(ref __self_1_0) => - match *self { - BlockData(ref __self_0_0) => - (*__self_0_0) == (*__self_1_0), - }, - } - } - #[inline] - fn ne(&self, other: &BlockData) -> bool { - match *other { - BlockData(ref __self_1_0) => - match *self { - BlockData(ref __self_0_0) => - (*__self_0_0) != (*__self_1_0), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for BlockData { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { let _: ::std::cmp::AssertParamIsEq>; } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for BlockData { - #[inline] - fn clone(&self) -> BlockData { - match *self { - BlockData(ref __self_0_0) => - BlockData(::std::clone::Clone::clone(&(*__self_0_0))), - } - } - } - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_SERIALIZE_FOR_BlockData: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl _serde::Serialize for BlockData { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - _serde::Serializer::serialize_newtype_struct(__serializer, - "BlockData", - { - struct __SerializeWith<'__a> { - values: (&'__a Vec,), - phantom: _serde::export::PhantomData, - } - impl <'__a> - _serde::Serialize - for - __SerializeWith<'__a> - { - fn serialize<__S>(&self, - __s: - __S) - -> - _serde::export::Result<__S::Ok, - __S::Error> - where - __S: _serde::Serializer { - bytes::serialize(self.values.0, - __s) - } - } - &__SerializeWith{values: - (&self.0,), - phantom: - _serde::export::PhantomData::,} - }) - } - } - }; - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_BlockData: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for BlockData { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> - { - type - Value - = - BlockData; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "tuple struct BlockData") - } - #[inline] - fn visit_newtype_struct<__E>(self, __e: __E) - -> - _serde::export::Result where - __E: _serde::Deserializer<'de> { - let __field0: Vec = - match bytes::deserialize(__e) { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - _serde::export::Ok(BlockData(__field0)) - } - #[inline] - fn visit_seq<__A>(self, mut __seq: __A) - -> - _serde::export::Result where - __A: _serde::de::SeqAccess<'de> { - let __field0 = - match { - struct __DeserializeWith<'de> { - value: Vec, - phantom: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> - _serde::Deserialize<'de> for - __DeserializeWith<'de> { - fn deserialize<__D>(__deserializer: - __D) - -> - _serde::export::Result - where - __D: _serde::Deserializer<'de> { - _serde::export::Ok(__DeserializeWith{value: - match bytes::deserialize(__deserializer) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - phantom: - _serde::export::PhantomData, - lifetime: - _serde::export::PhantomData,}) - } - } - _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - |__wrap| - __wrap.value) - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(0usize, - &"tuple struct BlockData with 1 element")); - } - }; - _serde::export::Ok(BlockData(__field0)) - } - } - _serde::Deserializer::deserialize_newtype_struct(__deserializer, - "BlockData", - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for BlockData { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - BlockData(ref __self_0_0) => { - let mut debug_trait_builder = - f.debug_tuple("BlockData"); - let _ = debug_trait_builder.field(&&(*__self_0_0)); - debug_trait_builder.finish() - } - } - } - } - /// Parachain header raw bytes wrapper type. - #[structural_match] - pub struct Header( - #[serde(with = "bytes")] - pub Vec); - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for Header { - #[inline] - fn eq(&self, other: &Header) -> bool { - match *other { - Header(ref __self_1_0) => - match *self { - Header(ref __self_0_0) => - (*__self_0_0) == (*__self_1_0), - }, - } - } - #[inline] - fn ne(&self, other: &Header) -> bool { - match *other { - Header(ref __self_1_0) => - match *self { - Header(ref __self_0_0) => - (*__self_0_0) != (*__self_1_0), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for Header { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { let _: ::std::cmp::AssertParamIsEq>; } - } - } - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_SERIALIZE_FOR_Header: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl _serde::Serialize for Header { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - _serde::Serializer::serialize_newtype_struct(__serializer, - "Header", - { - struct __SerializeWith<'__a> { - values: (&'__a Vec,), - phantom: _serde::export::PhantomData
    , - } - impl <'__a> - _serde::Serialize - for - __SerializeWith<'__a> - { - fn serialize<__S>(&self, - __s: - __S) - -> - _serde::export::Result<__S::Ok, - __S::Error> - where - __S: _serde::Serializer { - bytes::serialize(self.values.0, - __s) - } - } - &__SerializeWith{values: - (&self.0,), - phantom: - _serde::export::PhantomData::
    ,} - }) - } - } - }; - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_Header: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for Header { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - struct __Visitor<'de> { - marker: _serde::export::PhantomData
    , - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> - { - type - Value - = - Header; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "tuple struct Header") - } - #[inline] - fn visit_newtype_struct<__E>(self, __e: __E) - -> - _serde::export::Result where - __E: _serde::Deserializer<'de> { - let __field0: Vec = - match bytes::deserialize(__e) { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - _serde::export::Ok(Header(__field0)) - } - #[inline] - fn visit_seq<__A>(self, mut __seq: __A) - -> - _serde::export::Result where - __A: _serde::de::SeqAccess<'de> { - let __field0 = - match { - struct __DeserializeWith<'de> { - value: Vec, - phantom: _serde::export::PhantomData
    , - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> - _serde::Deserialize<'de> for - __DeserializeWith<'de> { - fn deserialize<__D>(__deserializer: - __D) - -> - _serde::export::Result - where - __D: _serde::Deserializer<'de> { - _serde::export::Ok(__DeserializeWith{value: - match bytes::deserialize(__deserializer) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - phantom: - _serde::export::PhantomData, - lifetime: - _serde::export::PhantomData,}) - } - } - _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - |__wrap| - __wrap.value) - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(0usize, - &"tuple struct Header with 1 element")); - } - }; - _serde::export::Ok(Header(__field0)) - } - } - _serde::Deserializer::deserialize_newtype_struct(__deserializer, - "Header", - __Visitor{marker: - _serde::export::PhantomData::
    , - lifetime: - _serde::export::PhantomData,}) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for Header { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - Header(ref __self_0_0) => { - let mut debug_trait_builder = f.debug_tuple("Header"); - let _ = debug_trait_builder.field(&&(*__self_0_0)); - debug_trait_builder.finish() - } - } - } - } - /// Parachain head data included in the chain. - #[structural_match] - pub struct HeadData( - #[serde(with = "bytes")] - pub Vec); - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for HeadData { - #[inline] - fn eq(&self, other: &HeadData) -> bool { - match *other { - HeadData(ref __self_1_0) => - match *self { - HeadData(ref __self_0_0) => - (*__self_0_0) == (*__self_1_0), - }, - } - } - #[inline] - fn ne(&self, other: &HeadData) -> bool { - match *other { - HeadData(ref __self_1_0) => - match *self { - HeadData(ref __self_0_0) => - (*__self_0_0) != (*__self_1_0), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for HeadData { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { let _: ::std::cmp::AssertParamIsEq>; } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for HeadData { - #[inline] - fn clone(&self) -> HeadData { - match *self { - HeadData(ref __self_0_0) => - HeadData(::std::clone::Clone::clone(&(*__self_0_0))), - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialOrd for HeadData { - #[inline] - fn partial_cmp(&self, other: &HeadData) - -> ::std::option::Option<::std::cmp::Ordering> { - match *other { - HeadData(ref __self_1_0) => - match *self { - HeadData(ref __self_0_0) => - match ::std::cmp::PartialOrd::partial_cmp(&(*__self_0_0), - &(*__self_1_0)) - { - ::std::option::Option::Some(::std::cmp::Ordering::Equal) - => - ::std::option::Option::Some(::std::cmp::Ordering::Equal), - cmp => cmp, - }, - }, - } - } - #[inline] - fn lt(&self, other: &HeadData) -> bool { - match *other { - HeadData(ref __self_1_0) => - match *self { - HeadData(ref __self_0_0) => - (*__self_0_0) < (*__self_1_0), - }, - } - } - #[inline] - fn le(&self, other: &HeadData) -> bool { - match *other { - HeadData(ref __self_1_0) => - match *self { - HeadData(ref __self_0_0) => - (*__self_0_0) <= (*__self_1_0), - }, - } - } - #[inline] - fn gt(&self, other: &HeadData) -> bool { - match *other { - HeadData(ref __self_1_0) => - match *self { - HeadData(ref __self_0_0) => - (*__self_0_0) > (*__self_1_0), - }, - } - } - #[inline] - fn ge(&self, other: &HeadData) -> bool { - match *other { - HeadData(ref __self_1_0) => - match *self { - HeadData(ref __self_0_0) => - (*__self_0_0) >= (*__self_1_0), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Ord for HeadData { - #[inline] - fn cmp(&self, other: &HeadData) -> ::std::cmp::Ordering { - match *other { - HeadData(ref __self_1_0) => - match *self { - HeadData(ref __self_0_0) => - match ::std::cmp::Ord::cmp(&(*__self_0_0), - &(*__self_1_0)) { - ::std::cmp::Ordering::Equal => - ::std::cmp::Ordering::Equal, - cmp => cmp, - }, - }, - } - } - } - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_SERIALIZE_FOR_HeadData: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl _serde::Serialize for HeadData { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - _serde::Serializer::serialize_newtype_struct(__serializer, - "HeadData", - { - struct __SerializeWith<'__a> { - values: (&'__a Vec,), - phantom: _serde::export::PhantomData, - } - impl <'__a> - _serde::Serialize - for - __SerializeWith<'__a> - { - fn serialize<__S>(&self, - __s: - __S) - -> - _serde::export::Result<__S::Ok, - __S::Error> - where - __S: _serde::Serializer { - bytes::serialize(self.values.0, - __s) - } - } - &__SerializeWith{values: - (&self.0,), - phantom: - _serde::export::PhantomData::,} - }) - } - } - }; - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_HeadData: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for HeadData { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> - { - type - Value - = - HeadData; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "tuple struct HeadData") - } - #[inline] - fn visit_newtype_struct<__E>(self, __e: __E) - -> - _serde::export::Result where - __E: _serde::Deserializer<'de> { - let __field0: Vec = - match bytes::deserialize(__e) { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - _serde::export::Ok(HeadData(__field0)) - } - #[inline] - fn visit_seq<__A>(self, mut __seq: __A) - -> - _serde::export::Result where - __A: _serde::de::SeqAccess<'de> { - let __field0 = - match { - struct __DeserializeWith<'de> { - value: Vec, - phantom: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> - _serde::Deserialize<'de> for - __DeserializeWith<'de> { - fn deserialize<__D>(__deserializer: - __D) - -> - _serde::export::Result - where - __D: _serde::Deserializer<'de> { - _serde::export::Ok(__DeserializeWith{value: - match bytes::deserialize(__deserializer) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - phantom: - _serde::export::PhantomData, - lifetime: - _serde::export::PhantomData,}) - } - } - _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - |__wrap| - __wrap.value) - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(0usize, - &"tuple struct HeadData with 1 element")); - } - }; - _serde::export::Ok(HeadData(__field0)) - } - } - _serde::Deserializer::deserialize_newtype_struct(__deserializer, - "HeadData", - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for HeadData { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - HeadData(ref __self_0_0) => { - let mut debug_trait_builder = - f.debug_tuple("HeadData"); - let _ = debug_trait_builder.field(&&(*__self_0_0)); - debug_trait_builder.finish() - } - } - } - } - /// Parachain validation code. - #[structural_match] - pub struct ValidationCode( - #[serde(with = "bytes")] - pub Vec); - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for ValidationCode { - #[inline] - fn eq(&self, other: &ValidationCode) -> bool { - match *other { - ValidationCode(ref __self_1_0) => - match *self { - ValidationCode(ref __self_0_0) => - (*__self_0_0) == (*__self_1_0), - }, - } - } - #[inline] - fn ne(&self, other: &ValidationCode) -> bool { - match *other { - ValidationCode(ref __self_1_0) => - match *self { - ValidationCode(ref __self_0_0) => - (*__self_0_0) != (*__self_1_0), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for ValidationCode { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { let _: ::std::cmp::AssertParamIsEq>; } - } - } - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_SERIALIZE_FOR_ValidationCode: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl _serde::Serialize for ValidationCode { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - _serde::Serializer::serialize_newtype_struct(__serializer, - "ValidationCode", - { - struct __SerializeWith<'__a> { - values: (&'__a Vec,), - phantom: _serde::export::PhantomData, - } - impl <'__a> - _serde::Serialize - for - __SerializeWith<'__a> - { - fn serialize<__S>(&self, - __s: - __S) - -> - _serde::export::Result<__S::Ok, - __S::Error> - where - __S: _serde::Serializer { - bytes::serialize(self.values.0, - __s) - } - } - &__SerializeWith{values: - (&self.0,), - phantom: - _serde::export::PhantomData::,} - }) - } - } - }; - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_ValidationCode: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for ValidationCode { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> - { - type - Value - = - ValidationCode; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "tuple struct ValidationCode") - } - #[inline] - fn visit_newtype_struct<__E>(self, __e: __E) - -> - _serde::export::Result where - __E: _serde::Deserializer<'de> { - let __field0: Vec = - match bytes::deserialize(__e) { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - _serde::export::Ok(ValidationCode(__field0)) - } - #[inline] - fn visit_seq<__A>(self, mut __seq: __A) - -> - _serde::export::Result where - __A: _serde::de::SeqAccess<'de> { - let __field0 = - match { - struct __DeserializeWith<'de> { - value: Vec, - phantom: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> - _serde::Deserialize<'de> for - __DeserializeWith<'de> { - fn deserialize<__D>(__deserializer: - __D) - -> - _serde::export::Result - where - __D: _serde::Deserializer<'de> { - _serde::export::Ok(__DeserializeWith{value: - match bytes::deserialize(__deserializer) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - phantom: - _serde::export::PhantomData, - lifetime: - _serde::export::PhantomData,}) - } - } - _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - |__wrap| - __wrap.value) - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(0usize, - &"tuple struct ValidationCode with 1 element")); - } - }; - _serde::export::Ok(ValidationCode(__field0)) - } - } - _serde::Deserializer::deserialize_newtype_struct(__deserializer, - "ValidationCode", - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for ValidationCode { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - ValidationCode(ref __self_0_0) => { - let mut debug_trait_builder = - f.debug_tuple("ValidationCode"); - let _ = debug_trait_builder.field(&&(*__self_0_0)); - debug_trait_builder.finish() - } - } - } - } - /// Activitiy bit field - #[structural_match] - pub struct Activity( - #[serde(with = "bytes")] - pub Vec); - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for Activity { - #[inline] - fn eq(&self, other: &Activity) -> bool { - match *other { - Activity(ref __self_1_0) => - match *self { - Activity(ref __self_0_0) => - (*__self_0_0) == (*__self_1_0), - }, - } - } - #[inline] - fn ne(&self, other: &Activity) -> bool { - match *other { - Activity(ref __self_1_0) => - match *self { - Activity(ref __self_0_0) => - (*__self_0_0) != (*__self_1_0), - }, - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for Activity { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { let _: ::std::cmp::AssertParamIsEq>; } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for Activity { - #[inline] - fn clone(&self) -> Activity { - match *self { - Activity(ref __self_0_0) => - Activity(::std::clone::Clone::clone(&(*__self_0_0))), - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::default::Default for Activity { - #[inline] - fn default() -> Activity { - Activity(::std::default::Default::default()) - } - } - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_SERIALIZE_FOR_Activity: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl _serde::Serialize for Activity { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - _serde::Serializer::serialize_newtype_struct(__serializer, - "Activity", - { - struct __SerializeWith<'__a> { - values: (&'__a Vec,), - phantom: _serde::export::PhantomData, - } - impl <'__a> - _serde::Serialize - for - __SerializeWith<'__a> - { - fn serialize<__S>(&self, - __s: - __S) - -> - _serde::export::Result<__S::Ok, - __S::Error> - where - __S: _serde::Serializer { - bytes::serialize(self.values.0, - __s) - } - } - &__SerializeWith{values: - (&self.0,), - phantom: - _serde::export::PhantomData::,} - }) - } - } - }; - #[allow(non_upper_case_globals, - unused_attributes, - unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_Activity: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } - } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for Activity { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> - { - type - Value - = - Activity; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "tuple struct Activity") - } - #[inline] - fn visit_newtype_struct<__E>(self, __e: __E) - -> - _serde::export::Result where - __E: _serde::Deserializer<'de> { - let __field0: Vec = - match bytes::deserialize(__e) { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - }; - _serde::export::Ok(Activity(__field0)) - } - #[inline] - fn visit_seq<__A>(self, mut __seq: __A) - -> - _serde::export::Result where - __A: _serde::de::SeqAccess<'de> { - let __field0 = - match { - struct __DeserializeWith<'de> { - value: Vec, - phantom: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> - _serde::Deserialize<'de> for - __DeserializeWith<'de> { - fn deserialize<__D>(__deserializer: - __D) - -> - _serde::export::Result - where - __D: _serde::Deserializer<'de> { - _serde::export::Ok(__DeserializeWith{value: - match bytes::deserialize(__deserializer) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - phantom: - _serde::export::PhantomData, - lifetime: - _serde::export::PhantomData,}) - } - } - _serde::export::Option::map(match _serde::de::SeqAccess::next_element::<__DeserializeWith<'de>>(&mut __seq) - { - _serde::export::Ok(__val) - => - __val, - _serde::export::Err(__err) - => - { - return _serde::export::Err(__err); - } - }, - |__wrap| - __wrap.value) - } { - _serde::export::Some(__value) => - __value, - _serde::export::None => { - return _serde::export::Err(_serde::de::Error::invalid_length(0usize, - &"tuple struct Activity with 1 element")); - } - }; - _serde::export::Ok(Activity(__field0)) - } - } - _serde::Deserializer::deserialize_newtype_struct(__deserializer, - "Activity", - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for Activity { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match *self { - Activity(ref __self_0_0) => { - let mut debug_trait_builder = - f.debug_tuple("Activity"); - let _ = debug_trait_builder.field(&&(*__self_0_0)); - debug_trait_builder.finish() - } - } - } - } - impl Slicable for Activity { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Activity) - } - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } - } - #[repr(u8)] - #[structural_match] - #[rustc_copy_clone_marker] - enum StatementKind { - Candidate = 1, - Valid = 2, - Invalid = 3, - Available = 4, - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for StatementKind { - #[inline] - fn clone(&self) -> StatementKind { { *self } } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::marker::Copy for StatementKind { } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for StatementKind { - #[inline] - fn eq(&self, other: &StatementKind) -> bool { - { - let __self_vi = - unsafe { - ::std::intrinsics::discriminant_value(&*self) - } as u8; - let __arg_1_vi = - unsafe { - ::std::intrinsics::discriminant_value(&*other) - } as u8; - if true && __self_vi == __arg_1_vi { - match (&*self, &*other) { _ => true, } - } else { false } - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for StatementKind { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { { } } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for StatementKind { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match (&*self,) { - (&StatementKind::Candidate,) => { - let mut debug_trait_builder = - f.debug_tuple("Candidate"); - debug_trait_builder.finish() - } - (&StatementKind::Valid,) => { - let mut debug_trait_builder = f.debug_tuple("Valid"); - debug_trait_builder.finish() - } - (&StatementKind::Invalid,) => { - let mut debug_trait_builder = - f.debug_tuple("Invalid"); - debug_trait_builder.finish() - } - (&StatementKind::Available,) => { - let mut debug_trait_builder = - f.debug_tuple("Available"); - debug_trait_builder.finish() - } - } - } - } - /// Statements which can be made about parachain candidates. - #[structural_match] - pub enum Statement { - - /// Proposal of a parachain candidate. - Candidate(CandidateReceipt), - - /// State that a parachain candidate is valid. - Valid(Hash), - - /// Vote to commit to a candidate. - Invalid(Hash), - - /// Vote to advance round after inactive primary. - Available(Hash), - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::clone::Clone for Statement { - #[inline] - fn clone(&self) -> Statement { - match (&*self,) { - (&Statement::Candidate(ref __self_0),) => - Statement::Candidate(::std::clone::Clone::clone(&(*__self_0))), - (&Statement::Valid(ref __self_0),) => - Statement::Valid(::std::clone::Clone::clone(&(*__self_0))), - (&Statement::Invalid(ref __self_0),) => - Statement::Invalid(::std::clone::Clone::clone(&(*__self_0))), - (&Statement::Available(ref __self_0),) => - Statement::Available(::std::clone::Clone::clone(&(*__self_0))), - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::PartialEq for Statement { - #[inline] - fn eq(&self, other: &Statement) -> bool { - { - let __self_vi = - unsafe { - ::std::intrinsics::discriminant_value(&*self) - } as isize; - let __arg_1_vi = - unsafe { - ::std::intrinsics::discriminant_value(&*other) - } as isize; - if true && __self_vi == __arg_1_vi { - match (&*self, &*other) { - (&Statement::Candidate(ref __self_0), - &Statement::Candidate(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&Statement::Valid(ref __self_0), - &Statement::Valid(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&Statement::Invalid(ref __self_0), - &Statement::Invalid(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&Statement::Available(ref __self_0), - &Statement::Available(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - _ => unsafe { ::std::intrinsics::unreachable() } - } - } else { false } - } - } - #[inline] - fn ne(&self, other: &Statement) -> bool { - { - let __self_vi = - unsafe { - ::std::intrinsics::discriminant_value(&*self) - } as isize; - let __arg_1_vi = - unsafe { - ::std::intrinsics::discriminant_value(&*other) - } as isize; - if true && __self_vi == __arg_1_vi { - match (&*self, &*other) { - (&Statement::Candidate(ref __self_0), - &Statement::Candidate(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&Statement::Valid(ref __self_0), - &Statement::Valid(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&Statement::Invalid(ref __self_0), - &Statement::Invalid(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&Statement::Available(ref __self_0), - &Statement::Available(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - _ => unsafe { ::std::intrinsics::unreachable() } - } - } else { true } - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::cmp::Eq for Statement { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { - let _: ::std::cmp::AssertParamIsEq; - let _: ::std::cmp::AssertParamIsEq; - let _: ::std::cmp::AssertParamIsEq; - let _: ::std::cmp::AssertParamIsEq; - } - } - } - #[automatically_derived] - #[allow(unused_qualifications)] - impl ::std::fmt::Debug for Statement { - fn fmt(&self, f: &mut ::std::fmt::Formatter) - -> ::std::fmt::Result { - match (&*self,) { - (&Statement::Candidate(ref __self_0),) => { - let mut debug_trait_builder = - f.debug_tuple("Candidate"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&Statement::Valid(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Valid"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&Statement::Invalid(ref __self_0),) => { - let mut debug_trait_builder = - f.debug_tuple("Invalid"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&Statement::Available(ref __self_0),) => { - let mut debug_trait_builder = - f.debug_tuple("Available"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - } - } - } - impl Slicable for Statement { - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Statement::Candidate(ref candidate) => { - v.push(StatementKind::Candidate as u8); - candidate.using_encoded(|s| v.extend(s)); - } - Statement::Valid(ref hash) => { - v.push(StatementKind::Valid as u8); - hash.using_encoded(|s| v.extend(s)); - } - Statement::Invalid(ref hash) => { - v.push(StatementKind::Invalid as u8); - hash.using_encoded(|s| v.extend(s)); - } - Statement::Available(ref hash) => { - v.push(StatementKind::Available as u8); - hash.using_encoded(|s| v.extend(s)); - } - } - v - } - fn decode(value: &mut I) -> Option { - match value.read_byte() { - Some(x) if x == StatementKind::Candidate as u8 => { - Slicable::decode(value).map(Statement::Candidate) - } - Some(x) if x == StatementKind::Valid as u8 => { - Slicable::decode(value).map(Statement::Valid) - } - Some(x) if x == StatementKind::Invalid as u8 => { - Slicable::decode(value).map(Statement::Invalid) - } - Some(x) if x == StatementKind::Available as u8 => { - Slicable::decode(value).map(Statement::Available) - } - _ => None, - } - } - } - } -} -mod parachains { - //! Main parachains logic. For now this is just the determination of which validators do what. - use primitives; - use rstd::prelude::*; - use codec::{Slicable, Joiner}; - use runtime_support::Hashable; - use runtime_primitives::traits::{Executable, RefInto, MaybeEmpty}; - use primitives::parachain::{Id, Chain, DutyRoster, CandidateReceipt}; - use {system, session}; - use substrate_runtime_support::{StorageValue, StorageMap}; - use substrate_runtime_support::dispatch::Result; - #[cfg(any(feature = "std", test))] - use rstd::marker::PhantomData; - #[cfg(any(feature = "std", test))] - use {runtime_io, runtime_primitives}; - pub trait Trait: system::Trait + session::Trait { - /// The position of the set_heads call in the block. - const - SET_POSITION: - u32; - type - PublicAux: RefInto + - MaybeEmpty; - } - #[cfg(feature = "std")] - #[doc = r" Parachains module."] - pub struct Module(::std::marker::PhantomData); - #[cfg(feature = "std")] - #[doc = r" Call type for parachains."] - pub enum Call { - __PhantomItem(::std::marker::PhantomData), - - #[allow(non_camel_case_types)] - set_heads(Vec), - } - #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] - const _IMPL_SERIALIZE_FOR_Call: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } } - }); - #[automatically_derived] - impl _serde::Serialize for Call { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - match *self { - Call::__PhantomItem(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "Call", - 0u32, - "__PhantomItem", - __field0), - Call::set_heads(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "Call", - 1u32, - "set_heads", - __field0), - } - } - } - }; - #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] - const _IMPL_DESERIALIZE_FOR_Call: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , - _serde :: export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } } - }); - #[automatically_derived] - impl <'de, T: Trait> _serde::Deserialize<'de> for Call { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum __Field { __field0, __field1, } - struct __FieldVisitor; - impl <'de> _serde::de::Visitor<'de> for __FieldVisitor { - type - Value - = - __Field; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "variant identifier") - } - fn visit_u64<__E>(self, __value: u64) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - 0u64 => _serde::export::Ok(__Field::__field0), - 1u64 => _serde::export::Ok(__Field::__field1), - _ => - _serde::export::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value), - &"variant index 0 <= i < 2")), - } - } - fn visit_str<__E>(self, __value: &str) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - "__PhantomItem" => - _serde::export::Ok(__Field::__field0), - "set_heads" => - _serde::export::Ok(__Field::__field1), - _ => { - _serde::export::Err(_serde::de::Error::unknown_variant(__value, - VARIANTS)) - } - } - } - fn visit_bytes<__E>(self, __value: &[u8]) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - b"__PhantomItem" => - _serde::export::Ok(__Field::__field0), - b"set_heads" => - _serde::export::Ok(__Field::__field1), - _ => { - let __value = - &_serde::export::from_utf8_lossy(__value); - _serde::export::Err(_serde::de::Error::unknown_variant(__value, - VARIANTS)) - } - } - } - } - impl <'de> _serde::Deserialize<'de> for __Field { - #[inline] - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - _serde::Deserializer::deserialize_identifier(__deserializer, - __FieldVisitor) - } - } - struct __Visitor<'de, T: Trait> { - marker: _serde::export::PhantomData>, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de, T: Trait> _serde::de::Visitor<'de> for - __Visitor<'de, T> { - type - Value - = - Call; - fn expecting(&self, - __formatter: - &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "enum Call") - } - fn visit_enum<__A>(self, __data: __A) - -> _serde::export::Result - where __A: _serde::de::EnumAccess<'de> { - match match _serde::de::EnumAccess::variant(__data) - { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - (__Field::__field0, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::std::marker::PhantomData>(__variant), - Call::__PhantomItem), - (__Field::__field1, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::>(__variant), - Call::set_heads), - } - } - } - const VARIANTS: &'static [&'static str] = - &["__PhantomItem", "set_heads"]; - _serde::Deserializer::deserialize_enum(__deserializer, - "Call", VARIANTS, - __Visitor{marker: - _serde::export::PhantomData::>, - lifetime: - _serde::export::PhantomData,}) - } - } - }; - impl ::dispatch::Clone for Call { - fn clone(&self) -> Self { - match *self { - Call::set_heads(ref heads) => Call::set_heads(heads.clone()), - Call::__PhantomItem(_) => { - { - ::rt::begin_panic("internal error: entered unreachable code", - &("polkadot/runtime/src/parachains.rs", - 44u32, 1u32)) - } - } - } - } - } - impl ::dispatch::PartialEq for Call { - fn eq(&self, other: &Self) -> bool { - match *self { - Call::set_heads(ref heads) => { - let self_params = (heads,); - if let Call::set_heads(ref heads) = *other { - self_params == (heads,) - } else { - if let Call::__PhantomItem(_) = *other { - { - { - ::rt::begin_panic("internal error: entered unreachable code", - &("polkadot/runtime/src/parachains.rs", - 44u32, 1u32)) - } - } - } else { false } - } - } - Call::__PhantomItem(_) => { - { - ::rt::begin_panic("internal error: entered unreachable code", - &("polkadot/runtime/src/parachains.rs", - 44u32, 1u32)) - } - } - } - } - } - impl ::dispatch::Eq for Call { } - #[cfg(feature = "std")] - impl ::dispatch::fmt::Debug for Call { - fn fmt(&self, f: &mut ::dispatch::fmt::Formatter) - -> ::dispatch::result::Result<(), ::dispatch::fmt::Error> { - match *self { - Call::set_heads(ref heads) => - f.write_fmt(::std::fmt::Arguments::new_v1_formatted(&["", ""], - &match (&"set_heads", - &(heads.clone(),)) - { - (arg0, - arg1) - => - [::std::fmt::ArgumentV1::new(arg0, - ::std::fmt::Display::fmt), - ::std::fmt::ArgumentV1::new(arg1, - ::std::fmt::Debug::fmt)], - }, - &[::std::fmt::rt::v1::Argument{position: - ::std::fmt::rt::v1::Position::At(0usize), - format: - ::std::fmt::rt::v1::FormatSpec{fill: - ' ', - align: - ::std::fmt::rt::v1::Alignment::Unknown, - flags: - 0u32, - precision: - ::std::fmt::rt::v1::Count::Implied, - width: - ::std::fmt::rt::v1::Count::Implied,},}, - ::std::fmt::rt::v1::Argument{position: - ::std::fmt::rt::v1::Position::At(1usize), - format: - ::std::fmt::rt::v1::FormatSpec{fill: - ' ', - align: - ::std::fmt::rt::v1::Alignment::Unknown, - flags: - 0u32, - precision: - ::std::fmt::rt::v1::Count::Implied, - width: - ::std::fmt::rt::v1::Count::Implied,},}])), - Call::__PhantomItem(_) => { - { - ::rt::begin_panic("internal error: entered unreachable code", - &("polkadot/runtime/src/parachains.rs", - 44u32, 1u32)) - } - } - } - } - } - impl ::dispatch::Slicable for Call { - fn decode(input: &mut I) -> Option { - match input.read_byte()? { - 0 => { - let heads = ::dispatch::Slicable::decode(input)?; - Some(Call::set_heads(heads)) - } - _ => None, - } - } - fn encode(&self) -> ::dispatch::Vec { - let mut v = ::dispatch::Vec::new(); - match *self { - Call::set_heads(ref heads) => { - v.push(0 as u8); - heads.using_encoded(|s| v.extend(s)); - } - Call::__PhantomItem(_) => { - { - ::rt::begin_panic("internal error: entered unreachable code", - &("polkadot/runtime/src/parachains.rs", - 44u32, 1u32)) - } - } - } - v - } - fn using_encoded R>(&self, f: F) -> R { - f(self.encode().as_slice()) - } - } - impl ::dispatch::AuxDispatchable for Call { - type - Trait - = - T; - type - Aux - = - ::PublicAux; - fn dispatch(self, aux: &Self::Aux) -> ::dispatch::Result { - match self { - Call::set_heads(heads) => >::set_heads(aux, heads), - Call::__PhantomItem(_) => { - { - ::rt::begin_panic("__PhantomItem should never be used.", - &("polkadot/runtime/src/parachains.rs", - 44u32, 1u32)) - } - } - } - } - } - impl ::dispatch::AuxCallable for Module { - type - Call - = - Call; - } - impl Module { - pub fn aux_dispatch>(d: D, aux: &D::Aux) -> ::dispatch::Result { - d.dispatch(aux) - } - pub fn dispatch>(d: D) - -> ::dispatch::Result { - d.dispatch() - } - } - pub struct Parachains(::storage::generator::PhantomData); - impl ::storage::generator::StorageValue> for - Parachains { - type - Query - = - Vec; - /// Get the storage key. - fn key() -> &'static [u8] { b"para:chains" } - /// Load the value from the provided storage instance. - fn get(storage: &S) -> Self::Query { - storage.get_or_default(b"para:chains") - } - /// Take a value from storage, removing it afterwards. - fn take(storage: &S) -> Self::Query { - storage.take_or_default(b"para:chains") - } - } - pub struct Code(::storage::generator::PhantomData); - impl ::storage::generator::StorageMap> for Code - { - type - Query - = - Option>; - /// Get the prefix key in storage. - fn prefix() -> &'static [u8] { b"para:code" } - /// Get the storage key used to fetch a value corresponding to a specific key. - fn key_for(x: &Id) -> Vec { - let mut key = b"para:code".to_vec(); - key.extend(::codec::Slicable::encode(x)); - key - } - /// Load the value associated with the given key from the map. - fn get(key: &Id, storage: &S) -> Self::Query { - let key = - as - ::storage::generator::StorageMap>>::key_for(key); - storage.get(&key[..]) - } - /// Take the value, reading and removing it. - fn take(key: &Id, storage: &S) -> Self::Query { - let key = - as - ::storage::generator::StorageMap>>::key_for(key); - storage.take(&key[..]) - } - } - pub struct Heads(::storage::generator::PhantomData); - impl ::storage::generator::StorageMap> for Heads - { - type - Query - = - Option>; - /// Get the prefix key in storage. - fn prefix() -> &'static [u8] { b"para:head" } - /// Get the storage key used to fetch a value corresponding to a specific key. - fn key_for(x: &Id) -> Vec { - let mut key = b"para:head".to_vec(); - key.extend(::codec::Slicable::encode(x)); - key - } - /// Load the value associated with the given key from the map. - fn get(key: &Id, storage: &S) -> Self::Query { - let key = - as - ::storage::generator::StorageMap>>::key_for(key); - storage.get(&key[..]) - } - /// Take the value, reading and removing it. - fn take(key: &Id, storage: &S) -> Self::Query { - let key = - as - ::storage::generator::StorageMap>>::key_for(key); - storage.take(&key[..]) - } - } - struct DidUpdate(::storage::generator::PhantomData); - impl ::storage::generator::StorageValue for DidUpdate - { - type - Query - = - bool; - /// Get the storage key. - fn key() -> &'static [u8] { b"para:did" } - /// Load the value from the provided storage instance. - fn get(storage: &S) -> Self::Query { - storage.get_or_default(b"para:did") - } - /// Take a value from storage, removing it afterwards. - fn take(storage: &S) -> Self::Query { - storage.take_or_default(b"para:did") - } - } - trait Store { - type - Parachains; - type - Code; - type - Heads; - type - DidUpdate; - } - impl Store for Module { - type - Parachains - = - Parachains; - type - Code - = - Code; - type - Heads - = - Heads; - type - DidUpdate - = - DidUpdate; - } - impl Module { - pub fn active_parachains() -> Vec { - as - ::storage::generator::StorageValue>>::get(&::storage::RuntimeStorage) - } - pub fn parachain_code>(key: K) - -> Option> { - as - ::storage::generator::StorageMap>>::get(key.borrow(), - &::storage::RuntimeStorage) - } - pub fn parachain_head>(key: K) - -> Option> { - as - ::storage::generator::StorageMap>>::get(key.borrow(), - &::storage::RuntimeStorage) - } - } - impl Module { - /// Calculate the current block's duty roster using system's random seed. - pub fn calculate_duty_roster() -> DutyRoster { - let parachains = Self::active_parachains(); - let parachain_count = parachains.len(); - let validator_count = - >::validator_count() as usize; - let validators_per_parachain = - if parachain_count != 0 { - (validator_count - 1) / parachain_count - } else { 0 }; - let mut roles_val = - (0..validator_count).map(|i| - match i { - i if - i < - parachain_count * - validators_per_parachain - => { - let idx = - i / - validators_per_parachain; - Chain::Parachain(parachains[idx].clone()) - } - _ => Chain::Relay, - }).collect::>(); - let mut roles_gua = roles_val.clone(); - let random_seed = system::Module::::random_seed(); - let mut seed = - random_seed.to_vec().and(b"validator_role_pairs").blake2_256(); - for i in 0..(validator_count - 1) { - let offset = (i * 8 % 32) as usize; - let remaining = (validator_count - i) as usize; - let val_index = - u32::decode(&mut &seed[offset..offset + - 4]).expect("using 4 bytes for a 32-bit quantity") - as usize % remaining; - let gua_index = - u32::decode(&mut &seed[offset + - 4..offset + - 8]).expect("using 4 bytes for a 32-bit quantity") - as usize % remaining; - if offset == 24 { seed = seed.blake2_256(); } - roles_val.swap(remaining - 1, val_index); - roles_gua.swap(remaining - 1, gua_index); - } - DutyRoster{validator_duty: roles_val, guarantor_duty: roles_gua,} - } - /// Register a parachain with given code. - /// Fails if given ID is already used. - pub fn register_parachain(id: Id, code: Vec, - initial_head_data: Vec) { - let mut parachains = Self::active_parachains(); - match parachains.binary_search(&id) { - Ok(_) => { - ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Parachain with id ", - " already exists"], - &match (&id.into_inner(),) - { - (arg0,) - => - [::std::fmt::ArgumentV1::new(arg0, - ::std::fmt::Display::fmt)], - }, - &[::std::fmt::rt::v1::Argument{position: - ::std::fmt::rt::v1::Position::At(0usize), - format: - ::std::fmt::rt::v1::FormatSpec{fill: - ' ', - align: - ::std::fmt::rt::v1::Alignment::Unknown, - flags: - 0u32, - precision: - ::std::fmt::rt::v1::Count::Implied, - width: - ::std::fmt::rt::v1::Count::Implied,},}]), - &("polkadot/runtime/src/parachains.rs", - 123u32, 13u32)) - } - Err(idx) => parachains.insert(idx, id), - } - >::insert(id, code); - >::put(parachains); - >::insert(id, initial_head_data); - } - /// Deregister a parachain with given id - pub fn deregister_parachain(id: Id) { - let mut parachains = Self::active_parachains(); - match parachains.binary_search(&id) { - Ok(idx) => { parachains.remove(idx); } - Err(_) => { } - } - >::remove(id); - >::remove(id); - >::put(parachains); - } - fn set_heads(aux: &::PublicAux, - heads: Vec) -> Result { - { - if !aux.is_empty() { - { return Err("set_heads must not be signed"); }; - } - }; - { - if !!>::exists() { - { - return Err("Parachain heads must be updated only once in the block"); - }; - } - }; - { - if !(>::extrinsic_index() == - T::SET_POSITION) { - { - return Err("Parachain heads update extrinsic must be at position {} in the block"); - }; - } - }; - let active_parachains = Self::active_parachains(); - let mut iter = active_parachains.iter(); - for head in &heads { - { - if !iter.find(|&p| p == &head.parachain_index).is_some() { - { - return Err("Submitted candidate for unregistered or out-of-order parachain {}"); - }; - } - }; - } - for head in heads { - let id = head.parachain_index.clone(); - >::insert(id, head.head_data.0); - } - >::put(true); - Ok(()) - } - } - impl Executable for Module { - fn execute() { - if !::take() { - { - ::rt::begin_panic("Parachain heads must be updated once in the block", - &("polkadot/runtime/src/parachains.rs", - 179u32, 3u32)) - } - }; - } - } - /// Parachains module genesis configuration. - #[cfg(any(feature = "std", test))] - pub struct GenesisConfig { - /// The initial parachains, mapped to code. - pub parachains: Vec<(Id, Vec)>, - /// Phantom data. - pub phantom: PhantomData, - } - #[cfg(any(feature = "std", test))] - impl Default for GenesisConfig { - fn default() -> Self { - GenesisConfig{parachains: Vec::new(), phantom: PhantomData,} - } - } - #[cfg(any(feature = "std", test))] - impl runtime_primitives::BuildExternalities for - GenesisConfig { - fn build_externalities(mut self) -> runtime_io::TestExternalities { - use std::collections::HashMap; - use runtime_io::twox_128; - use codec::Slicable; - self.parachains.sort_unstable_by_key(|&(ref id, _)| id.clone()); - self.parachains.dedup_by_key(|&mut (ref id, _)| id.clone()); - let only_ids: Vec<_> = - self.parachains.iter().map(|&(ref id, _)| - id).cloned().collect(); - let mut map: HashMap<_, _> = - <[_]>::into_vec(box - [(twox_128(>::key()).to_vec(), - only_ids.encode())]).into_iter().collect(); - for (id, code) in self.parachains { - let key = twox_128(&>::key_for(&id)).to_vec(); - map.insert(key, code.encode()); - } - map.into() - } - } -} -use primitives::{AccountId, Balance, BlockNumber, Hash, Index, Log, - SessionKey}; -use runtime_primitives::{generic, - traits::{HasPublicAux, BlakeTwo256, Convert}}; -#[cfg(feature = "std")] -pub use runtime_primitives::BuildExternalities; -pub use consensus::Call as ConsensusCall; -pub use timestamp::Call as TimestampCall; -pub use parachains::Call as ParachainsCall; -pub use primitives::{Header, Block, UncheckedExtrinsic, Extrinsic}; -/// The position of the timestamp set extrinsic. -pub const TIMESTAMP_SET_POSITION: u32 = 0; -/// The position of the parachains set extrinsic. -pub const PARACHAINS_SET_POSITION: u32 = 1; -/// Concrete runtime type used to parameterize the various modules. -pub struct Concrete; -impl HasPublicAux for Concrete { - type - PublicAux - = - AccountId; -} -impl system::Trait for Concrete { - type - Index - = - Index; - type - BlockNumber - = - BlockNumber; - type - Hash - = - Hash; - type - Hashing - = - BlakeTwo256; - type - Digest - = - generic::Digest; - type - AccountId - = - AccountId; - type - Header - = - Header; -} -/// System module for this concrete runtime. -pub type System = system::Module; -impl consensus::Trait for Concrete { - type - PublicAux - = - ::PublicAux; - type - SessionKey - = - SessionKey; -} -/// Consensus module for this concrete runtime. -pub type Consensus = consensus::Module; -impl timestamp::Trait for Concrete { - const - SET_POSITION: - u32 - = - TIMESTAMP_SET_POSITION; - type - Value - = - u64; -} -/// Timestamp module for this concrete runtime. -pub type Timestamp = timestamp::Module; -/// Session key conversion. -pub struct SessionKeyConversion; -impl Convert for SessionKeyConversion { - fn convert(a: AccountId) -> SessionKey { a.0 } -} -impl session::Trait for Concrete { - type - ConvertAccountIdToSessionKey - = - SessionKeyConversion; -} -/// Session module for this concrete runtime. -pub type Session = session::Module; -impl staking::Trait for Concrete { - type - Balance - = - Balance; - type - DetermineContractAddress - = - BlakeTwo256; -} -/// Staking module for this concrete runtime. -pub type Staking = staking::Module; -impl democracy::Trait for Concrete { - type - Proposal - = - PrivCall; -} -/// Democracy module for this concrete runtime. -pub type Democracy = democracy::Module; -impl council::Trait for Concrete { } -/// Council module for this concrete runtime. -pub type Council = council::Module; -/// Council voting module for this concrete runtime. -pub type CouncilVoting = council::voting::Module; -impl parachains::Trait for Concrete { - const - SET_POSITION: - u32 - = - PARACHAINS_SET_POSITION; - type - PublicAux - = - ::PublicAux; -} -pub type Parachains = parachains::Module; -#[doc = r" Call type for polkadot transactions."] -#[structural_match] -pub enum Call { - Consensus(::Call), - Session(::Call), - Staking(::Call), - Timestamp(::Call), - Democracy(::Call), - Council(::Call), - CouncilVoting(::Call), - Parachains(::Call), -} -#[automatically_derived] -#[allow(unused_qualifications)] -impl ::std::clone::Clone for Call { - #[inline] - fn clone(&self) -> Call { - match (&*self,) { - (&Call::Consensus(ref __self_0),) => - Call::Consensus(::std::clone::Clone::clone(&(*__self_0))), - (&Call::Session(ref __self_0),) => - Call::Session(::std::clone::Clone::clone(&(*__self_0))), - (&Call::Staking(ref __self_0),) => - Call::Staking(::std::clone::Clone::clone(&(*__self_0))), - (&Call::Timestamp(ref __self_0),) => - Call::Timestamp(::std::clone::Clone::clone(&(*__self_0))), - (&Call::Democracy(ref __self_0),) => - Call::Democracy(::std::clone::Clone::clone(&(*__self_0))), - (&Call::Council(ref __self_0),) => - Call::Council(::std::clone::Clone::clone(&(*__self_0))), - (&Call::CouncilVoting(ref __self_0),) => - Call::CouncilVoting(::std::clone::Clone::clone(&(*__self_0))), - (&Call::Parachains(ref __self_0),) => - Call::Parachains(::std::clone::Clone::clone(&(*__self_0))), - } - } -} -#[automatically_derived] -#[allow(unused_qualifications)] -impl ::std::cmp::PartialEq for Call { - #[inline] - fn eq(&self, other: &Call) -> bool { - { - let __self_vi = - unsafe { ::std::intrinsics::discriminant_value(&*self) } as - isize; - let __arg_1_vi = - unsafe { ::std::intrinsics::discriminant_value(&*other) } as - isize; - if true && __self_vi == __arg_1_vi { - match (&*self, &*other) { - (&Call::Consensus(ref __self_0), - &Call::Consensus(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&Call::Session(ref __self_0), - &Call::Session(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&Call::Staking(ref __self_0), - &Call::Staking(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&Call::Timestamp(ref __self_0), - &Call::Timestamp(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&Call::Democracy(ref __self_0), - &Call::Democracy(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&Call::Council(ref __self_0), - &Call::Council(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&Call::CouncilVoting(ref __self_0), - &Call::CouncilVoting(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&Call::Parachains(ref __self_0), - &Call::Parachains(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - _ => unsafe { ::std::intrinsics::unreachable() } - } - } else { false } - } - } - #[inline] - fn ne(&self, other: &Call) -> bool { - { - let __self_vi = - unsafe { ::std::intrinsics::discriminant_value(&*self) } as - isize; - let __arg_1_vi = - unsafe { ::std::intrinsics::discriminant_value(&*other) } as - isize; - if true && __self_vi == __arg_1_vi { - match (&*self, &*other) { - (&Call::Consensus(ref __self_0), - &Call::Consensus(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&Call::Session(ref __self_0), - &Call::Session(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&Call::Staking(ref __self_0), - &Call::Staking(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&Call::Timestamp(ref __self_0), - &Call::Timestamp(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&Call::Democracy(ref __self_0), - &Call::Democracy(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&Call::Council(ref __self_0), - &Call::Council(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&Call::CouncilVoting(ref __self_0), - &Call::CouncilVoting(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&Call::Parachains(ref __self_0), - &Call::Parachains(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - _ => unsafe { ::std::intrinsics::unreachable() } - } - } else { true } - } - } -} -#[automatically_derived] -#[allow(unused_qualifications)] -impl ::std::cmp::Eq for Call { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - } - } -} -#[automatically_derived] -#[allow(unused_qualifications)] -impl ::std::fmt::Debug for Call { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - match (&*self,) { - (&Call::Consensus(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Consensus"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&Call::Session(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Session"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&Call::Staking(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Staking"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&Call::Timestamp(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Timestamp"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&Call::Democracy(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Democracy"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&Call::Council(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Council"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&Call::CouncilVoting(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("CouncilVoting"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&Call::Parachains(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Parachains"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - } - } -} -#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] -const _IMPL_SERIALIZE_FOR_Call: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , _serde :: - export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } } }); - #[automatically_derived] - impl _serde::Serialize for Call { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - match *self { - Call::Consensus(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "Call", - 0u32, - "Consensus", - __field0), - Call::Session(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "Call", - 1u32, - "Session", - __field0), - Call::Staking(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "Call", - 2u32, - "Staking", - __field0), - Call::Timestamp(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "Call", - 3u32, - "Timestamp", - __field0), - Call::Democracy(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "Call", - 4u32, - "Democracy", - __field0), - Call::Council(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "Call", - 5u32, - "Council", - __field0), - Call::CouncilVoting(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "Call", - 6u32, - "CouncilVoting", - __field0), - Call::Parachains(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "Call", - 7u32, - "Parachains", - __field0), - } - } - } - }; -#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] -const _IMPL_DESERIALIZE_FOR_Call: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , _serde :: - export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for Call { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum __Field { - __field0, - __field1, - __field2, - __field3, - __field4, - __field5, - __field6, - __field7, - } - struct __FieldVisitor; - impl <'de> _serde::de::Visitor<'de> for __FieldVisitor { - type - Value - = - __Field; - fn expecting(&self, - __formatter: &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "variant identifier") - } - fn visit_u64<__E>(self, __value: u64) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - 0u64 => _serde::export::Ok(__Field::__field0), - 1u64 => _serde::export::Ok(__Field::__field1), - 2u64 => _serde::export::Ok(__Field::__field2), - 3u64 => _serde::export::Ok(__Field::__field3), - 4u64 => _serde::export::Ok(__Field::__field4), - 5u64 => _serde::export::Ok(__Field::__field5), - 6u64 => _serde::export::Ok(__Field::__field6), - 7u64 => _serde::export::Ok(__Field::__field7), - _ => - _serde::export::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value), - &"variant index 0 <= i < 8")), - } - } - fn visit_str<__E>(self, __value: &str) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - "Consensus" => - _serde::export::Ok(__Field::__field0), - "Session" => - _serde::export::Ok(__Field::__field1), - "Staking" => - _serde::export::Ok(__Field::__field2), - "Timestamp" => - _serde::export::Ok(__Field::__field3), - "Democracy" => - _serde::export::Ok(__Field::__field4), - "Council" => - _serde::export::Ok(__Field::__field5), - "CouncilVoting" => - _serde::export::Ok(__Field::__field6), - "Parachains" => - _serde::export::Ok(__Field::__field7), - _ => { - _serde::export::Err(_serde::de::Error::unknown_variant(__value, - VARIANTS)) - } - } - } - fn visit_bytes<__E>(self, __value: &[u8]) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - b"Consensus" => - _serde::export::Ok(__Field::__field0), - b"Session" => - _serde::export::Ok(__Field::__field1), - b"Staking" => - _serde::export::Ok(__Field::__field2), - b"Timestamp" => - _serde::export::Ok(__Field::__field3), - b"Democracy" => - _serde::export::Ok(__Field::__field4), - b"Council" => - _serde::export::Ok(__Field::__field5), - b"CouncilVoting" => - _serde::export::Ok(__Field::__field6), - b"Parachains" => - _serde::export::Ok(__Field::__field7), - _ => { - let __value = - &_serde::export::from_utf8_lossy(__value); - _serde::export::Err(_serde::de::Error::unknown_variant(__value, - VARIANTS)) - } - } - } - } - impl <'de> _serde::Deserialize<'de> for __Field { - #[inline] - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - _serde::Deserializer::deserialize_identifier(__deserializer, - __FieldVisitor) - } - } - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> { - type - Value - = - Call; - fn expecting(&self, - __formatter: &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "enum Call") - } - fn visit_enum<__A>(self, __data: __A) - -> _serde::export::Result where - __A: _serde::de::EnumAccess<'de> { - match match _serde::de::EnumAccess::variant(__data) { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - (__Field::__field0, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - Call::Consensus), - (__Field::__field1, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - Call::Session), - (__Field::__field2, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - Call::Staking), - (__Field::__field3, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - Call::Timestamp), - (__Field::__field4, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - Call::Democracy), - (__Field::__field5, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - Call::Council), - (__Field::__field6, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - Call::CouncilVoting), - (__Field::__field7, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - Call::Parachains), - } - } - } - const VARIANTS: &'static [&'static str] = - &["Consensus", "Session", "Staking", "Timestamp", - "Democracy", "Council", "CouncilVoting", "Parachains"]; - _serde::Deserializer::deserialize_enum(__deserializer, "Call", - VARIANTS, - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; -impl ::dispatch::Slicable for Call { - fn decode(input: &mut I) -> Option { - match input.read_byte()? { - 0 => Some(Call::Consensus(::dispatch::Slicable::decode(input)?)), - 1 => Some(Call::Session(::dispatch::Slicable::decode(input)?)), - 2 => Some(Call::Staking(::dispatch::Slicable::decode(input)?)), - 3 => Some(Call::Timestamp(::dispatch::Slicable::decode(input)?)), - 5 => Some(Call::Democracy(::dispatch::Slicable::decode(input)?)), - 6 => Some(Call::Council(::dispatch::Slicable::decode(input)?)), - 7 => - Some(Call::CouncilVoting(::dispatch::Slicable::decode(input)?)), - 8 => Some(Call::Parachains(::dispatch::Slicable::decode(input)?)), - _ => None, - } - } - fn encode(&self) -> ::dispatch::Vec { - let mut v = ::dispatch::Vec::new(); - match *self { - Call::Consensus(ref sub) => { - v.push(0 as u8); - sub.using_encoded(|s| v.extend(s)); - } - Call::Session(ref sub) => { - v.push(1 as u8); - sub.using_encoded(|s| v.extend(s)); - } - Call::Staking(ref sub) => { - v.push(2 as u8); - sub.using_encoded(|s| v.extend(s)); - } - Call::Timestamp(ref sub) => { - v.push(3 as u8); - sub.using_encoded(|s| v.extend(s)); - } - Call::Democracy(ref sub) => { - v.push(5 as u8); - sub.using_encoded(|s| v.extend(s)); - } - Call::Council(ref sub) => { - v.push(6 as u8); - sub.using_encoded(|s| v.extend(s)); - } - Call::CouncilVoting(ref sub) => { - v.push(7 as u8); - sub.using_encoded(|s| v.extend(s)); - } - Call::Parachains(ref sub) => { - v.push(8 as u8); - sub.using_encoded(|s| v.extend(s)); - } - } - v - } - fn using_encoded R>(&self, f: F) -> R { - f(self.encode().as_slice()) - } -} -impl ::dispatch::AuxDispatchable for Call { - type - Aux - = - ::PublicAux; - type - Trait - = - Call; - fn dispatch(self, aux: &::PublicAux) - -> ::dispatch::Result { - match self { - Call::Consensus(call) => call.dispatch(&aux), - Call::Session(call) => call.dispatch(&aux), - Call::Staking(call) => call.dispatch(&aux), - Call::Timestamp(call) => call.dispatch(&aux), - Call::Democracy(call) => call.dispatch(&aux), - Call::Council(call) => call.dispatch(&aux), - Call::CouncilVoting(call) => call.dispatch(&aux), - Call::Parachains(call) => call.dispatch(&aux), - } - } -} -impl ::dispatch::IsAuxSubType for Call { - fn is_aux_sub_type(&self) - -> Option<&::Call> { - if let Call::Consensus(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsAuxSubType for Call { - fn is_aux_sub_type(&self) - -> Option<&::Call> { - if let Call::Session(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsAuxSubType for Call { - fn is_aux_sub_type(&self) - -> Option<&::Call> { - if let Call::Staking(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsAuxSubType for Call { - fn is_aux_sub_type(&self) - -> Option<&::Call> { - if let Call::Timestamp(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsAuxSubType for Call { - fn is_aux_sub_type(&self) - -> Option<&::Call> { - if let Call::Democracy(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsAuxSubType for Call { - fn is_aux_sub_type(&self) - -> Option<&::Call> { - if let Call::Council(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsAuxSubType for Call { - fn is_aux_sub_type(&self) - -> Option<&::Call> { - if let Call::CouncilVoting(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsAuxSubType for Call { - fn is_aux_sub_type(&self) - -> Option<&::Call> { - if let Call::Parachains(ref r) = *self { Some(r) } else { None } - } -} -#[doc = r" Internal calls."] -#[structural_match] -pub enum PrivCall { - Consensus(::Call), - Session(::Call), - Staking(::Call), - Democracy(::Call), - Council(::Call), - CouncilVoting(::Call), -} -#[automatically_derived] -#[allow(unused_qualifications)] -impl ::std::clone::Clone for PrivCall { - #[inline] - fn clone(&self) -> PrivCall { - match (&*self,) { - (&PrivCall::Consensus(ref __self_0),) => - PrivCall::Consensus(::std::clone::Clone::clone(&(*__self_0))), - (&PrivCall::Session(ref __self_0),) => - PrivCall::Session(::std::clone::Clone::clone(&(*__self_0))), - (&PrivCall::Staking(ref __self_0),) => - PrivCall::Staking(::std::clone::Clone::clone(&(*__self_0))), - (&PrivCall::Democracy(ref __self_0),) => - PrivCall::Democracy(::std::clone::Clone::clone(&(*__self_0))), - (&PrivCall::Council(ref __self_0),) => - PrivCall::Council(::std::clone::Clone::clone(&(*__self_0))), - (&PrivCall::CouncilVoting(ref __self_0),) => - PrivCall::CouncilVoting(::std::clone::Clone::clone(&(*__self_0))), - } - } -} -#[automatically_derived] -#[allow(unused_qualifications)] -impl ::std::cmp::PartialEq for PrivCall { - #[inline] - fn eq(&self, other: &PrivCall) -> bool { - { - let __self_vi = - unsafe { ::std::intrinsics::discriminant_value(&*self) } as - isize; - let __arg_1_vi = - unsafe { ::std::intrinsics::discriminant_value(&*other) } as - isize; - if true && __self_vi == __arg_1_vi { - match (&*self, &*other) { - (&PrivCall::Consensus(ref __self_0), - &PrivCall::Consensus(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&PrivCall::Session(ref __self_0), - &PrivCall::Session(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&PrivCall::Staking(ref __self_0), - &PrivCall::Staking(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&PrivCall::Democracy(ref __self_0), - &PrivCall::Democracy(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&PrivCall::Council(ref __self_0), - &PrivCall::Council(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - (&PrivCall::CouncilVoting(ref __self_0), - &PrivCall::CouncilVoting(ref __arg_1_0)) => - (*__self_0) == (*__arg_1_0), - _ => unsafe { ::std::intrinsics::unreachable() } - } - } else { false } - } - } - #[inline] - fn ne(&self, other: &PrivCall) -> bool { - { - let __self_vi = - unsafe { ::std::intrinsics::discriminant_value(&*self) } as - isize; - let __arg_1_vi = - unsafe { ::std::intrinsics::discriminant_value(&*other) } as - isize; - if true && __self_vi == __arg_1_vi { - match (&*self, &*other) { - (&PrivCall::Consensus(ref __self_0), - &PrivCall::Consensus(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&PrivCall::Session(ref __self_0), - &PrivCall::Session(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&PrivCall::Staking(ref __self_0), - &PrivCall::Staking(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&PrivCall::Democracy(ref __self_0), - &PrivCall::Democracy(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&PrivCall::Council(ref __self_0), - &PrivCall::Council(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - (&PrivCall::CouncilVoting(ref __self_0), - &PrivCall::CouncilVoting(ref __arg_1_0)) => - (*__self_0) != (*__arg_1_0), - _ => unsafe { ::std::intrinsics::unreachable() } - } - } else { true } - } - } -} -#[automatically_derived] -#[allow(unused_qualifications)] -impl ::std::cmp::Eq for PrivCall { - #[inline] - #[doc(hidden)] - fn assert_receiver_is_total_eq(&self) -> () { - { - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - let _: - ::std::cmp::AssertParamIsEq<::Call>; - } - } -} -#[automatically_derived] -#[allow(unused_qualifications)] -impl ::std::fmt::Debug for PrivCall { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - match (&*self,) { - (&PrivCall::Consensus(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Consensus"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&PrivCall::Session(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Session"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&PrivCall::Staking(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Staking"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&PrivCall::Democracy(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Democracy"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&PrivCall::Council(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("Council"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - (&PrivCall::CouncilVoting(ref __self_0),) => { - let mut debug_trait_builder = f.debug_tuple("CouncilVoting"); - let _ = debug_trait_builder.field(&&(*__self_0)); - debug_trait_builder.finish() - } - } - } -} -#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] -const _IMPL_SERIALIZE_FOR_PrivCall: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , _serde :: - export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } } }); - #[automatically_derived] - impl _serde::Serialize for PrivCall { - fn serialize<__S>(&self, __serializer: __S) - -> _serde::export::Result<__S::Ok, __S::Error> where - __S: _serde::Serializer { - match *self { - PrivCall::Consensus(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "PrivCall", - 0u32, - "Consensus", - __field0), - PrivCall::Session(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "PrivCall", - 1u32, - "Session", - __field0), - PrivCall::Staking(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "PrivCall", - 2u32, - "Staking", - __field0), - PrivCall::Democracy(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "PrivCall", - 3u32, - "Democracy", - __field0), - PrivCall::Council(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "PrivCall", - 4u32, - "Council", - __field0), - PrivCall::CouncilVoting(ref __field0) => - _serde::Serializer::serialize_newtype_variant(__serializer, - "PrivCall", - 5u32, - "CouncilVoting", - __field0), - } - } - } - }; -#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] -const _IMPL_DESERIALIZE_FOR_PrivCall: () = - { - extern crate serde as _serde; - #[allow(unused_macros)] - macro_rules! try(( $ __expr : expr ) => { - match $ __expr { - _serde :: export :: Ok ( __val ) => __val , _serde :: - export :: Err ( __err ) => { - return _serde :: export :: Err ( __err ) ; } } }); - #[automatically_derived] - impl <'de> _serde::Deserialize<'de> for PrivCall { - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - #[allow(non_camel_case_types)] - enum __Field { - __field0, - __field1, - __field2, - __field3, - __field4, - __field5, - } - struct __FieldVisitor; - impl <'de> _serde::de::Visitor<'de> for __FieldVisitor { - type - Value - = - __Field; - fn expecting(&self, - __formatter: &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "variant identifier") - } - fn visit_u64<__E>(self, __value: u64) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - 0u64 => _serde::export::Ok(__Field::__field0), - 1u64 => _serde::export::Ok(__Field::__field1), - 2u64 => _serde::export::Ok(__Field::__field2), - 3u64 => _serde::export::Ok(__Field::__field3), - 4u64 => _serde::export::Ok(__Field::__field4), - 5u64 => _serde::export::Ok(__Field::__field5), - _ => - _serde::export::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value), - &"variant index 0 <= i < 6")), - } - } - fn visit_str<__E>(self, __value: &str) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - "Consensus" => - _serde::export::Ok(__Field::__field0), - "Session" => - _serde::export::Ok(__Field::__field1), - "Staking" => - _serde::export::Ok(__Field::__field2), - "Democracy" => - _serde::export::Ok(__Field::__field3), - "Council" => - _serde::export::Ok(__Field::__field4), - "CouncilVoting" => - _serde::export::Ok(__Field::__field5), - _ => { - _serde::export::Err(_serde::de::Error::unknown_variant(__value, - VARIANTS)) - } - } - } - fn visit_bytes<__E>(self, __value: &[u8]) - -> _serde::export::Result where - __E: _serde::de::Error { - match __value { - b"Consensus" => - _serde::export::Ok(__Field::__field0), - b"Session" => - _serde::export::Ok(__Field::__field1), - b"Staking" => - _serde::export::Ok(__Field::__field2), - b"Democracy" => - _serde::export::Ok(__Field::__field3), - b"Council" => - _serde::export::Ok(__Field::__field4), - b"CouncilVoting" => - _serde::export::Ok(__Field::__field5), - _ => { - let __value = - &_serde::export::from_utf8_lossy(__value); - _serde::export::Err(_serde::de::Error::unknown_variant(__value, - VARIANTS)) - } - } - } - } - impl <'de> _serde::Deserialize<'de> for __Field { - #[inline] - fn deserialize<__D>(__deserializer: __D) - -> _serde::export::Result where - __D: _serde::Deserializer<'de> { - _serde::Deserializer::deserialize_identifier(__deserializer, - __FieldVisitor) - } - } - struct __Visitor<'de> { - marker: _serde::export::PhantomData, - lifetime: _serde::export::PhantomData<&'de ()>, - } - impl <'de> _serde::de::Visitor<'de> for __Visitor<'de> { - type - Value - = - PrivCall; - fn expecting(&self, - __formatter: &mut _serde::export::Formatter) - -> _serde::export::fmt::Result { - _serde::export::Formatter::write_str(__formatter, - "enum PrivCall") - } - fn visit_enum<__A>(self, __data: __A) - -> _serde::export::Result where - __A: _serde::de::EnumAccess<'de> { - match match _serde::de::EnumAccess::variant(__data) { - _serde::export::Ok(__val) => __val, - _serde::export::Err(__err) => { - return _serde::export::Err(__err); - } - } { - (__Field::__field0, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - PrivCall::Consensus), - (__Field::__field1, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - PrivCall::Session), - (__Field::__field2, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - PrivCall::Staking), - (__Field::__field3, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - PrivCall::Democracy), - (__Field::__field4, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - PrivCall::Council), - (__Field::__field5, __variant) => - _serde::export::Result::map(_serde::de::VariantAccess::newtype_variant::<::Call>(__variant), - PrivCall::CouncilVoting), - } - } - } - const VARIANTS: &'static [&'static str] = - &["Consensus", "Session", "Staking", "Democracy", - "Council", "CouncilVoting"]; - _serde::Deserializer::deserialize_enum(__deserializer, - "PrivCall", VARIANTS, - __Visitor{marker: - _serde::export::PhantomData::, - lifetime: - _serde::export::PhantomData,}) - } - } - }; -impl ::dispatch::Slicable for PrivCall { - fn decode(input: &mut I) -> Option { - match input.read_byte()? { - 0 => - Some(PrivCall::Consensus(::dispatch::Slicable::decode(input)?)), - 1 => - Some(PrivCall::Session(::dispatch::Slicable::decode(input)?)), - 2 => - Some(PrivCall::Staking(::dispatch::Slicable::decode(input)?)), - 5 => - Some(PrivCall::Democracy(::dispatch::Slicable::decode(input)?)), - 6 => - Some(PrivCall::Council(::dispatch::Slicable::decode(input)?)), - 7 => - Some(PrivCall::CouncilVoting(::dispatch::Slicable::decode(input)?)), - _ => None, - } - } - fn encode(&self) -> ::dispatch::Vec { - let mut v = ::dispatch::Vec::new(); - match *self { - PrivCall::Consensus(ref sub) => { - v.push(0 as u8); - sub.using_encoded(|s| v.extend(s)); - } - PrivCall::Session(ref sub) => { - v.push(1 as u8); - sub.using_encoded(|s| v.extend(s)); - } - PrivCall::Staking(ref sub) => { - v.push(2 as u8); - sub.using_encoded(|s| v.extend(s)); - } - PrivCall::Democracy(ref sub) => { - v.push(5 as u8); - sub.using_encoded(|s| v.extend(s)); - } - PrivCall::Council(ref sub) => { - v.push(6 as u8); - sub.using_encoded(|s| v.extend(s)); - } - PrivCall::CouncilVoting(ref sub) => { - v.push(7 as u8); - sub.using_encoded(|s| v.extend(s)); - } - } - v - } - fn using_encoded R>(&self, f: F) -> R { - f(self.encode().as_slice()) - } -} -impl ::dispatch::Dispatchable for PrivCall { - type - Trait - = - PrivCall; - fn dispatch(self) -> ::dispatch::Result { - match self { - PrivCall::Consensus(call) => call.dispatch(), - PrivCall::Session(call) => call.dispatch(), - PrivCall::Staking(call) => call.dispatch(), - PrivCall::Democracy(call) => call.dispatch(), - PrivCall::Council(call) => call.dispatch(), - PrivCall::CouncilVoting(call) => call.dispatch(), - } - } -} -impl ::dispatch::IsSubType for PrivCall { - fn is_sub_type(&self) - -> Option<&::Call> { - if let PrivCall::Consensus(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsSubType for PrivCall { - fn is_sub_type(&self) - -> Option<&::Call> { - if let PrivCall::Session(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsSubType for PrivCall { - fn is_sub_type(&self) - -> Option<&::Call> { - if let PrivCall::Staking(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsSubType for PrivCall { - fn is_sub_type(&self) - -> Option<&::Call> { - if let PrivCall::Democracy(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsSubType for PrivCall { - fn is_sub_type(&self) - -> Option<&::Call> { - if let PrivCall::Council(ref r) = *self { Some(r) } else { None } - } -} -impl ::dispatch::IsSubType for PrivCall { - fn is_sub_type(&self) - -> Option<&::Call> { - if let PrivCall::CouncilVoting(ref r) = *self { - Some(r) - } else { None } - } -} -/// Executive: handles dispatch to the various modules. -pub type Executive = - executive::Executive; -#[cfg(any(feature = "std", test))] -pub type ConsensusConfig = consensus::GenesisConfig; -#[cfg(any(feature = "std", test))] -pub type SystemConfig = system::GenesisConfig; -#[cfg(any(feature = "std", test))] -pub type SessionConfig = session::GenesisConfig; -#[cfg(any(feature = "std", test))] -pub type StakingConfig = staking::GenesisConfig; -#[cfg(any(feature = "std", test))] -pub type DemocracyConfig = democracy::GenesisConfig; -#[cfg(any(feature = "std", test))] -pub type CouncilConfig = council::GenesisConfig; -#[cfg(any(feature = "std", test))] -pub type ParachainsConfig = parachains::GenesisConfig; -#[cfg(any(feature = "std", test))] -pub struct GenesisConfig { - pub consensus: Option, - pub system: Option, - pub session: Option, - pub staking: Option, - pub democracy: Option, - pub council: Option, - pub parachains: Option, -} -#[cfg(any(feature = "std", test))] -impl ::BuildExternalities for GenesisConfig { - fn build_externalities(self) -> ::BuiltExternalities { - let mut s = ::BuiltExternalities::new(); - if let Some(extra) = self.consensus { - s.extend(extra.build_externalities()); - } - if let Some(extra) = self.system { - s.extend(extra.build_externalities()); - } - if let Some(extra) = self.session { - s.extend(extra.build_externalities()); - } - if let Some(extra) = self.staking { - s.extend(extra.build_externalities()); - } - if let Some(extra) = self.democracy { - s.extend(extra.build_externalities()); - } - if let Some(extra) = self.council { - s.extend(extra.build_externalities()); - } - if let Some(extra) = self.parachains { - s.extend(extra.build_externalities()); - } - s - } -} -pub mod api { - /// Dispatch logic for the native runtime. - pub fn dispatch(method: &str, data: &[u8]) -> Option> { - match method { - "authorities" => { - { - let mut data = data; - let input = - match ::codec::Slicable::decode(&mut data) { - Some(input) => input, - None => { - ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], - &match (&"authorities",) - { - (arg0,) - => - [::std::fmt::ArgumentV1::new(arg0, - ::std::fmt::Display::fmt)], - }, - &[::std::fmt::rt::v1::Argument{position: - ::std::fmt::rt::v1::Position::At(0usize), - format: - ::std::fmt::rt::v1::FormatSpec{fill: - ' ', - align: - ::std::fmt::rt::v1::Alignment::Unknown, - flags: - 0u32, - precision: - ::std::fmt::rt::v1::Count::Implied, - width: - ::std::fmt::rt::v1::Count::Implied,},}]), - &("polkadot/runtime/src/lib.rs", - 195u32, 2u32)) - } - }; - let output = - (|()| super::Consensus::authorities())(input); - Some(::codec::Slicable::encode(&output)) - } - } - "initialise_block" => { - { - let mut data = data; - let input = - match ::codec::Slicable::decode(&mut data) { - Some(input) => input, - None => { - ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], - &match (&"initialise_block",) - { - (arg0,) - => - [::std::fmt::ArgumentV1::new(arg0, - ::std::fmt::Display::fmt)], - }, - &[::std::fmt::rt::v1::Argument{position: - ::std::fmt::rt::v1::Position::At(0usize), - format: - ::std::fmt::rt::v1::FormatSpec{fill: - ' ', - align: - ::std::fmt::rt::v1::Alignment::Unknown, - flags: - 0u32, - precision: - ::std::fmt::rt::v1::Count::Implied, - width: - ::std::fmt::rt::v1::Count::Implied,},}]), - &("polkadot/runtime/src/lib.rs", - 195u32, 2u32)) - } - }; - let output = - (|header| - super::Executive::initialise_block(&header))(input); - Some(::codec::Slicable::encode(&output)) - } - } - "apply_extrinsic" => { - { - let mut data = data; - let input = - match ::codec::Slicable::decode(&mut data) { - Some(input) => input, - None => { - ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], - &match (&"apply_extrinsic",) - { - (arg0,) - => - [::std::fmt::ArgumentV1::new(arg0, - ::std::fmt::Display::fmt)], - }, - &[::std::fmt::rt::v1::Argument{position: - ::std::fmt::rt::v1::Position::At(0usize), - format: - ::std::fmt::rt::v1::FormatSpec{fill: - ' ', - align: - ::std::fmt::rt::v1::Alignment::Unknown, - flags: - 0u32, - precision: - ::std::fmt::rt::v1::Count::Implied, - width: - ::std::fmt::rt::v1::Count::Implied,},}]), - &("polkadot/runtime/src/lib.rs", - 195u32, 2u32)) - } - }; - let output = - (|extrinsic| - super::Executive::apply_extrinsic(extrinsic))(input); - Some(::codec::Slicable::encode(&output)) - } - } - "execute_block" => { - { - let mut data = data; - let input = - match ::codec::Slicable::decode(&mut data) { - Some(input) => input, - None => { - ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], - &match (&"execute_block",) - { - (arg0,) - => - [::std::fmt::ArgumentV1::new(arg0, - ::std::fmt::Display::fmt)], - }, - &[::std::fmt::rt::v1::Argument{position: - ::std::fmt::rt::v1::Position::At(0usize), - format: - ::std::fmt::rt::v1::FormatSpec{fill: - ' ', - align: - ::std::fmt::rt::v1::Alignment::Unknown, - flags: - 0u32, - precision: - ::std::fmt::rt::v1::Count::Implied, - width: - ::std::fmt::rt::v1::Count::Implied,},}]), - &("polkadot/runtime/src/lib.rs", - 195u32, 2u32)) - } - }; - let output = - (|block| - super::Executive::execute_block(block))(input); - Some(::codec::Slicable::encode(&output)) - } - } - "finalise_block" => { - { - let mut data = data; - let input = - match ::codec::Slicable::decode(&mut data) { - Some(input) => input, - None => { - ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], - &match (&"finalise_block",) - { - (arg0,) - => - [::std::fmt::ArgumentV1::new(arg0, - ::std::fmt::Display::fmt)], - }, - &[::std::fmt::rt::v1::Argument{position: - ::std::fmt::rt::v1::Position::At(0usize), - format: - ::std::fmt::rt::v1::FormatSpec{fill: - ' ', - align: - ::std::fmt::rt::v1::Alignment::Unknown, - flags: - 0u32, - precision: - ::std::fmt::rt::v1::Count::Implied, - width: - ::std::fmt::rt::v1::Count::Implied,},}]), - &("polkadot/runtime/src/lib.rs", - 195u32, 2u32)) - } - }; - let output = - (|()| super::Executive::finalise_block())(input); - Some(::codec::Slicable::encode(&output)) - } - } - "validator_count" => { - { - let mut data = data; - let input = - match ::codec::Slicable::decode(&mut data) { - Some(input) => input, - None => { - ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], - &match (&"validator_count",) - { - (arg0,) - => - [::std::fmt::ArgumentV1::new(arg0, - ::std::fmt::Display::fmt)], - }, - &[::std::fmt::rt::v1::Argument{position: - ::std::fmt::rt::v1::Position::At(0usize), - format: - ::std::fmt::rt::v1::FormatSpec{fill: - ' ', - align: - ::std::fmt::rt::v1::Alignment::Unknown, - flags: - 0u32, - precision: - ::std::fmt::rt::v1::Count::Implied, - width: - ::std::fmt::rt::v1::Count::Implied,},}]), - &("polkadot/runtime/src/lib.rs", - 195u32, 2u32)) - } - }; - let output = - (|()| super::Session::validator_count())(input); - Some(::codec::Slicable::encode(&output)) - } - } - "validators" => { - { - let mut data = data; - let input = - match ::codec::Slicable::decode(&mut data) { - Some(input) => input, - None => { - ::rt::begin_panic_fmt(&::std::fmt::Arguments::new_v1_formatted(&["Bad input data provided to "], - &match (&"validators",) - { - (arg0,) - => - [::std::fmt::ArgumentV1::new(arg0, - ::std::fmt::Display::fmt)], - }, - &[::std::fmt::rt::v1::Argument{position: - ::std::fmt::rt::v1::Position::At(0usize), - format: - ::std::fmt::rt::v1::FormatSpec{fill: - ' ', - align: - ::std::fmt::rt::v1::Alignment::Unknown, - flags: - 0u32, - precision: - ::std::fmt::rt::v1::Count::Implied, - width: - ::std::fmt::rt::v1::Count::Implied,},}]), - &("polkadot/runtime/src/lib.rs", - 195u32, 2u32)) - } - }; - let output = (|()| super::Session::validators())(input); - Some(::codec::Slicable::encode(&output)) - } - } - _ => None, - } - } -} From d6bb4ea9c6ce4b9d1572ee1dc9016091b8b5c7c4 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 2 Jun 2018 03:41:03 +0200 Subject: [PATCH 42/60] runtime tests now passing --- Cargo.lock | 1 + Cargo.toml | 1 + polkadot/primitives/src/lib.rs | 84 ++++++++++++++++++------- polkadot/primitives/src/parachain.rs | 63 ------------------- polkadot/runtime/Cargo.toml | 2 + polkadot/runtime/src/lib.rs | 17 ++--- substrate/runtime/primitives/src/lib.rs | 4 +- 7 files changed, 75 insertions(+), 97 deletions(-) delete mode 100644 polkadot/primitives/src/parachain.rs diff --git a/Cargo.lock b/Cargo.lock index af498a811938f..227326bfbd201 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1372,6 +1372,7 @@ version = "0.1.0" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "polkadot-primitives 0.1.0", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 40c6e8fdbf24c..d58205e310b19 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ members = [ "polkadot/executor", "polkadot/keystore", "polkadot/parachain", + "polkadot/primitives", "polkadot/runtime", "polkadot/service", "polkadot/statement-table", diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index ca1cde96c9639..6700557a154ca 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -29,30 +29,29 @@ extern crate substrate_serializer; extern crate substrate_codec as codec; -pub mod parachain; -use runtime_primitives::generic; -use codec::Slicable; +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; -/// Block header type as expected by this runtime. -pub type Header = generic::Header; +#[cfg(feature = "std")] +extern crate serde; -/// A log entry in the block. -#[derive(PartialEq, Eq, Clone, Default)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); +use std::cmp::Ordering; -impl Slicable for Log { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Log) - } +use primitives::bytes; +use runtime_primitives::traits::{BlakeTwo256, Block as BlockT, Header as HeaderT}; +use runtime_primitives::generic; +use codec::{Input, Slicable}; - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } -} +/// Block header type as expected by this runtime. +pub type Header = generic::Header; -/// Something that identifies a block. -pub type BlockId = generic::BlockId; +/// A "future-proof" block type for Polkadot. This will be resilient to upgrades in transaction +/// format, because it doesn't attempt to decode extrinsics. +/// +/// Specialized code needs to link to (at least one version of) the runtime directly +/// in order to handle the extrinsics within. +pub type Block = generic::Block>; /// An index to a block. /// 32-bits will allow for 136 years of blocks assuming 1 block per second. @@ -61,21 +60,21 @@ pub type BlockNumber = u64; /// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost /// certainly continue to be the same as the substrate's `AuthorityId`. -pub type AccountId = substrate_primitives::hash::H256; +pub type AccountId = primitives::hash::H256; /// The Ed25519 pub key of an session that belongs to an authority of the relay chain. This is /// exactly equivalent to what the substrate calls an "authority". -pub type SessionKey = substrate_primitives::AuthorityId; +pub type SessionKey = primitives::AuthorityId; /// Indentifier for a chain. 32-bit should be plenty. pub type ChainId = u32; +/// A hash of some data used by the relay chain. +pub type Hash = primitives::H256; + /// Index of a transaction in the relay chain. 32-bit should be plenty. pub type Index = u32; -/// A hash of some data used by the relay chain. -pub type Hash = substrate_primitives::H256; - /// Alias to 512-bit hash when used in the context of a signature on the relay chain. /// Equipped with logic for possibly "unsigned" messages. pub type Signature = runtime_primitives::MaybeUnsigned; @@ -92,6 +91,43 @@ pub type Timestamp = u64; /// that 32 bits may be multiplied with a balance in 128 bits without worrying about overflow. pub type Balance = u128; +/// Something that identifies a block. +#[derive(PartialEq, Eq, Clone, Copy)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub enum BlockId { + /// Block by number. + Number(BlockNumber), + /// Block by hash. + Hash(Hash), +} + +impl Into> for BlockId where + B: BlockT, + B::Header: HeaderT +{ + fn into(self) -> generic::BlockId { + match self { + BlockId::Number(number) => generic::BlockId::Number(number), + BlockId::Hash(hash) => generic::BlockId::Hash(hash), + } + } +} + +/// A log entry in the block. +#[derive(PartialEq, Eq, Clone, Default)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + +impl Slicable for Log { + fn decode(input: &mut I) -> Option { + Vec::::decode(input).map(Log) + } + + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } +} + /// Parachain data types. pub mod parachain { use super::*; diff --git a/polkadot/primitives/src/parachain.rs b/polkadot/primitives/src/parachain.rs deleted file mode 100644 index 92691ff1bf8aa..0000000000000 --- a/polkadot/primitives/src/parachain.rs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Parachain data types. - -#[cfg(feature = "std")] -use primitives::bytes; -use primitives; -use codec::{Input, Slicable}; -use rstd::cmp::{PartialOrd, Ord, Ordering}; -use rstd::vec::Vec; -use ::Hash; - -#[cfg(test)] -mod tests { - use super::*; - use substrate_serializer as ser; - - #[test] - fn test_candidate() { - assert_eq!(ser::to_string_pretty(&Candidate { - parachain_index: 5.into(), - collator_signature: primitives::hash::H512::from(10).into(), - unprocessed_ingress: ConsolidatedIngress(vec![ - (Id(1), vec![Message(vec![2])]), - (Id(2), vec![Message(vec![2]), Message(vec![3])]), - ]), - block: BlockData(vec![1, 2, 3]), - }), r#"{ - "parachainIndex": 5, - "collatorSignature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a", - "unprocessedIngress": [ - [ - 1, - [ - "0x02" - ] - ], - [ - 2, - [ - "0x02", - "0x03" - ] - ] - ], - "block": "0x010203" -}"#); - } -} diff --git a/polkadot/runtime/Cargo.toml b/polkadot/runtime/Cargo.toml index 6962ba42b24a7..9ac1f50175300 100644 --- a/polkadot/runtime/Cargo.toml +++ b/polkadot/runtime/Cargo.toml @@ -9,6 +9,7 @@ log = { version = "0.3", optional = true } serde = { version = "1.0", default_features = false } serde_derive = { version = "1.0", optional = true } safe-mix = { path = "../../safe-mix", default_features = false} +polkadot-primitives = { path = "../primitives", default_features = false } substrate-codec = { path = "../../substrate/codec" } substrate-serializer = { path = "../../substrate/serializer" } substrate-runtime-std = { path = "../../substrate/runtime-std" } @@ -32,6 +33,7 @@ hex-literal = "0.1.0" [features] default = ["std"] std = [ + "polkadot-primitives/std", "substrate-codec/std", "substrate-primitives/std", "substrate-runtime-std/std", diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index d933cd5e6ca01..d42a11ebee249 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -44,6 +44,7 @@ extern crate substrate_serializer; #[cfg_attr(feature = "std", macro_use)] extern crate substrate_primitives; +extern crate polkadot_primitives as primitives; extern crate substrate_runtime_std as rstd; extern crate substrate_codec as codec; extern crate substrate_runtime_consensus as consensus; @@ -57,7 +58,7 @@ extern crate substrate_runtime_timestamp as timestamp; mod parachains; -use primitives::{AccountId, Balance, BlockNumber, Hash, Index, Log, SessionKey}; +use primitives::{AccountId, Balance, BlockNumber, Hash, Index, Log, SessionKey, Signature}; use runtime_primitives::{generic, traits::{HasPublicAux, BlakeTwo256, Convert}}; #[cfg(feature = "std")] @@ -66,7 +67,7 @@ pub use runtime_primitives::BuildExternalities; pub use consensus::Call as ConsensusCall; pub use timestamp::Call as TimestampCall; pub use parachains::Call as ParachainsCall; -pub use primitives::{Header, Block, UncheckedExtrinsic, Extrinsic}; +pub use primitives::Header; /// The position of the timestamp set extrinsic. pub const TIMESTAMP_SET_POSITION: u32 = 0; @@ -307,9 +308,9 @@ mod tests { }); let raw = block.encode(); - let decoded_substrate = primitives::block::Block::decode(&mut &raw[..]).unwrap(); - let encoded_substrate = decoded_substrate.encode(); - let decoded = Block::decode(&mut &encoded_substrate[..]).unwrap(); + let decoded_primitive = ::primitives::Block::decode(&mut &raw[..]).unwrap(); + let encoded_primitive = decoded_primitive.encode(); + let decoded = Block::decode(&mut &encoded_primitive[..]).unwrap(); assert_eq!(block, decoded); } @@ -318,11 +319,11 @@ mod tests { fn serialize_unchecked() { let tx = UncheckedExtrinsic { extrinsic: Extrinsic { - signed: [1; 32], + signed: [1; 32].into(), index: 999, function: Call::Timestamp(TimestampCall::set(135135)), }, - signature: primitives::hash::H512([0; 64]).into(), + signature: runtime_primitives::Ed25519Signature(primitives::hash::H512([0; 64])).into(), }; // 71000000 // 0101010101010101010101010101010101010101010101010101010101010101 @@ -339,7 +340,7 @@ mod tests { #[test] fn serialize_checked() { let xt = Extrinsic { - signed: hex!["0d71d1a9cad6f2ab773435a7dec1bac019994d05d1dd5eb3108211dcf25c9d1e"], + signed: hex!["0d71d1a9cad6f2ab773435a7dec1bac019994d05d1dd5eb3108211dcf25c9d1e"].into(), index: 0, function: Call::CouncilVoting(council::voting::Call::propose(Box::new( PrivCall::Consensus(consensus::PrivCall::set_code( diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index fbea148819e1f..0b953941dcee8 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -62,7 +62,7 @@ pub trait BuildExternalities { /// Ed25519 signature verify. #[derive(Eq, PartialEq, Clone, Default)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct Ed25519Signature(H512); +pub struct Ed25519Signature(pub H512); impl Verify for Ed25519Signature { type Signer = H256; @@ -85,7 +85,7 @@ impl From for Ed25519Signature { /// Potentially "unsigned" signature verification. #[derive(Eq, PartialEq, Clone, Default)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct MaybeUnsigned(T); +pub struct MaybeUnsigned(pub T); impl MaybeUnsigned where T: Default + Eq, From f14b97554ddda422135299af286b3be4e608451d Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 2 Jun 2018 04:15:48 +0200 Subject: [PATCH 43/60] port client-db --- Cargo.lock | 12 +- polkadot/api/Cargo.toml | 1 + polkadot/api/src/lib.rs | 2 +- polkadot/executor/Cargo.toml | 12 +- polkadot/executor/src/lib.rs | 6 - substrate/client/db/Cargo.toml | 1 + substrate/client/db/src/lib.rs | 164 +++++++++++---------- substrate/runtime/primitives/src/traits.rs | 6 +- 8 files changed, 100 insertions(+), 104 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 227326bfbd201..76c2611fd4471 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1224,6 +1224,7 @@ version = "0.1.0" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "polkadot-executor 0.1.0", + "polkadot-primitives 0.1.0", "polkadot-runtime 0.1.0", "substrate-client 0.1.0", "substrate-codec 0.1.0", @@ -1314,16 +1315,8 @@ dependencies = [ name = "polkadot-executor" version = "0.1.0" dependencies = [ - "ed25519 0.1.0", - "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-codec 0.1.0", + "polkadot-runtime 0.1.0", "substrate-executor 0.1.0", - "substrate-keyring 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-io 0.1.0", - "substrate-runtime-support 0.1.0", - "substrate-state-machine 0.1.0", - "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1924,6 +1917,7 @@ dependencies = [ "substrate-client 0.1.0", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", "substrate-state-machine 0.1.0", ] diff --git a/polkadot/api/Cargo.toml b/polkadot/api/Cargo.toml index 76c523878e07e..860536ac95913 100644 --- a/polkadot/api/Cargo.toml +++ b/polkadot/api/Cargo.toml @@ -7,6 +7,7 @@ authors = ["Parity Technologies "] error-chain = "0.11" polkadot-executor = { path = "../executor" } polkadot-runtime = { path = "../runtime" } +polkadot-primitives = { path = "../primitives" } substrate-codec = { path = "../../substrate/codec" } substrate-runtime-io = { path = "../../substrate/runtime-io" } substrate-runtime-executive = { path = "../../substrate/runtime/executive" } diff --git a/polkadot/api/src/lib.rs b/polkadot/api/src/lib.rs index 6313f17ce546a..06fb6f1276171 100644 --- a/polkadot/api/src/lib.rs +++ b/polkadot/api/src/lib.rs @@ -18,6 +18,7 @@ //! runtime. extern crate polkadot_executor; +extern crate polkadot_primitives as primitives; extern crate polkadot_runtime as runtime; extern crate substrate_codec as codec; extern crate substrate_runtime_io as runtime_io; @@ -36,7 +37,6 @@ extern crate substrate_keyring as keyring; pub mod full; pub mod light; -use polkadot_runtime::primitives as primitives; use primitives::{AccountId, BlockId, Hash, Index, SessionKey, Timestamp}; use primitives::parachain::{DutyRoster, CandidateReceipt, Id as ParaId}; use runtime::{Block, UncheckedExtrinsic}; diff --git a/polkadot/executor/Cargo.toml b/polkadot/executor/Cargo.toml index e6256a0a0b41d..e7cfc5b77203d 100644 --- a/polkadot/executor/Cargo.toml +++ b/polkadot/executor/Cargo.toml @@ -5,15 +5,5 @@ authors = ["Parity Technologies "] description = "Polkadot node implementation in Rust." [dependencies] -hex-literal = "0.1" -triehash = { version = "0.1" } -ed25519 = { path = "../../substrate/ed25519" } -substrate-codec = { path = "../../substrate/codec" } -substrate-runtime-io = { path = "../../substrate/runtime-io" } -substrate-runtime-support = { path = "../../substrate/runtime-support" } -substrate-state-machine = { path = "../../substrate/state-machine" } substrate-executor = { path = "../../substrate/executor" } -substrate-primitives = { path = "../../substrate/primitives" } - -[dev-dependencies] -substrate-keyring = { path = "../../substrate/keyring" } +polkadot-runtime = { path = "../runtime" } diff --git a/polkadot/executor/src/lib.rs b/polkadot/executor/src/lib.rs index bb2a6a8077da4..be44d8afbae9e 100644 --- a/polkadot/executor/src/lib.rs +++ b/polkadot/executor/src/lib.rs @@ -19,11 +19,5 @@ extern crate polkadot_runtime; #[macro_use] extern crate substrate_executor; -extern crate substrate_codec as codec; -extern crate substrate_state_machine as state_machine; -extern crate substrate_runtime_io as runtime_io; -extern crate substrate_primitives as primitives; -extern crate ed25519; -extern crate triehash; native_executor_instance!(pub Executor, polkadot_runtime::api::dispatch, include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm")); diff --git a/substrate/client/db/Cargo.toml b/substrate/client/db/Cargo.toml index 2cf254aa6417b..b299d838a0b33 100644 --- a/substrate/client/db/Cargo.toml +++ b/substrate/client/db/Cargo.toml @@ -13,6 +13,7 @@ hashdb = { git = "https://github.com/paritytech/parity.git" } patricia-trie = { git = "https://github.com/paritytech/parity.git" } memorydb = { git = "https://github.com/paritytech/parity.git" } substrate-primitives = { path = "../../../substrate/primitives" } +substrate-runtime-primitives = { path = "../../../substrate/runtime/primitives" } substrate-client = { path = "../../../substrate/client" } substrate-state-machine = { path = "../../../substrate/state-machine" } substrate-runtime-support = { path = "../../../substrate/runtime-support" } diff --git a/substrate/client/db/src/lib.rs b/substrate/client/db/src/lib.rs index 6ba67621d8ecc..36968222915f1 100644 --- a/substrate/client/db/src/lib.rs +++ b/substrate/client/db/src/lib.rs @@ -27,6 +27,7 @@ extern crate patricia_trie; extern crate substrate_state_machine as state_machine; extern crate substrate_primitives as primitives; extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_codec as codec; #[macro_use] @@ -47,9 +48,9 @@ use kvdb::{KeyValueDB, DBTransaction}; use memorydb::MemoryDB; use parking_lot::RwLock; use patricia_trie::{TrieDB, TrieDBMut, TrieError, Trie, TrieMut}; -use primitives::blake2_256; -use primitives::block::{self, Id as BlockId, HeaderHash}; -use runtime_support::Hashable; +use runtime_primitives::generic::BlockId; +use runtime_primitives::bft::Justification; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, Hashing, HashingFor, Zero}; use state_machine::backend::Backend as StateBackend; use state_machine::CodeExecutor; @@ -62,14 +63,17 @@ pub struct DatabaseSettings { } /// Create an instance of db-backed client. -pub fn new_client( +pub fn new_client( settings: DatabaseSettings, executor: E, genesis_builder: F, -) -> Result>, client::error::Error> +) -> Result, client::LocalCallExecutor, E>, Block>, client::error::Error> where + Block: BlockT, + ::Number: As, + Block::Hash: Into<[u8; 32]>, // TODO: remove when patricia_trie generic. E: CodeExecutor, - F: client::GenesisBuilder, + F: client::GenesisBuilder, { let backend = Arc::new(Backend::new(&settings)?); let executor = client::LocalCallExecutor::new(backend.clone(), executor); @@ -90,24 +94,26 @@ mod meta { pub const BEST_BLOCK: &[u8; 4] = b"best"; } -struct PendingBlock { - header: block::Header, - justification: Option, - body: Option, +struct PendingBlock { + header: Block::Header, + justification: Option>, + body: Option>, is_best: bool, } #[derive(Clone)] -struct Meta { - best_hash: HeaderHash, - best_number: block::Number, - genesis_hash: HeaderHash, +struct Meta { + best_hash: H, + best_number: N, + genesis_hash: H, } type BlockKey = [u8; 4]; // Little endian -fn number_to_db_key(n: block::Number) -> BlockKey { +fn number_to_db_key(n: N) -> BlockKey where N: As { + let n: u32 = n.as_(); + [ (n >> 24) as u8, ((n >> 16) & 0xff) as u8, @@ -127,13 +133,13 @@ fn db_err(err: kvdb::Error) -> client::error::Error { } /// Block database -pub struct BlockchainDb { +pub struct BlockchainDb { db: Arc, - meta: RwLock, + meta: RwLock::Number, Block::Hash>>, } -impl BlockchainDb { - fn id(&self, id: BlockId) -> Result, client::error::Error> { +impl BlockchainDb where ::Number: As { + fn id(&self, id: BlockId) -> Result, client::error::Error> { match id { BlockId::Hash(h) => { { @@ -142,7 +148,7 @@ impl BlockchainDb { return Ok(Some(number_to_db_key(meta.best_number))); } } - self.db.get(columns::BLOCK_INDEX, &h).map(|v| v.map(|v| { + self.db.get(columns::BLOCK_INDEX, h.as_ref()).map(|v| v.map(|v| { let mut key: [u8; 4] = [0; 4]; key.copy_from_slice(&v); key @@ -152,21 +158,21 @@ impl BlockchainDb { } } - fn new(db: Arc) -> Result { + fn new(db: Arc) -> Result { let (best_hash, best_number) = if let Some(Some(header)) = db.get(columns::META, meta::BEST_BLOCK).and_then(|id| match id { - Some(id) => db.get(columns::HEADER, &id).map(|h| h.map(|b| block::Header::decode(&mut &b[..]))), + Some(id) => db.get(columns::HEADER, &id).map(|h| h.map(|b| Block::Header::decode(&mut &b[..]))), None => Ok(None), }).map_err(db_err)? { - let hash = header.blake2_256().into(); - debug!("DB Opened blockchain db, best {:?} ({})", hash, header.number); - (hash, header.number) + let hash = header.hash(); + debug!("DB Opened blockchain db, best {:?} ({})", hash, header.number()); + (hash, header.number().clone()) } else { - (Default::default(), Default::default()) + (Default::default(), Zero::zero()) }; - let genesis_hash = db.get(columns::HEADER, &number_to_db_key(0)).map_err(db_err)? - .map(|b| blake2_256(&b)).unwrap_or_default().into(); + let genesis_hash = db.get(columns::HEADER, &number_to_db_key(::Number::zero())).map_err(db_err)? + .map(|b| HashingFor::::hash(&b)).unwrap_or_default().into(); Ok(BlockchainDb { db, @@ -178,7 +184,7 @@ impl BlockchainDb { }) } - fn read_db(&self, id: BlockId, column: Option) -> Result, client::error::Error> { + fn read_db(&self, id: BlockId, column: Option) -> Result, client::error::Error> { self.id(id).and_then(|key| match key { Some(key) => self.db.get(column, &key).map_err(db_err), @@ -186,10 +192,10 @@ impl BlockchainDb { }) } - fn update_meta(&self, hash: block::HeaderHash, number: block::Number, is_best: bool) { + fn update_meta(&self, hash: Block::Hash, number: ::Number, is_best: bool) { if is_best { let mut meta = self.meta.write(); - if number == 0 { + if number == Zero::zero() { meta.genesis_hash = hash; } meta.best_number = number; @@ -198,10 +204,10 @@ impl BlockchainDb { } } -impl client::blockchain::Backend for BlockchainDb { - fn header(&self, id: BlockId) -> Result, client::error::Error> { +impl client::blockchain::Backend for BlockchainDb where ::Number: As { + fn header(&self, id: BlockId) -> Result, client::error::Error> { match self.read_db(id, columns::HEADER)? { - Some(header) => match block::Header::decode(&mut &header[..]) { + Some(header) => match Block::Header::decode(&mut &header[..]) { Some(header) => Ok(Some(header)), None => return Err(client::error::ErrorKind::Backend("Error decoding header".into()).into()), } @@ -209,9 +215,9 @@ impl client::blockchain::Backend for BlockchainDb { } } - fn body(&self, id: BlockId) -> Result, client::error::Error> { + fn body(&self, id: BlockId) -> Result>, client::error::Error> { match self.read_db(id, columns::BODY)? { - Some(body) => match block::Body::decode(&mut &body[..]) { + Some(body) => match Slicable::decode(&mut &body[..]) { Some(body) => Ok(Some(body)), None => return Err(client::error::ErrorKind::Backend("Error decoding body".into()).into()), } @@ -219,9 +225,9 @@ impl client::blockchain::Backend for BlockchainDb { } } - fn justification(&self, id: BlockId) -> Result, client::error::Error> { + fn justification(&self, id: BlockId) -> Result>, client::error::Error> { match self.read_db(id, columns::JUSTIFICATION)? { - Some(justification) => match primitives::bft::Justification::decode(&mut &justification[..]) { + Some(justification) => match Slicable::decode(&mut &justification[..]) { Some(justification) => Ok(Some(justification)), None => return Err(client::error::ErrorKind::Backend("Error decoding justification".into()).into()), } @@ -229,7 +235,7 @@ impl client::blockchain::Backend for BlockchainDb { } } - fn info(&self) -> Result { + fn info(&self) -> Result, client::error::Error> { let meta = self.meta.read(); Ok(client::blockchain::Info { best_hash: meta.best_hash, @@ -238,7 +244,7 @@ impl client::blockchain::Backend for BlockchainDb { }) } - fn status(&self, id: BlockId) -> Result { + fn status(&self, id: BlockId) -> Result { let exists = match id { BlockId::Hash(_) => self.id(id)?.is_some(), BlockId::Number(n) => n <= self.meta.read().best_number, @@ -249,28 +255,28 @@ impl client::blockchain::Backend for BlockchainDb { } } - fn hash(&self, number: block::Number) -> Result, client::error::Error> { + fn hash(&self, number: ::Number) -> Result, client::error::Error> { self.read_db(BlockId::Number(number), columns::HEADER).map(|x| - x.map(|raw| blake2_256(&raw[..])).map(Into::into) + x.map(|raw| HashingFor::::hash(&raw[..])).map(Into::into) ) } } /// Database transaction -pub struct BlockImportOperation { +pub struct BlockImportOperation { old_state: DbState, updates: MemoryDB, - pending_block: Option, + pending_block: Option>, } -impl client::backend::BlockImportOperation for BlockImportOperation { +impl client::backend::BlockImportOperation for BlockImportOperation { type State = DbState; fn state(&self) -> Result, client::error::Error> { Ok(Some(&self.old_state)) } - fn set_block_data(&mut self, header: block::Header, body: Option, justification: Option, is_best: bool) -> Result<(), client::error::Error> { + fn set_block_data(&mut self, header: Block::Header, body: Option>, justification: Option>, is_best: bool) -> Result<(), client::error::Error> { assert!(self.pending_block.is_none(), "Only one block per operation is allowed"); self.pending_block = Some(PendingBlock { header, @@ -423,15 +429,15 @@ impl state_machine::Backend for DbState { /// Disk backend. Keeps data in a key-value store. In archive mode, trie nodes are kept from all blocks. /// Otherwise, trie nodes are kept only from the most recent block. -pub struct Backend { +pub struct Backend { db: Arc, - blockchain: BlockchainDb, + blockchain: BlockchainDb, archive: bool, } -impl Backend { +impl Backend where ::Number: As { /// Create a new instance of database backend. - pub fn new(config: &DatabaseSettings) -> Result { + pub fn new(config: &DatabaseSettings) -> Result { let mut db_config = DatabaseConfig::with_columns(Some(columns::NUM_COLUMNS)); db_config.memory_budget = config.cache_size; db_config.wal = true; @@ -442,13 +448,13 @@ impl Backend { } #[cfg(test)] - fn new_test() -> Backend { + fn new_test() -> Self { let db = Arc::new(::kvdb_memorydb::create(columns::NUM_COLUMNS)); Backend::from_kvdb(db as Arc<_>, false).expect("failed to create test-db") } - fn from_kvdb(db: Arc, archive: bool) -> Result { + fn from_kvdb(db: Arc, archive: bool) -> Result { let blockchain = BlockchainDb::new(db.clone())?; Ok(Backend { @@ -459,12 +465,15 @@ impl Backend { } } -impl client::backend::Backend for Backend { - type BlockImportOperation = BlockImportOperation; - type Blockchain = BlockchainDb; +impl client::backend::Backend for Backend where + ::Number: As, + Block::Hash: Into<[u8; 32]>, // TODO: remove when patricia_trie generic. +{ + type BlockImportOperation = BlockImportOperation; + type Blockchain = BlockchainDb; type State = DbState; - fn begin_operation(&self, block: BlockId) -> Result { + fn begin_operation(&self, block: BlockId) -> Result { let state = self.state_at(block)?; Ok(BlockImportOperation { pending_block: None, @@ -476,9 +485,9 @@ impl client::backend::Backend for Backend { fn commit_operation(&self, mut operation: Self::BlockImportOperation) -> Result<(), client::error::Error> { let mut transaction = DBTransaction::new(); if let Some(pending_block) = operation.pending_block { - let hash: block::HeaderHash = pending_block.header.blake2_256().into(); - let number = pending_block.header.number;; - let key = number_to_db_key(pending_block.header.number); + let hash = pending_block.header.hash(); + let number = pending_block.header.number().clone(); + let key = number_to_db_key(pending_block.header.number().clone()); transaction.put(columns::HEADER, &key, &pending_block.header.encode()); if let Some(body) = pending_block.body { transaction.put(columns::BODY, &key, &body.encode()); @@ -486,7 +495,7 @@ impl client::backend::Backend for Backend { if let Some(justification) = pending_block.justification { transaction.put(columns::JUSTIFICATION, &key, &justification.encode()); } - transaction.put(columns::BLOCK_INDEX, &hash, &key); + transaction.put(columns::BLOCK_INDEX, hash.as_ref(), &key); if pending_block.is_best { transaction.put(columns::META, meta::BEST_BLOCK, &key); } @@ -504,11 +513,11 @@ impl client::backend::Backend for Backend { Ok(()) } - fn blockchain(&self) -> &BlockchainDb { + fn blockchain(&self) -> &BlockchainDb { &self.blockchain } - fn state_at(&self, block: BlockId) -> Result { + fn state_at(&self, block: BlockId) -> Result { use client::blockchain::Backend as BcBackend; // special case for genesis initialization @@ -527,15 +536,19 @@ impl client::backend::Backend for Backend { } self.blockchain.header(block).and_then(|maybe_hdr| maybe_hdr.map(|hdr| { + let root: [u8; 32] = hdr.state_root().clone().into(); DbState { db: self.db.clone(), - root: hdr.state_root.0.into(), + root: root.into(), } - }).ok_or_else(|| client::error::ErrorKind::UnknownBlock(block).into())) + }).ok_or_else(|| client::error::ErrorKind::UnknownBlock(format!("{:?}", block)).into())) } } -impl client::backend::LocalBackend for Backend {} +impl client::backend::LocalBackend for Backend where + ::Number: As, + Block::Hash: Into<[u8; 32]>, // TODO: remove when patricia_trie generic. +{} #[cfg(test)] mod tests { @@ -543,10 +556,13 @@ mod tests { use client::backend::Backend as BTrait; use client::backend::BlockImportOperation as Op; use client::blockchain::Backend as BCTrait; + use runtime_primitives::testing::{Header, Block as RawBlock}; + + type Block = RawBlock; #[test] fn block_hash_inserted_correctly() { - let db = Backend::new_test(); + let db = Backend::::new_test(); for i in 0..10 { assert!(db.blockchain().hash(i).unwrap().is_none()); @@ -558,7 +574,7 @@ mod tests { }; let mut op = db.begin_operation(id).unwrap(); - let header = block::Header { + let header = Header { number: i, parent_hash: Default::default(), state_root: Default::default(), @@ -581,10 +597,10 @@ mod tests { #[test] fn set_state_data() { - let db = Backend::new_test(); + let db = Backend::::new_test(); { let mut op = db.begin_operation(BlockId::Hash(Default::default())).unwrap(); - let mut header = block::Header { + let mut header = Header { number: 0, parent_hash: Default::default(), state_root: Default::default(), @@ -623,7 +639,7 @@ mod tests { { let mut op = db.begin_operation(BlockId::Number(0)).unwrap(); - let mut header = block::Header { + let mut header = Header { number: 1, parent_hash: Default::default(), state_root: Default::default(), @@ -660,11 +676,11 @@ mod tests { #[test] fn delete_only_when_negative_rc() { let key; - let db = Backend::new_test(); + let db = Backend::::new_test(); { let mut op = db.begin_operation(BlockId::Hash(Default::default())).unwrap(); - let mut header = block::Header { + let mut header = Header { number: 0, parent_hash: Default::default(), state_root: Default::default(), @@ -697,7 +713,7 @@ mod tests { { let mut op = db.begin_operation(BlockId::Number(0)).unwrap(); - let mut header = block::Header { + let mut header = Header { number: 1, parent_hash: Default::default(), state_root: Default::default(), @@ -729,7 +745,7 @@ mod tests { { let mut op = db.begin_operation(BlockId::Number(1)).unwrap(); - let mut header = block::Header { + let mut header = Header { number: 1, parent_hash: Default::default(), state_root: Default::default(), diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index f3ad0f60f3bc9..43639df61e796 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -174,7 +174,7 @@ impl Executable for (A, B) { pub trait Hashing: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stupid bug in the Rust compiler believes derived // traits must be fulfilled by all type parameters. /// The hash type produced. - type Output: Member; + type Output: Member + AsRef<[u8]>; /// Produce the hash of some byte-slice. fn hash(s: &[u8]) -> Self::Output; @@ -296,7 +296,7 @@ pub trait Digest { /// You can also create a `new` one from those fields. pub trait Header: Clone + Send + Sync + Slicable + Eq + MaybeSerializeDebug { type Number: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Slicable; - type Hash: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Slicable; + type Hash: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Slicable + AsRef<[u8]>; type Hashing: Hashing; type Digest: Member + Default; @@ -335,7 +335,7 @@ pub trait Header: Clone + Send + Sync + Slicable + Eq + MaybeSerializeDebug { pub trait Block: Clone + Send + Sync + Slicable + Eq + MaybeSerializeDebug { type Extrinsic: Member + Slicable; type Header: Header; - type Hash: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Slicable; + type Hash: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Slicable + AsRef<[u8]>; fn header(&self) -> &Self::Header; fn extrinsics(&self) -> &[Self::Extrinsic]; From d01da872ced7686bed9261bab0d137bf14f79e9e Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Sat, 2 Jun 2018 04:23:47 +0200 Subject: [PATCH 44/60] start to port over substrate-rpc --- Cargo.lock | 1 + substrate/rpc/Cargo.toml | 1 + substrate/rpc/src/author/mod.rs | 11 +++++------ substrate/rpc/src/author/tests.rs | 16 +++++++++------- substrate/rpc/src/chain/mod.rs | 4 ++-- substrate/rpc/src/lib.rs | 1 + substrate/runtime/system/src/lib.rs | 2 +- 7 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 76c2611fd4471..5894d884d96ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2047,6 +2047,7 @@ dependencies = [ "substrate-executor 0.1.0", "substrate-extrinsic-pool 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-state-machine 0.1.0", "substrate-test-client 0.1.0", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/substrate/rpc/Cargo.toml b/substrate/rpc/Cargo.toml index e4907d6d9f8cb..e59b23cd68afb 100644 --- a/substrate/rpc/Cargo.toml +++ b/substrate/rpc/Cargo.toml @@ -14,6 +14,7 @@ substrate-client = { path = "../client" } substrate-executor = { path = "../executor" } substrate-extrinsic-pool = { path = "../extrinsic-pool" } substrate-primitives = { path = "../primitives" } +substrate-runtime-primitives = { path = "../runtime/primitives" } substrate-state-machine = { path = "../state-machine" } tokio-core = "0.1.12" diff --git a/substrate/rpc/src/author/mod.rs b/substrate/rpc/src/author/mod.rs index 83062d5c08077..317d50df40803 100644 --- a/substrate/rpc/src/author/mod.rs +++ b/substrate/rpc/src/author/mod.rs @@ -17,7 +17,6 @@ //! Substrate block-author/full-node API. use std::sync::Arc; -use primitives::block::{Extrinsic, ExtrinsicHash}; use extrinsic_pool::api::{Error, ExtrinsicPool}; pub mod error; @@ -29,17 +28,17 @@ use self::error::Result; build_rpc_trait! { /// Substrate authoring RPC API - pub trait AuthorApi { + pub trait AuthorApi { /// Submit extrinsic for inclusion in block. #[rpc(name = "author_submitExtrinsic")] - fn submit_extrinsic(&self, Extrinsic) -> Result; + fn submit_extrinsic(&self, Ex) -> Result; } } -impl AuthorApi for Arc where - T: ExtrinsicPool, +impl AuthorApi for Arc where + T: ExtrinsicPool, { - fn submit_extrinsic(&self, xt: Extrinsic) -> Result { + fn submit_extrinsic(&self, xt: B::Extrinsic) -> Result { self .submit(vec![xt]) .map(|mut res| res.pop().expect("One extrinsic passed; one result back; qed")) diff --git a/substrate/rpc/src/author/tests.rs b/substrate/rpc/src/author/tests.rs index 10648cc1af9b1..94905ed6756a5 100644 --- a/substrate/rpc/src/author/tests.rs +++ b/substrate/rpc/src/author/tests.rs @@ -19,11 +19,13 @@ use super::*; use std::{fmt, sync::Arc}; use extrinsic_pool::api; use parking_lot::Mutex; -use primitives::block; + +type Extrinsic = u64; +type Hash = u64; #[derive(Default)] struct DummyTxPool { - submitted: Mutex>, + submitted: Mutex>, } #[derive(Debug)] @@ -38,11 +40,11 @@ impl fmt::Display for Error { } } -impl api::ExtrinsicPool for DummyTxPool { +impl api::ExtrinsicPool for DummyTxPool { type Error = Error; /// Submit extrinsic for inclusion in block. - fn submit(&self, xt: Vec) -> ::std::result::Result, Self::Error> { + fn submit(&self, xt: Vec) -> ::std::result::Result, Self::Error> { let mut submitted = self.submitted.lock(); if submitted.len() < 1 { let hashes = xt.iter().map(|_xt| 1.into()).collect(); @@ -57,13 +59,13 @@ impl api::ExtrinsicPool for DummyTxPool { #[test] fn submit_transaction_should_not_cause_error() { let p = Arc::new(DummyTxPool::default()); - let hash: ExtrinsicHash = 1.into(); + let hash: Hash = 1.into(); assert_matches!( - AuthorApi::submit_extrinsic(&p, block::Extrinsic(vec![])), + AuthorApi::submit_extrinsic(&p, 5), Ok(hash) ); assert!( - AuthorApi::submit_extrinsic(&p, block::Extrinsic(vec![])).is_err() + AuthorApi::submit_extrinsic(&p, 5).is_err() ); } diff --git a/substrate/rpc/src/chain/mod.rs b/substrate/rpc/src/chain/mod.rs index e0c0c0b255cbf..4f4a1fd70f9f8 100644 --- a/substrate/rpc/src/chain/mod.rs +++ b/substrate/rpc/src/chain/mod.rs @@ -51,11 +51,11 @@ build_rpc_trait! { fn head(&self) -> Result; #[pubsub(name = "chain_newHead")] { - /// Hello subscription + /// New head subscription #[rpc(name = "subscribe_newHead")] fn subscribe_new_head(&self, Self::Metadata, pubsub::Subscriber); - /// Unsubscribe from hello subscription. + /// Unsubscribe from new head subscription. #[rpc(name = "unsubscribe_newHead")] fn unsubscribe_new_head(&self, SubscriptionId) -> RpcResult; } diff --git a/substrate/rpc/src/lib.rs b/substrate/rpc/src/lib.rs index ec94c39c44c98..8cd043652ae57 100644 --- a/substrate/rpc/src/lib.rs +++ b/substrate/rpc/src/lib.rs @@ -24,6 +24,7 @@ extern crate parking_lot; extern crate substrate_client as client; extern crate substrate_extrinsic_pool as extrinsic_pool; extern crate substrate_primitives as primitives; +extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_state_machine as state_machine; extern crate tokio_core; diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 71523c8c01ecd..af7f8f7aaae26 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -61,7 +61,7 @@ pub fn extrinsics_data_root(xts: Vec>) -> H::Output { pub trait Trait { type Index: Parameter + Member + Default + MaybeDisplay + SimpleArithmetic + Copy; type BlockNumber: Parameter + Member + MaybeDisplay + SimpleArithmetic + Default + Bounded + Copy + rstd::hash::Hash; - type Hash: Parameter + Member + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual + rstd::hash::Hash; + type Hash: Parameter + Member + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual + rstd::hash::Hash + AsRef<[u8]>; type Hashing: Hashing; type Digest: Parameter + Member + Default + traits::Digest; type AccountId: Parameter + Member + MaybeDisplay + Ord + Default; From 354de816dedfdd7d356a73aeb1fa0e4762415ba3 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 4 Jun 2018 17:01:56 +0200 Subject: [PATCH 45/60] mostly port over PolkadotApi --- polkadot/api/src/full.rs | 179 ++++---------------------- polkadot/api/src/lib.rs | 33 +---- polkadot/api/src/light.rs | 35 ++--- polkadot/primitives/src/lib.rs | 24 +--- polkadot/runtime/src/lib.rs | 2 + substrate/client/src/block_builder.rs | 2 +- 6 files changed, 43 insertions(+), 232 deletions(-) diff --git a/polkadot/api/src/full.rs b/polkadot/api/src/full.rs index 68c79819e5e89..f05f76cc6471f 100644 --- a/polkadot/api/src/full.rs +++ b/polkadot/api/src/full.rs @@ -17,20 +17,19 @@ //! Strongly typed API for full Polkadot client. use client::backend::{Backend, LocalBackend}; -use client::{self, Client, LocalCallExecutor}; +use client::{Client, LocalCallExecutor}; use polkadot_executor::Executor as LocalDispatch; use substrate_executor::{NativeExecutionDispatch, NativeExecutor}; -use state_machine::{self, OverlayedChanges}; +use state_machine; -use primitives::{AccountId, BlockId, Hash, Index, SessionKey, Timestamp}; -use primitives::parachain::{DutyRoster, CandidateReceipt, Id as ParaId}; -use runtime::{self, Block, Header, UncheckedExtrinsic, Extrinsic, Call, TimestampCall, ParachainsCall}; +use primitives::{AccountId, Block, Header, BlockId, Hash, Index, SessionKey, Timestamp}; +use primitives::parachain::{DutyRoster, Id as ParaId}; -use {CheckedBlockId, BlockBuilder, PolkadotApi, LocalPolkadotApi, ErrorKind, Error, Result}; +use {CheckedBlockId, PolkadotApi, LocalPolkadotApi, ErrorKind, Error, Result}; /// A checked block ID used for the substrate-client implementation of CheckedBlockId; #[derive(Debug, Clone, Copy)] -pub struct CheckedId(pub BlockId); +pub struct CheckedId(pub(crate) BlockId); impl CheckedBlockId for CheckedId { fn block_id(&self) -> &BlockId { @@ -44,14 +43,16 @@ macro_rules! with_runtime { ($client: ident, $at: expr, $exec: expr) => {{ let parent = $at.block_id(); let header = Header { - parent_hash: $client.block_hash_from_id(parent)?.ok_or(ErrorKind::UnknownBlock(*parent))?, - number: $client.block_number_from_id(parent)?.ok_or(ErrorKind::UnknownBlock(*parent))? + 1, + parent_hash: $client.block_hash_from_id(&parent)? + .ok_or_else(|| ErrorKind::UnknownBlock(format!("{:?}", parent)))?, + number: $client.block_number_from_id(&parent)? + .ok_or_else(|| ErrorKind::UnknownBlock(format!("{:?}", parent)))? + 1, state_root: Default::default(), extrinsics_root: Default::default(), digest: Default::default(), }; - $client.state_at(parent).map_err(Error::from).and_then(|state| { + $client.state_at(&parent).map_err(Error::from).and_then(|state| { let mut changes = Default::default(); let mut ext = state_machine::Ext::new(&mut changes, &state); @@ -63,105 +64,14 @@ macro_rules! with_runtime { }} } -/// A polkadot block builder. -#[derive(Debug, Clone)] -pub struct ClientBlockBuilder { - parent: BlockId, - changes: OverlayedChanges, - state: S, - header: Header, - timestamp: Timestamp, - extrinsics: Vec, -} - -impl ClientBlockBuilder - where S::Error: Into -{ - // initialises a block, ready to allow extrinsics to be applied. - fn initialise_block(&mut self) -> Result<()> { - let result = { - let mut ext = state_machine::Ext::new(&mut self.changes, &self.state); - let h = self.header.clone(); - - ::substrate_executor::with_native_environment( - &mut ext, - || runtime::Executive::initialise_block(&h), - ).map_err(Into::into) - }; - - match result { - Ok(_) => { - self.changes.commit_prospective(); - Ok(()) - } - Err(e) => { - self.changes.discard_prospective(); - Err(e) - } - } - } - - // executes a extrinsic, inherent or otherwise, without appending to the list. - fn apply_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()> { - let result = { - let mut ext = state_machine::Ext::new(&mut self.changes, &self.state); - - ::substrate_executor::with_native_environment( - &mut ext, - move || runtime::Executive::apply_extrinsic(extrinsic), - ).map_err(Into::into) - }; - - match result { - Ok(_) => { - self.changes.commit_prospective(); - Ok(()) - } - Err(e) => { - self.changes.discard_prospective(); - Err(e) - } - } - } -} - -impl BlockBuilder for ClientBlockBuilder - where S::Error: Into -{ - fn push_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()> { - // Check that this is not an "inherent" extrinsic. - if extrinsic.signature == Default::default() { - bail!(ErrorKind::PushedInherentTransaction(extrinsic)); - } else { - self.apply_extrinsic(extrinsic.clone())?; - self.extrinsics.push(extrinsic); - Ok(()) - } - } - - fn bake(mut self) -> Block { - let mut ext = state_machine::Ext::new(&mut self.changes, &self.state); - - let final_header = ::substrate_executor::with_native_environment( - &mut ext, - move || runtime::Executive::finalise_block() - ).expect("all inherent extrinsics pushed; all other extrinsics executed correctly; qed"); - Block { - header: final_header, - extrinsics: self.extrinsics, - } - } -} - -impl PolkadotApi for Client>> - where ::client::error::Error: From<<::State as state_machine::backend::Backend>::Error> +impl> PolkadotApi for Client>, Block> + where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { type CheckedBlockId = CheckedId; - type BlockBuilder = ClientBlockBuilder; fn check_id(&self, id: BlockId) -> Result { // bail if the code is not the same as the natively linked. - if self.code_at(&id)? != LocalDispatch::native_equivalent() { + if self.code_at(&id.into())? != LocalDispatch::native_equivalent() { bail!("This node is out of date. Block authoring may not work correctly. Bailing.") } @@ -190,8 +100,16 @@ impl PolkadotApi for Client Result { use substrate_executor::error::ErrorKind as ExecErrorKind; + use codec::Slicable; + use runtime::Block as RuntimeBlock; - let res = with_runtime!(self, at, || ::runtime::Executive::execute_block(block)); + let encoded = block.encode(); + let runtime_block = match RuntimeBlock::decode(&mut &encoded[..]) { + Some(x) => x, + None => return Ok(false), + }; + + let res = with_runtime!(self, at, || ::runtime::Executive::execute_block(runtime_block)); match res { Ok(()) => Ok(true), Err(err) => match err.kind() { @@ -216,57 +134,10 @@ impl PolkadotApi for Client Result>> { with_runtime!(self, at, || ::runtime::Parachains::parachain_head(parachain)) } - - fn build_block(&self, parent: &CheckedId, timestamp: Timestamp, parachains: Vec) -> Result { - let parent = parent.block_id(); - let header = Header { - parent_hash: self.block_hash_from_id(parent)?.ok_or(ErrorKind::UnknownBlock(*parent))?, - number: self.block_number_from_id(parent)?.ok_or(ErrorKind::UnknownBlock(*parent))? + 1, - state_root: Default::default(), - extrinsics_root: Default::default(), - digest: Default::default(), - }; - - let extrinsics = vec![ - UncheckedExtrinsic { - extrinsic: Extrinsic { - signed: Default::default(), - index: Default::default(), - function: Call::Timestamp(TimestampCall::set(timestamp)), - }, - signature: Default::default(), - }, - UncheckedExtrinsic { - extrinsic: Extrinsic { - signed: Default::default(), - index: Default::default(), - function: Call::Parachains(ParachainsCall::set_heads(parachains)), - }, - signature: Default::default(), - } - ]; - - let mut builder = ClientBlockBuilder { - parent: *parent, - changes: OverlayedChanges::default(), - state: self.state_at(parent)?, - header, - timestamp, - extrinsics: extrinsics.clone(), - }; - - builder.initialise_block()?; - - for inherent in extrinsics { - builder.apply_extrinsic(inherent)?; - } - - Ok(builder) - } } -impl LocalPolkadotApi for Client>> - where ::client::error::Error: From<<::State as state_machine::backend::Backend>::Error> +impl> LocalPolkadotApi for Client>, Block> + where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> {} #[cfg(test)] diff --git a/polkadot/api/src/lib.rs b/polkadot/api/src/lib.rs index 06fb6f1276171..1d3e0c0c5827b 100644 --- a/polkadot/api/src/lib.rs +++ b/polkadot/api/src/lib.rs @@ -37,9 +37,8 @@ extern crate substrate_keyring as keyring; pub mod full; pub mod light; -use primitives::{AccountId, BlockId, Hash, Index, SessionKey, Timestamp}; -use primitives::parachain::{DutyRoster, CandidateReceipt, Id as ParaId}; -use runtime::{Block, UncheckedExtrinsic}; +use primitives::{AccountId, Block, BlockId, Hash, Index, SessionKey, Timestamp}; +use primitives::parachain::{DutyRoster, Id as ParaId}; error_chain! { errors { @@ -49,19 +48,9 @@ error_chain! { display("Unknown runtime code") } /// Unknown block ID. - UnknownBlock(b: BlockId) { + UnknownBlock(b: String) { description("Unknown block") - display("Unknown block") - } - /// Attempted to push an inherent extrinsic manually. - PushedInherentTransaction(xt: UncheckedExtrinsic) { - description("Attempted to push an inherent extrinsic to a block."), - display("Pushed inherent extrinsic to a block: {:?}", xt), - } - /// Badly-formed extrinsic. - BadlyFormedTransaction(xt: UncheckedExtrinsic) { - description("Attempted to push a badly-formed extrinsic to a block."), - display("Pushed badly-formed extrinsic to a block: {:?}", xt), + display("Unknown block {}", b) } /// Some other error. // TODO: allow to be specified as associated type of PolkadotApi @@ -85,15 +74,6 @@ impl From for Error { } } -/// A builder for blocks. -pub trait BlockBuilder: Sized { - /// Push a non-inherent extrinsic. - fn push_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()>; - - /// Finalise the block. - fn bake(self) -> Block; -} - /// A checked block identifier. pub trait CheckedBlockId: Clone + 'static { /// Yield the underlying block ID. @@ -106,8 +86,6 @@ pub trait CheckedBlockId: Clone + 'static { pub trait PolkadotApi { /// A checked block ID. Used to avoid redundancy of code check. type CheckedBlockId: CheckedBlockId; - /// The type used to build blocks. - type BlockBuilder: BlockBuilder; /// Check whether requests at the given block ID can be served. /// @@ -145,9 +123,6 @@ pub trait PolkadotApi { /// Evaluate a block. Returns true if the block is good, false if it is known to be bad, /// and an error if we can't evaluate for some reason. fn evaluate_block(&self, at: &Self::CheckedBlockId, block: Block) -> Result; - - /// Create a block builder on top of the parent block. - fn build_block(&self, parent: &Self::CheckedBlockId, timestamp: Timestamp, parachains: Vec) -> Result; } /// Mark for all Polkadot API implementations, that are making use of state data, stored locally. diff --git a/polkadot/api/src/light.rs b/polkadot/api/src/light.rs index 6038a8ec1fbcd..3db1dc2f6526b 100644 --- a/polkadot/api/src/light.rs +++ b/polkadot/api/src/light.rs @@ -21,23 +21,18 @@ use client::backend::{Backend, RemoteBackend}; use client::{Client, CallExecutor}; use codec::Slicable; use state_machine; -use primitives::{AccountId, BlockId, Hash, Index, SessionKey, Timestamp}; -use primitives::parachain::{DutyRoster, CandidateReceipt, Id as ParaId}; -use runtime::{Block, UncheckedExtrinsic}; +use primitives::{AccountId, Block, BlockId, Hash, Index, SessionKey, Timestamp}; +use primitives::parachain::{DutyRoster, Id as ParaId}; use full::CheckedId; -use {PolkadotApi, RemotePolkadotApi, BlockBuilder, CheckedBlockId, Result, ErrorKind}; +use {PolkadotApi, RemotePolkadotApi, CheckedBlockId, Result, ErrorKind}; /// Remote polkadot API implementation. -pub struct RemotePolkadotApiWrapper(pub Arc>); +pub struct RemotePolkadotApiWrapper, E: CallExecutor>(pub Arc>); -/// Block builder for light client. -pub struct LightBlockBuilder; - -impl PolkadotApi for RemotePolkadotApiWrapper - where ::client::error::Error: From<<::State as state_machine::backend::Backend>::Error> +impl, E: CallExecutor> PolkadotApi for RemotePolkadotApiWrapper + where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { type CheckedBlockId = CheckedId; - type BlockBuilder = LightBlockBuilder; fn check_id(&self, id: BlockId) -> Result { Ok(CheckedId(id)) @@ -85,22 +80,8 @@ impl PolkadotApi for RemotePolkadotApiWrapper fn parachain_head(&self, _at: &Self::CheckedBlockId, _parachain: ParaId) -> Result>> { Err(ErrorKind::UnknownRuntime.into()) } - - fn build_block(&self, _parent: &CheckedId, _timestamp: Timestamp, _parachains: Vec) -> Result { - Err(ErrorKind::UnknownRuntime.into()) - } } -impl RemotePolkadotApi for RemotePolkadotApiWrapper - where ::client::error::Error: From<<::State as state_machine::backend::Backend>::Error> +impl, E: CallExecutor> RemotePolkadotApi for RemotePolkadotApiWrapper + where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> {} - -impl BlockBuilder for LightBlockBuilder { - fn push_extrinsic(&mut self, _extrinsic: UncheckedExtrinsic) -> Result<()> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn bake(self) -> Block { - unimplemented!() - } -} diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index 6700557a154ca..a641cb76b5678 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -91,27 +91,9 @@ pub type Timestamp = u64; /// that 32 bits may be multiplied with a balance in 128 bits without worrying about overflow. pub type Balance = u128; -/// Something that identifies a block. -#[derive(PartialEq, Eq, Clone, Copy)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub enum BlockId { - /// Block by number. - Number(BlockNumber), - /// Block by hash. - Hash(Hash), -} - -impl Into> for BlockId where - B: BlockT, - B::Header: HeaderT -{ - fn into(self) -> generic::BlockId { - match self { - BlockId::Number(number) => generic::BlockId::Number(number), - BlockId::Hash(hash) => generic::BlockId::Hash(hash), - } - } -} +/// "generic" block ID for the future-proof block type. +// TODO: parameterize blockid only as necessary. +pub type BlockId = generic::BlockId; /// A log entry in the block. #[derive(PartialEq, Eq, Clone, Default)] diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index d42a11ebee249..7202967ab2476 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -74,6 +74,8 @@ pub const TIMESTAMP_SET_POSITION: u32 = 0; /// The position of the parachains set extrinsic. pub const PARACHAINS_SET_POSITION: u32 = 1; +/// Block Id type for this block. +pub type BlockId = generic::BlockId; /// Block type as expected by this runtime. pub type Block = generic::Block; /// Unchecked extrinsic type as expected by this runtime. diff --git a/substrate/client/src/block_builder.rs b/substrate/client/src/block_builder.rs index 70344f1bfc70b..35cd466cc3c5d 100644 --- a/substrate/client/src/block_builder.rs +++ b/substrate/client/src/block_builder.rs @@ -73,7 +73,7 @@ impl BlockBuilder where }) } - /// Push a transaction onto the block's list of extrinsics. This will ensure the transaction + /// Push onto the block's list of extrinsics. This will ensure the extrinsic /// can be validly executed (by executing it); if it is invalid, it'll be returned along with /// the error. Otherwise, it will return a mutable reference to self (in order to chain). pub fn push(&mut self, xt: ::Extrinsic) -> error::Result<()> { From 64accdd03069d9172902195325d46e014bce5063 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 4 Jun 2018 18:08:42 +0200 Subject: [PATCH 46/60] test_runtime follows normal conventions --- substrate/test-runtime/src/lib.rs | 9 ++-- substrate/test-runtime/src/system.rs | 65 +++++++++++++++++++--------- 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/substrate/test-runtime/src/lib.rs b/substrate/test-runtime/src/lib.rs index 9bfcbc3e1134d..b96c9676094bf 100644 --- a/substrate/test-runtime/src/lib.rs +++ b/substrate/test-runtime/src/lib.rs @@ -19,7 +19,6 @@ #![cfg_attr(not(feature = "std"), no_std)] extern crate substrate_runtime_std as rstd; -extern crate substrate_runtime_support as runtime_support; extern crate substrate_codec as codec; extern crate substrate_runtime_primitives as runtime_primitives; @@ -30,6 +29,9 @@ extern crate serde; #[macro_use] extern crate serde_derive; +#[macro_use] +extern crate substrate_runtime_support as runtime_support; + #[cfg(test)] #[macro_use] extern crate hex_literal; @@ -110,8 +112,9 @@ pub mod api { impl_stubs!( authorities => |()| system::authorities(), + initialise_block => |header| system::initialise_block(header), execute_block => |block| system::execute_block(block), - apply_extrinsic => |(header, utx)| system::execute_transaction(utx, header), - finalise_block => |header| system::finalise_block(header) + apply_extrinsic => |utx| system::execute_transaction(utx), + finalise_block => |()| system::finalise_block() ); } diff --git a/substrate/test-runtime/src/system.rs b/substrate/test-runtime/src/system.rs index 2572eaaebccef..871025a0ad5b1 100644 --- a/substrate/test-runtime/src/system.rs +++ b/substrate/test-runtime/src/system.rs @@ -19,9 +19,10 @@ use rstd::prelude::*; use runtime_io::{storage_root, enumerated_trie_root}; -use runtime_support::{Hashable, storage}; +use runtime_support::storage::{self, StorageValue, StorageMap}; +use runtime_primitives::traits::{Hashing, BlakeTwo256}; use codec::{KeyedVec, Slicable}; -use super::{AccountId, Call, UncheckedExtrinsic, H256 as Hash, Block, Header}; +use super::{AccountId, BlockNumber, Call, UncheckedExtrinsic, H256 as Hash, Block, Header}; const NONCE_OF: &[u8] = b"nonce:"; const BALANCE_OF: &[u8] = b"balance:"; @@ -29,6 +30,14 @@ const LATEST_BLOCK_HASH: &[u8] = b"latest"; const AUTHORITY_AT: &'static[u8] = b":auth:"; const AUTHORITY_COUNT: &'static[u8] = b":auth:len"; +storage_items! { + ExtrinsicIndex: b"sys:xti" => required u32; + ExtrinsicData: b"sys:xtd" => required map [ u32 => Vec ]; + // The current block number being processed. Set by `execute_block`. + Number: b"sys:num" => required BlockNumber; + ParentHash: b"sys:pha" => required Hash; +} + pub fn latest_block_hash() -> Hash { storage::get(LATEST_BLOCK_HASH).expect("There must always be a latest block") } @@ -49,16 +58,18 @@ pub fn authorities() -> Vec<::primitives::AuthorityId> { .collect() } +pub fn initialise_block(header: Header) { + // populate environment. + ::put(&header.number); + ::put(&header.parent_hash); + ::put(0); + storage::put(LATEST_BLOCK_HASH, &header.parent_hash); +} + /// Actually execute all transitioning for `block`. pub fn execute_block(block: Block) { let ref header = block.header; - // check parent_hash is correct. - assert!( - header.number > 0 && latest_block_hash() == header.parent_hash, - "Parent hash should be valid." - ); - // check transaction trie root represents the transactions. let txs = block.extrinsics.iter().map(Slicable::encode).collect::>(); let txs = txs.iter().map(Vec::as_slice).collect::>(); @@ -73,23 +84,37 @@ pub fn execute_block(block: Block) { let storage_root = storage_root().into(); info_expect_equal_hash(&header.state_root, &storage_root); assert!(header.state_root == storage_root, "Storage root must match that calculated."); - - // put the header hash into storage. - storage::put(LATEST_BLOCK_HASH, &header.blake2_256()); } /// Execute a transaction outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. -pub fn execute_transaction(utx: UncheckedExtrinsic, header: Header) -> Header { +pub fn execute_transaction(utx: UncheckedExtrinsic) { + ExtrinsicData::insert(ExtrinsicIndex::get(), utx.encode()); execute_transaction_backend(&utx); - header } -/// Finalise the block - it is up the caller to ensure that all header fields are valid -/// except state-root. -pub fn finalise_block(mut header: Header) -> Header { - header.state_root = storage_root().into(); - header +/// Finalise the block. +pub fn finalise_block() -> Header { + fn extrinsics_data_root(xts: Vec>) -> H::Output { + let xts = xts.iter().map(Vec::as_slice).collect::>(); + H::enumerated_trie_root(&xts) + } + + let extrinsic_index = ExtrinsicIndex::take(); + let extrinsics = (0..extrinsic_index).map(ExtrinsicData::take).collect(); + let extrinsics_root = extrinsics_data_root::(extrinsics); + + let number = ::take(); + let parent_hash = ::take(); + let storage_root = BlakeTwo256::storage_root(); + + Header { + number, + extrinsics_root, + state_root: storage_root, + parent_hash, + digest: Default::default(), + } } fn execute_transaction_backend(utx: &UncheckedExtrinsic) { @@ -223,9 +248,9 @@ mod tests { let b = Block { header: Header { - parent_hash: b.header.blake2_256().into(), + parent_hash: b.header.hash(), number: 2, - state_root: hex!("1bd77fc89d5380aad314df357f265a94a051be6b1f137bc9882d6b9edcbbd810").into(), + state_root: hex!("c93f2fd494c386fa32ee76b6198a7ccf5db12c02c3a79755fd2d4646ec2bf8d7").into(), extrinsics_root: hex!("f6ba96c4df7fcfbcdf58d4ad6ca360dbf7894f17a7136894edb518c0c06829e6").into(), digest: Digest { logs: vec![], }, }, From 0cf5f15022b27c98a1c9bcd429299f9e49695d0c Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 4 Jun 2018 18:44:16 +0200 Subject: [PATCH 47/60] substrate runtime tests pass --- demo/runtime/wasm/Cargo.lock | 6 ++ .../release/demo_runtime.compact.wasm | Bin 404994 -> 405123 bytes .../release/demo_runtime.wasm | Bin 442248 -> 442405 bytes polkadot/primitives/src/lib.rs | 9 ++- polkadot/runtime/wasm/Cargo.lock | 19 ++++++ polkadot/runtime/wasm/Cargo.toml | 2 + .../release/polkadot_runtime.compact.wasm | Bin 436615 -> 439673 bytes .../release/polkadot_runtime.wasm | Bin 482359 -> 485850 bytes substrate/client/src/block_builder.rs | 60 +++++++++++------- substrate/client/src/client.rs | 1 - substrate/client/src/genesis.rs | 18 ++++-- substrate/runtime/primitives/src/lib.rs | 1 + substrate/test-runtime/src/system.rs | 14 ++-- substrate/test-runtime/wasm/genesis.wasm | Bin 18636 -> 20741 bytes .../substrate_test_runtime.compact.wasm | Bin 18636 -> 20741 bytes .../release/substrate_test_runtime.wasm | Bin 20609 -> 23146 bytes 16 files changed, 91 insertions(+), 39 deletions(-) diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index d464af8df1c0f..1d60ec2af4a9a 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -577,6 +577,7 @@ version = "0.1.0" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -594,6 +595,7 @@ dependencies = [ "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "safe-mix 0.1.0", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -615,6 +617,7 @@ dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", @@ -689,6 +692,7 @@ dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -709,6 +713,7 @@ dependencies = [ "pwasm-utils 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -766,6 +771,7 @@ version = "0.1.0" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 5f60bdb4b89820cb6eb6fc451cf3cb0eee55ba0e..4f90b5ce2abcd89c7e4e5a795cd57bdde367b3d4 100644 GIT binary patch delta 18344 zcmb7s34Be*_xPRdCV5NpvXSIvx$nt}L?U|-xk}MkOBK};LNF*FUL_+Xq4hfDx5($t|fDAwZ zCxOU}A_C232~b3u#lJ>23ED~lP)!*cgAx)LK~kt31gxspPS#20fa)Te=Gu(tuyN(( z(iUVc``3iwmE%TC7*Rf6`X9257!9vwqehG`A2@ha<&crm?f(3Ks#=AyeRfyPx0 zKn?ONwNGmwqM$3qz)n8rInN92nXm0wYS@%CRS+0f9Qge&`vG1D|*5hxL!LR`Xp-1FSSKBZFdip zh$4m3&QGNVt_%9hp61$5J<+9m)qU9u^)Uq5Fy>%w%tL4a7PR2Ls2R|b(HGr7qU;!m zfCa5%e{`PumD>*lTJ3_8dKmNYAO!hRJNeiND2|s_qGCQ{G@5Z&l?GLr_duVb)s6-9 z{(Uq+S9Z_lrb+034G2&JQlG1bMo<;c9~+2*_|j3xqW$zVx_B?F9I%?TP!|d@%&49e zw5%B@^B$th(O#Q{J}0^%telDrLs+Z7fFUfKiw+tHI~g@y-~sUA3sI24Lw)%47tzxO ziS_1!26N#z7A{o0GSEGQcmk%Vmr+xrM-QW-w*l|99Q_oJ*B5E+51`}-VJ)N1pr&Xo z=Vwrls6}lQi^BBzr|vMTrzP7`F)hE;{yu}I1wuDI{S(w$JnKF|F9|dQK1KJ13pA^) zg5A&1-oA>?rMFpItOO{52A)O5ib+A+Lb{vncXusR>v{*65(*^jc zF!TB%he?$jW_5khl2V))B+5zvlz4h6ZYyXSU5cBE_AixUkm9B`c{oZTD$c{P@Bo?Y z?1Dc=p$FV>V!&_YXf@sN*dVk>3+{_;k*;Y$D8$u7Qf(uhI8joN8d#BvB?nQdgW?jE z+OU&#uu2M3NS-9&67i=H0YT8tDZ^N7LWLs$x%t_(P?3pwFUMZ4#6k8UQ-T(4l@+2P-mz)`62i zRm#JXg4>~d7mD9ONeL7jR5(Gu z0#mGxN!BIj3<1fgq|}O_3$1Vht(~nvf?(LHb7Jl6vOBGUV>57rfv1oTRxFqnd;$z) z7ou1NzcC<0$wKt*|HolL7v5n_^@nwjYEoR@VTl;l-0-l}te71Z3s?uV2@F6}by1c=fgjpGX!q7%4F1fp~FGU6kDzr1`842+S8v#QC zdk7KI2>`ue2iPX)P%(F~27+vYK{5#bLUe0DN-$UhpsawwWg#xB6$^0*)DEH`M~D&( zX#MMjExH6c8PNGv=!RkeL-CSoQi4V*L{J(8oPp^E2}(^3SS~;XjbOe`5DnM{OkAXx z;Ll^V5UT<;CdJ}pN>BxiFJ@be5@L`m@Wbp8RlXX1(uh6+EqDXDe!WgFSO+lS2vTfn zLeW#?a~I1!`~saop+gl=Na)gu@#u01ddTK3=>|(6{?gjT}$Lw zLdipppA&_N3dbpoPX!y)n=zO*s?NXn8}5+Tt2mPB9~fzgU$NjCv_KGvXSdo1}J-PRVwk=Q`|vfim9Uafb? zYyM8Inr$q@-ZxtU=zeOR>NMa7P8bT9n#cPk8~n^lCd&i{X9~#_{Pj+O^5O#iQwmVK ztUyqUK)gcsFBfR>sbn}x{S$<$UJI#6l-i*Xvs!<&MPLLXs)k{;Eor0*HGL0)$TYHm zJ!lP5B->03lSC*^*Ihd)AKW+=k3jV>zub(p5L7H~MoQ5;deOSRNDuXq>bl=*<|~^K zhgRI2Y(VHe{#`mL$eLeZn8HevK&db_pu(xo72&>wF}$dALEKy{D$pLxARI-V!Mc4p z84NCLO@F8$3JBGlf{3I{QYu6PWe2a$B$55Roceh7z3H;P)mEQwYhhA}Y3C>UyCA;0 zv&T8gA}wJ|EjNp}aP&iq+pO;F8<9p0VB5-pMB0G5V9c^2kuIzc2I1 ztLQKOd_IZ6H3j^&d{Q8=T*@bpBlNe{sgTS^O^&#y;|2HA$Hfgdq>A4xBK^|;&htzv zm{K4`eM)(xXjraCiqGZqRToGkU(|{m6|#DyHQ8YCAqE2rZ9|%)1-!ToX^cO1@RceE zadI2dQ?x$ShCGH3>p&5Q@rR3v8a2nQ4{F$i&K$2$f90b1+xiz`XRM z_q0k1&;pIMBllr^!XYShaK%M}gzzV}CtVRX=+>cu{KpQY2-n&TA(Y-vA_dbagGfuh z=zcO%o(U7gHd|vI$#V#=Rd`h=@(BLiOO_VdnIvG-{&=w0I$U9!&x=cm)8*sj|N7>$ zxEi-Ke2}wsFbyG+5j$!>vH2Q!-^7vwBIXxMNjt%&uG#%AViin*j;;z8+I1zZMdj44 zq`iQ@-IZJtfGL!u0o?Hw;U)esw1zjCO#Hdyvl1r}9H zm|29tW*aD;7~1gDnym+U5Puja2+_5+pa)rl=4d%R$s56Vd8|QT#2^wXv;$J7GOE&= z4+MsCM(B2Ku!MsCM(Doz_yL0XXJH76i~^e(2Npt>qN zby(N%Jn`}dm(n}7r==yaMJ23rr{lP73TYxtIgl@_B+>Yb z7(QhLWjwbPCu0rgl|Pm|h)i=^2|Go?POHa}SCVRr zgp8AvMnbfqZqaH*LbRc7(e5qM`iv(s5(;{30=bUS9Nu#h`5nL5ikD6%vG}D{e8gn3 zMNkm^B)P13x%V?w9}J8$<|*_Z0O0qLp_3DPkpIhHZhJQyVqgmSWoi?sAdF z=sXXZLbB_vG!mcI9waet3W-J+dDRq>Sg%?(sxM6;ap(iSLM6=vZOvSy7x+AZ6Q4@t zOI?P2pLBtNevruHr;;Z1umlM#P5I=hB-!_`blM{ zJNEL`eR-!Rv^l`gc-%CSAwr6-(@2R}^sF72wG^bJWGb4IB&-fE!gV9Q(!lJ z2I<>r+h2%Zo())llv}e&3Lo?wF$)<#@f1FZf2-V)lkD zeDF;2xv;Hvv&bGj*aD2jus*h$LvEwO2Kew3zPENdLey`&k8RWW*tvw`ZxXqwilhnJ za;wM#7HYtR*^hyLpAB3FAP5~A|3GeF}z?gc~VTKo;4(i4_aZ&u(2yh zI&ZXuqzZQlH5mf&m?hvo!L54A(>a;xu214EmXdhk+BHf zz;_*AO4=cOQ{k4EAjB|mr}L@XAVO`nm;@ygb!{vpA(9kgdEhi}rOLyLKV#1eV`LgB2fp7RmyRw}0^5<>r zE8r9VwDWDRkX$@3mVfgK%wzD8cj~K~@S=xS=uVLTx`Ol!o*xf{ri1uO&FWIS)_WyM zMQ+SVe9bC-DdM|Vk&$?#PpQ3DlOm@P3*cv9y)bQ_;*9KXmDFDZwhUl9%o<^dM8Zd1pP;qdNHl_GYJY5jsK1duexwrpZ)b!~L_{AukihqCBd-Cv zvhARBLmR1<#$X`FVP&_8o!!Ch#KJ?3xUSj}TROZ?f^BGA`esMFtRLs~QHj%8Ua!GWHE1tEcc zg!p?6kGJ>1AUgA&cewn#yVrmEIjnz%d2!nILug^!2mk$l;=50D`R74=wFiupfLEuo z&?)%Ejt9V4s`%vt;9fB?KLAwZC zJbty#t{p!FTQGdc&MV&nw|lf+^)b7){4KE?_&ttaIYOQiQ7ZU}B>vNCeXqcm9wm8! zFJMRmsh`Ga=Z=zAsF6>2UR|kQ*71~MWSy{Va6WFj{yIiFq0{`@BJigJj+30=dX6?w zceKHQVnTUm0Y7w{j1p^vPV8N4#G@x*=Zir-(@v2tf~WUR5xbiw>|RQMr$0`SjUp?= zM|}V*4m7|1F6o_q$o>zzM?)^2-6PCb;%29+K( zU_NI)CsBfJ?fZ*l5EATlxlH~hLNZ;yB5L#>%^U<&7}(C$6I@~-?11{f6VfQ!y01tL zGJCBBvVg1_!Vn12GONJ}0)l?kq&U>uz%$Kxw{Jl7GqqvgkT(ekSWEeVB!;7vyvtwY z2egV8{7o*zz(xzQ{J?{r9)T2%zLrbs<>bW~RP3@A_oqvvUxC$Dt&{Ya)z2kB=Esbv z1yR6)I0~ZC_`_r#8$?t13wCPapYn^Io}gV2jj~+ zJ$lBgTM&H@y~5*7bRPaTnQu1HG2)qErq22qjjm=o2QN-B82Q^w#eR~9S?GhfMhEKH zmRjg^v_i96X*TxTruc~TO==L+=ny&yLG!O|v>kGDRaWgI-93N z(}SRxucPT2G34ABx=k2d8#_&btxLI`wh`d9c6z-Y!P@FrIt7_Fx#hI!FmD=9zeO+c z@C2GmUoTQkd~6e%#s8f^FN*BO`^{)ezCfXE(N*n?LhncPOe@u_w~4mvdv6D%p+r_j zPnMAd7|emcuh3LISNVdIE(JNJHlZExr9=VGX3=K#ze#*u6WUCqNd$-oB+@4MR+=%| zV~I3IBw+NK&586O*!Yno`VJ8JeiF6g>rM44&5=wm(bhg8o^@xEXLvHp#xkSca_?;} zxZ#W3yn|nF(~QQU)%=lWG*&24XLe&Vng|6A3ilKAHIHgRi-ah9x1jx?xTOW{gs$=j zvS@r1%t6?jxPu8_LQ>*eGO2@i%cP00O@#hQT*;z=x_D~*;#OMYeSwK~h`i2x)pi_U?AoYEqfM$51STRA;8=!v_(5BEOsgSlnzwn0& zX`enmIsfyUzbUImirJP7K}Ax7F$Mp$3R2FWB=W#{Mx@+&9_b^>i{_F0g~eQ$N79A# z&GRAe3gy1@Nr!}nDDaL8`}YI$VabBM^`-f+J%v4Yix)^Xnyw9bfvncuYQRD=0=c;^ zal#(P;Ckwd#0gxld67I4;2wg%QOYv#r^)3n=M$I&E>@Sx8|AigQ=70!D z-#~osGqg|Ghhk}Q!TFyBj(*_`!gf~s%bVg~6?Sk?LX04=>VZ(I#G5 zO)E{C#rR@Fu!VnHP1m8Ve8D1^w0qW8eADizO0R>=&fv+8SD)!x5;01z)-P)M9>B|^~u$-VP1nZkm(9uGdaVIHQCjdaX zFqux#VgXf7(1>T}=`-{QZYqxm4o%#Ud=t4}sJzNDiO+N2Hn8YBjdw|oQf zz-E5o8(I$HZuc!+0bT$5EiH&JL~|ay`G!COhRFDiCIH{vKsb^6L@rG-!qElpl-f4# z`i|xW?GhpZm%5K1{Ep@T<-dGKJD^%#_&u!w!q0tAhZws5T_^m$AL!x6Td@-B#@EBqbrbNSS0CDgRdvt** zfFHb0v$fBEp?eu$c9Vu9E8l#RRyIg|i$Cbo;TD*df?}0*gu4epfXU3?_=85H0PW*H z=w(z0mqOf!wtuIKYY#}A#obPa?UO35tORy|`zwL&7Sl8IixHy5)C}$CTePVKoz-H4 zSVtUqtBrn?c8iZRv;V;ztHBmF51~MQ&B`J}0u^wA1a2Z>C-7$G5y5N{3gA`2EHjJ& zfimEQ>^@YBD>B-CawSoneY+hh!)Q}~^nmLt;^vbTu(-zrbP{+KqtfPq+F%#pg~nE>`su1rFI=86>vZe1_y`sxKAQpO zI9~GMVgnrh8k9CMNEI}Ei6CG%IDtWe#ULWOR7~6v%Oc@=3Q!*F*t=PE47%avEhmUx!t@YtRNSG1H^!B3E)^9DDWBqbJZwe*f> zWiDM(hUITUs_q(vgw7+ltpm?XVkUuM+Cm*55Xi102f`)b6D2XdC3pc30TW*&r~*Y5 zRJ@U)!mQGJg}LwYssHY1#VQk1U$TWm8P8=J7) zV(_=(R-e#?*FpG?>4)i`5aqH`jfJbF2ODetccD)|P-Gy5K1dZ0)O{-Oa8zQ6nzyrm4 z4pbak9pD#J+4C@3MH(A|4)J%>SQ3ilH_}+TyevyqY>_;rDeF>rx}gy-G&G`tTs^Cg zp`O(?HDzrP@NuOX%Y!FxlFm}$(IuVPAFXN#YfVE~Hv#Z&J^)C-&FWF3=jN1qe30Xj zbhZrwhJR(Sv2fSwn+*1$9x=Vpl4WS$XRY|3iAxX4{Bi z(yHg-hMf;=+s>C|GbcLE4`j1y6T~Na3kXp9z5u|xbbJMXcgf}!0RKTYyYtyIAe-z0wh}ec z&K9sm2%aN~U@HV6-RG@YJcf|&b}{Q_goWQy5wktimfgUcU{~9kIr$SM><7O}ZLrFo z5OLs{cA)4ZJm5Z-Vew~~tM@T+!&r0O$F2lKE@~mxd2tIFyt~*i*kja1d}=9c8*rIm z2H$t#^G?Ch=KKO9t7+T{@?r$V!DL(KP{{#QY-oft^~;i|iamt2Fas z_B=+b`4SFFSm8xX`Hx~ zaiKMROY~jUhIWUW4?nko?Aq%^JfxWFxsQ@!+6K-frxep3km`W1kwB|PJfVbY0miiu z!W}(mBb#v@#B-_w*FoUcSvM5?X%XCiPjCcStY&pz5g*u&M&_Rrn_xI1EOF}h+esQJ zaKNSIRNUSXAnpgjEoHHxfrVCVbKtVJI6=Kx#5cC1PBOQZ%Ez{$;XJM{4dbrCMy77b zee`NeALE|nqEDp0I)9j!(4Hm-=tqho^6_Y5lh&t{9wR|;4~D3z;u=hHcX|!i7V)Sa zG~q5*dB+~~N65(J^#qBck9qH2bQolH_xGX+A>#NkTnR81BshNjt{1hp6vvNY4Ie)$ zaHrZP?gELUM(_73YIt66+6%wjiqGv01gvRgoM6FqNw^vCYAbDDZ(4@XIUd^w63H*L z=8yED-{RL=@eU8uEXXxZdYF!PtJX*ehZa-Fv-PF=g`kqYbg8&#^J!n202giepMB|1 z;4FXWM@#M@ZSArCv>h_UQvl-8UVnuCj3ab$i83sJLVcjo0={w(?Z|(9j1~&&GY2+A zea|vTp78a9=;R=`NvU-_p$Cn+OVS!Nh0MYnUNe~fDU5j85U^G-Vr>Y$;g_rT>Dc!M zlls(9+U4G4bSkF>x|^Inj7}A~6Z$xHBG6~baJm}wd2%>S*P@m&Lc>KKN_V&)mYo`1^ZVwzm5Kn}vAWgHUt*Ags_`--Ok6*+JG{esX+K<*1>Y*0EOt4Xl#H zE8k=@dD5FKRp2h*i*~Vast>qs7n2dMKERs5t<$r7Z5_Mf+z~5DsZgsnmZVVes^n&$-L9qu}eU0DqAf^`8D7IDFq#3WIu+6+ZB+g%5_0 zr(FcVJ3)CQd=PwE#7j~Wc)H;(Z^cUZ608#{6rfTd@|2UI9PC$a4cG;OsX$dBJbS=X z^os#_Iy^I>9PI}`3Zn|RhoHSsF9<4t50YHI3IuFC0Kj&71q=XXF+d$W{Ri-HP#=+x zvpexzgZ_db51x7i!T3^8xG`{B_rMD1Lkv6!p8f-0gLb0qk${JgJNtV$T>$+Br^DTN zZINz?!PA2`Nr+~p8*nFLF9IHYggxx?j5nl_L2tGj?|-1Iz`F-t3h!VQ(q@2X`oX)n z;huI~-DMBG9#ahmjR{kI6ilxfJl&?|lDb0$kSf`rLUjHVJ|J9g`LjF97oZF>^Va|8 zj`Be$3(a`&y?IBu4$8j%psGXl0Ftx`%D|)-!De{(Cur^+^;J*?+P&@P!Mkq&Nt!I` z;Ny{qM^d_^g{eFoBS|n}rAQ!K*lJJs2vKJPJkbx{&kY|4?Su(<+P~(8Uj-^s{oq^N za5LcXhYJG5Ozz@E}4L<;gV4_LefjZ$!M;k*o7{T*zXp$=Fs=-~ z+COI8h$rB;04A1?FDe>eHhSpb%E?7V9Y#+aF|Km-6Xl~Pv@eJ6{6mAv(fo3hob4>j z8Jb(3H8d}Ca9&nUd3o7pBtKC$3VuUii}7OvTM?gnlEw0+zcCxxhUW7H-?4IT`<*q# z+Yxts&zkaKzcU+bpfCRoi_%u{Ud!u#XGwS`;?Km%30%I(Y}(^D+54faWnt!zI>I=u zzgfNywa#nZTPYi_45=JfUQ{%say0x3!-S%u&Z8$(wtlF%xTt6ZycHD_qEF1LLvX|_oE5F zq3-ZK8abQ~Y9@#B&#ZE@M!(n9cdM9=cFG^n2wEDvfj zZ19l0!m_fQ+`NMPvi!{aTX+24!fiJ)B}C3dfAO9na)10c;(s@mBgFvW{G$-ro;(%b z@uLjW?)puJ>G(k}?Mb|wO^&fW>-&|4apPy;C;60cIhLn|%8#Pw_~$WlTmE*a9F1o3 zOQCXSG7EPR4N`gUFgX$KA(aA?seDbC+=R@*{k*vILbG#+6yy{Xwk*tTIe5sh!oueT zu1OxaEITI zTu#$~t{P+D?oH*!TuqbXU^5G2KFQBRC0wlUCJ;5{kxk`9w1O8kmAgUyLMK)4v8yTc zSj87Aa%Ol=WzUigfCw`qYw6;UGBg`;$=J8fm;~^bdLw)s1?l=J|`ZA*ont_ z2y4R!B*}sNHh|&4GdMwh9F8h86}bn0I{`qN!EOSibm6EI;Dg|t6~tFU_T52d8s3i$ zU((S5Lmcqu-JU3$!n5*+a>2S>@}=tDjrUCu*id38FtsE;6PEEkh=_yNP4+!qZ4d~B$DUo;>( WFWx(cfFyEr%gS5AOex4K%=>>&I>&?n delta 18194 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 diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index 887c20a9e70c719ec111674b1fe970d596a215f6..3f1f2d9906aebfdd7ff0274d7452de67eb51eb9c 100755 GIT binary patch delta 20277 zcmcJ133wF6)@aw(StgTA_K<`y69I!j2q6T*qBLG)S5QDj1OkLB0m3Q*0tv{z1_B%; zVUMf{J9OB0k?jhyh=>Y`s8>`_P(+k>s%LsKnFRg+@4ZL9p}Xo-ojO}pojP@9rap>( zFDE8bn~xa@4DC(F(rr(gm9A;9?@w`Elml6RL35#cN&YXnqo zs>bC_rEw%Y?>31N!!m{|;d!5uN|iz~Mh@?h(I>fn{kmyAMq~`_*LRc>&W_T8DXlbGKGa=6;lZQ zS%Lz?h{AkS;-g}vtY^N&Lc)A476nm+Tjak8n}Tf>9|Utj29qjP1S3kY>W55gw@)5a zEIxUSd5i2~q7FqZZ^YIw3t!U*^c$AZ zqZhX9ul!De(gzP7FscV~JG5WcuztOjKZrGBWJd2dhnsEwB!PYVWqI}*PlHBaxlj7= zK|_1=9`t6`aAm^F)Zbk(=+rx^h3It>>@fTA$#dQ zx}R>K2k1e1i0+{8)5CNtJx-6%4`>lRM*XL(k2<`qi+C79CT@Evs>blJ?fY|blvLW# zPBoHBo8Y6QXj|^gzM?`%Uh(ld+tTK>vQ!MMzGB(7l%=233ZdJoulTcK2x3jx)}!#O zUxoehB-SrC-VXP^Z-MJqUfPYwTU;HO<11#%SDdK38L0K* z*T_w)Pe~EtPNi@ri#&<#5BDS6S%vLk&O#CmO~;cceeXchkVLsuemRFb(OxxPN{aM= zK_rMi9$aq-ndFvv8Is&Xgy{E&lFd}|vHnexjC6hWCgPOkx??3@@Y+~XS+75mJm963 zI#zD3n0UR)cyhgBkQ_8oZ$61UbX!$9q7wC-sbq&SeuEi?T+?TePZ|Qrw2y$_Z?T z4+K@(M#9`?Q5K|aCx_iUmzg<-V>VI&hg%EL{yiDdp)_oFBZs>FGlLx-C?JPo{mCug| zU58J7ET#TNw`mcyCYh-3h@cmeUMn<~1s}VwIs3KwMvcFnc-4?{ZOYg9+Jj1a!Ht$U z&@J88iu%S$3Xu9Sp@D06<2-iwYl_37A$f(P=#v4iI=hdo`FIp4_;ZAQ}w z5>~X&nEp|ArqNUyiw~69@VDt*61KM##GIhJ+x0PHX>)%vUq3K~PK>ZF_a{NwPvqb~ zMYH9RkkD+6J2-8oaoYr0882E`6}zyrR7Ii9UcIFz6gtV{W29F*Hh>zH^XwH4M9CsB?-q&ho5vK`pM>SGVITamy3{3C5+ zTto)gtu~|<`9)$LGazNpD+l*3Mg_Sr92UX;x@|D7GLeHXl^0Q)+0_ zsAjvRh1C~j7Kjof_!neK4Q(~hWk85M6A4jGi?v!QiZa_6%fal#5o8a?^=!Uv4h^?SB33Omg9eT;ojelU(>$FcYx0MK%)enh)_PJ2Wa>6^Pv*|2$`b zFqv@p+XLc--7gc#an0mtdyv73F&<9P@=${Zf?ds#aP?80?YeuSF&J{08FK6Jv)i<= zOk9tA(C$&Y7P$&p?26qVwT%xUwTRkErE*WPWmYu|G{|DxD5tDqu`Pq9OX*RvO{dG~ zVBUVObk~qO?q0OFAHy2kVP|u#$bfUZ%?&SCgHGP94`iR6dQ2g;P_h-CTulqz?xrug zoBGGAX*(*HbYuT&xsE;>PJY!}#<9cINTKfkFIJi1God9L&AV+sDONu@ng&(}^{b0x9Xl`jZDxwKL1cExfQZYfC5VaHlhCLucvG zv76t8JVNnvtxLz!Q z$?bIBE9_Ml(r}=!vPd~@%&Y7N@|W({l~wVj`KA4v(3M8l79nSL;BZFg5tzCY49&!myL zXq;c7+Xt}2B<7qknu6XyylAd8kV-Kg8nT;{RJ$L5dqeZ= zF}A<-p+ngtN*=<{H`ySx&oAF(`^h6%F@ja51toBB1bapzLh~L=XwC#ZXCym78Xqk) zORttGc}w7K8R$$HJ(|5KE&k4E7FTNVru--A5dSv2CylAn7SBo}a^WNv4BwAqK`vZjV9RC?$y~7Ju*eSH{CStX)iLo9QtF;O9M+zm^&<4# z=PVTb#sY z$?Q40Eno6oGc3%#qbk}#B~!D>#RY{K4qc}(@S9@DjoPN^52i3YaTYERgSu~uP z#+uU4%W|PVGo96?);&v60(L}6Gi`HV>`YcW+gl9(w`Fgk7nBjYH}pbVxxz>n%DwA( zH~ELMx!uY&bNDRQ!6nlK_;D7qdYVmrxH^YLK)2a!1u0y(4ec^w4oi~F&*ZY2Fl-KP zGfp9g!MZu@3kjK?iwB@ROJxgVRaNJ*p0bSf^&o#Pv)dN0MEbQL+eEpGYhSN`Q*&92 zYfdnyS$G>%>O9=v&M$FJ6w{VIn8&t|>H6qACW7da0trlWkz?pQLH~Uv`$Ujg`uVl2 z2B*iCz+XkIO6Z9tIIdjUBV5bosU><+G0S9)3*=UTE}@4%;jGcJGd(IF$`#EX?%|d^ z`~WU)W(lD)jpku^L~zBbvP$+_y(S~I zp*BS3+5^kLyxW#57XjJI!bkx`Y-IyoB8-$XqBlLg1jsgYI=)&AlaDY*FdiByZ6@b| zIknDR#;Nu0Huj=yW2|7sTbUokZO2`8#vVAi-K~uwA9U*un zs|2u<<<{ILPuawG_E?r(H<@8i=bH%~R%Ews8+Zi~0Y)5_ucr z_A*XvP8Ba#>qeP{3q`o{T3vIs?DqffCX#Utr%z>p8oT}FD-PdSa)bdXO-|M2b8xQMv@LyOx# zgyPfecN|b(dxm{!c)i#?5q5vbVx;r&@rUdQn(Qsn@^**gmrifwA8LKXs{6m=+`ba1 zFZ^^K7vkX`u?6&-La?021=*A&GWlFc`4M34dG;iE2hN^nE%d9Ovi8OnwxN-mZs+9-4 zhKFJFv2pOJ5{GuO04z6IjMXUFQDj{EARp@8#EJVj+18=g3gFsJR+Zi@9l7Z@th*;8 z7rtSw=pXqI_bqEeXB9xVZ*e=s75XvSO8O3$58MzD90OV3F&W&1pF;4!x9U6AGI+N1 zXpoEAD8;rGZBf4d$9F81xCX2RJ-%nbZZQo$%mqyU9_iUos&2eMb1|`}PNJfO!H^9%L{aOIi?y@v8 z3y$1Ha~{7OzPZbuCsQHy9SN37H1_{$P=0 z23-7u?ZDPE9-;|&Xe2Bk5-sNg*H)_k{E)?n2&eZ!F-U0lce@2e`V*8B?s7w!_N^k_ z(7GzG9p-dHVm!j$=!Ohcx#@;PdpIZ;pjhRVkc27#z-{VXKvYKzHZEm_QyMx*zWY442GY z$`9u2TLSr2LJ#G`92<9p9`kN-JRj_l{0Vr?#x2m&f*6$3 z%ZMo&yJ+HI0IeIw&IhRvKil`AmUy9#e$BG9)~;rmQ@ zD3rndm4nx(E0#fYJo4z;>-0C``C3V}9#V}z%M8_aM#t+>O|HV=1U_A=_F)1l&aGNA z>V>LJs=+52sx?};$u(P`YO%#U7+aH{p?42LyIQ=D6rsVKTZATaD8dSutCPszaWNMG zCle6?5|mWOlOPiT64a*-uV-+N0lO%DOA(+ zh!J*Qn-O~Hg0C2X)BPLpQ-rkWro8mn3L}D{(O=RfL5LPF+>{Jg;$~HS3{jH{3SQR1zmVEJkfpDg(s0E5co2m zOP1)%U*=Ppt4Wyt^lQ8ZdGYZ~;b0h0y?Pj*j}86Yl~8#l;9lCdAA?=p_#CnnTEET* zN@kI+M959&M(_%cK3B*xINhBuqu;KEfj#)!^7-E$yhcTFvT8kfK3%Xz;z-3C1nnAe zMRbf~XH+_GMGFjQ=?MAhd=^=**XYF?(Q@a#f8rJcwF~<2@dOb>_T{f~d=AOvM;WRz zHH$xEF}xi|JUR{2FoMcYkd@G85Z@_fiZ>Mpr1c&djJmzNL6RH|wjsQRr%n>!?IHYN z1)S>bhw_QUR#ZmXMTg<~F#aPR^UeNIX=$`DmujdV?Bt9&FB^#)(lU5<6mLhb z70P;ze)%3;z!78+P9ldkqxlo`p)pb_yf>OVWYo`qsBiPmWIA+vn}6z?FReKs)B<;g z^GN#hdZUHDa10L=eZ5t1q0Ak~#4<=B1?Ai_g=6xgQnR?a%3drhX;=E91pJc3-7cwQoRAz&JB>KZN_ zdQRg%209Ik;Q)9QH4VB==bwmmQi`BW<&hZMHiy9IZA*^m)G|MP`f|gRwLl2TwWJDI_C05NL9DFd|rl5W%8Gm%IVIdqCu*h5C00!aRdCc-=&3?DbqQlK@96#?vtx2=(Q%c@ zA*GUQ7LO-Pr{wxvVKq>4v#+qB{-xu>6kVjzE34tKE{uyax$En}CBn|hDm{6xI3)KO z{oX$Dj=6D%!7~^6Vn{eB;v}fmLE%gAma*d@@iCE@a3`q*&mIxu;1_>$nX`r?9Eu0K4=|Ko!LojT2Xs2$7Rh?c$C zEPDr9_O`U_ji`ACDlLEPMe(|uTjK=UG7%4SK9>w9N`LW^By5c&ths*t6Wq-7BOi+^ zgsjzW5>Hp6u!mH_hGBAYC{YHT3$1A*h_ys9J^w_gA9V`G-NAR-Hc2Q6Nl=ore zlK%eZ{G>m@1@k)|g^%^$q3e9XIA{4`J2O6fL;vDCK8S`nArT&shbQ!2xA-%{C5Uh+ zxr5HB(}!F@iUEG+qpcfVB*RR8gP1G!kl8kBo1vY-j!^Ed66O^S~q|`HJB35o6{Fv z4U#f#d-MyDq9lmuFzZRNJkrSs(Jo6yj6S%C*>wG13E~RHk*d@bTiqscv!=+BbEZoz zIakbSVH(P-60|Z=q)JLZsUrepe|+|ZcFAIqD3RDgX&mdj-yc^Q!=HlbvzHxjRqqmbPQg|bCI+(>+AEftw)Ert+MtiRPpbR<#@ zZAB7_?m=7e25O;qJFybGs_n%yr4qYLT>?S(21n`EUQ}=5lo-{fqQ_&;tUz#vbns9u zqvce~Wp2OGwgvXL7h1qhr~KrGvIi{Bi^j-e%jZQq%&wgOJT3&q(BuV?<+h#s28a3! z;usP=wu6WwTVP=a@e;i?5WepqCYlL>x2YZT$5QEC`NZ_T_AiQdaIT~1`iP!vqb`ebixKONCt4acWD1$a#L?7;>g$;n*mqpcxuuKQK z?An0LcwbB>2|&~GX<_w;;x1w*rjHvXKk$1+>`d^tSa6T_lc`~<7Lr6Kk$mMs_>ugB9vI+%kE;>V;F$`J;e0L0O@`r<(g=TX-D@mLczvOniFLj$Fw@T0)pi2ry%=pV*Q}0` zvr!-2OLPt(7xc4PqCX9KDDwtOoglr<5D`X*Mei|G$=DMF^x`MS8T`imM4GKneZ9aB-gy2EU9D;|YZ~-xBWy7{oq@GW6H} zgz6(jHLETOlr=)rH^M6;MV-JoIan1Rt7SijVR|1}Fj6#%bl0`Csus=1fomc1DPThn zkyup3D;F5B#jadW?Pn{w;Ls1S4l3c&lYvFee65|(}5h7 zVawaJ0d~Snyi^*64-EY}NkEJW z&QvGRX4cv;`@&rto2gBb5^#=+Notw#7K0UoUT+>Gz3)UCOazr-4AZOp;LZdQj*4}% zilYR|QDi27-GAXE5snFUNO){Kyf9wagJK;>I`ZT2MXlH^@cIN18)4E#Bo8L(1U8Qs z(TPZwDaMM(npcJ@Co!mCFB+izco7zDH?ka^4M%Nlr*5sddNWsEI{tCcGo6)-$NVb?)z|DK@C_cTrP;5ag&& zLi|J#!KK`x$wbi<2N*q3RBnv>|NnqtWA16HC&P9DA59ch5zlWEMV!G?h@YD$w}#Uu zi5d=5!wROF+G8a*es+U1%)C_Wv9??oKS^X{8)9;revveNZMrc{F@;YW&1Djg!cCyp zFb7Z0HQQVX#Z?*Wt`fY2ZARtM2-gAyUvOc;mBO|DYQ7STze4Yk(7Sx{qo(grgUXD;Aj(Wudr;I<4j{%ius$S*H{+57Y;2IVN}}-{pN~y zkrp;j{F@wx{_{ivSpf6ri8Q}=w@4c7wgqr$p6L1d>3<;U>OYXQS0>@R8Msikr03;{ z7YPdE=6vxSKB4wPQ41ek7m6y`Gyh@af`1sf$bkQiFbp`uwZB4P1#4wVM+N$U*o_`i z(?ud0J_peq(@*jJL8)W;e1WL04_z#dm#JD$3y#8r0`Xj}BE#R}8ah&FZ&5N;#HhlR zM!SrO%%u?9Rv55ER3j%~-V(9c>U7kMM(C-fEk(#N=&@92j?$AQ%GtCI@<;V!$eoVi%R7{hy&Rj08;iK&eL*ye@pvX@jlb!LeVv%T94fx~j@0J07yvQFK z@c)g-pIj*>pvc#+L~nGV{^BZ8Nbvbvp;%6RiX~698Q3?7c>UlS@w@b;cdrwj-7fjJ zTsq6K>%}AVwqrMla8eeeKV2jS%U+v`MH))of1PAxamgmGM*Xqg&V~f-zxJr zN!g%pYArl~&Va`2rv+id+IOM{wKa1{9 z8DE1z0yan$p-1G?$@&zIg$2ZL4UZ89z!9jSZ~BXffZ6v%KGeA@es+l^9G?D7RMorP z6Bu@PO3J8OTlubx>B)@=tt^#JB!~}-Ir53^*nLqy+&RmrmV@`B#%P$+kB5-^cwX5G zeedH5?!=l|_XWkvSERi*?0JA`Va`Fq;MxORkqkh6c;gQ-CuX%VXPs0RnD26~+SckJ z55+j*6w+X_9_U{pv)qlT_XI5)qC9#O*>NwAcgvK#<6$%9>@mNSsFe+ax+~kUyL|O;hxKm#_hra@Bz`4J7o@BA$!fhTQ5(4g6bqK$L@?xjFZ|#XRa;>A)U=$| zOzkd1z-aBYWCQ1g-ZiE^*M7Z}cz{p&NS!wor=?xsH#thb{^cz`3^NYnYG>D4iV9`& z)O(SuHOUU02sNDHHB6+hdYWSN>W07i6h4A1>Ug(lthT5(BfZCUjRGC!@uQfq5T3^= zp*QyEmF8oJT_%}n3-HUDm}J&_0slmzdU_%6idQo4F633*;req2cm! z2Pz;J^L)afc>({nT;g!q;Jvp}9wSb3k;SN^K6(jH@p0umNO#yn#YOtjLjDsAaOMj# zEkUL{99YZ$pxbuC-gOv9b7uv5$l}gAE@S}pxAhn%!-)Gc#k?Q+1lASvr(CHLp>`kl z4v47|-xRx3B|^MYC1T;}jocdQ%!}~+_F(~Z-^l+>^Y_5wEA0u*XF@R9pbe-CYU%SyS#N&f8YJ%NXGt zc93`fThe?F;cbdrRv7pjBV&F)9>zOQ)O?kr{5{nCv7@|!z9B#j;!)1%swj=F+L;4$ zA7<(w+0@3ob&~jU}#)heHCWbQQLwoUJZdA zwbgq1;v{tnfjYI+s?ahSTVG06>p|UmYIPW!taepL4Qn)LKp*(Fp1Krf*wq9WR!{8< ze)aGTk*C6l8frLK@Si@ThN=>HD@lC0Q4Zf43qY>+MLCKR(TJbu0&Zl$#)O**^z~NW*6be9C^&SYKOF zvXvyPsN?}ShNB|DP3SI!OM)8WM-pT*KtdFy4VIg`>T|Fx2RMjNj{)2ac;j(0mW@cg z5Z%VIB*;YMO^_e{#D^UC8P~ve6u%s}Cq6v~zK!i<*_41O$uj*rVFQz+Ttpx_eFHy| zQ(L%8Wcc(%yxdjxM(pkne>PBG&Nj#E9pR+6o(t_~ShnN4S>G1l(KwW1tWWZ&Z|ABv z+qHL#}k3`JU{WxkGWI!ZI@HMo^6Jo&?SCg3rV<((Z0Q3*SozP?V7ph96TR zrlbr>PVaDhe(Tido))lppD$rqO2}NcPNU6O zv7CgJ5CNA<|cc*~X- zOk+tf+-{;qk&wKOG?auIzdJ<2@@CV>gz$>`;SUi-1WJ6p2Bi1TNbZqbKUMGFR9({; zb0f(XHR7qkL;DTHAM+WJF)T6BHD+RBi>wj-h7QUan2|O7Um5tLJ=kDS7HnClR)(HW ztM=OIDShf^)a{d+)GM`aN=8O{3;Cl#83TI{9K6x|^`K489}n70>cD|?+}zrXQiJiU zM6;n;hMECKM&TJ@D`@@H=8!a64aPWyqrciSB&Ba^pN!P>)U=eOJ}JHW^lq^owvSd5 z$PV~yw3?#NdRy&RNli{m`pJb>k6xh8AfX+4bbY>lQjer=(>xNK5LQ+8`w*qYnsBUxIrJk(7Jj18Ohw zD`bK?J@_}``Qu0T$xAR~7jC>Y7pb))elPz^NDs)%uwtLu5LPcztAzeh?q`u6!sSJ3 ze$~FcdZ(tPr>E3UZP*~aK~jSje|r5|(qAT?58qX*;MXmGdRHCIa%d-syaB9QtX8f* zo_hVB(u8t9r}PeXKyn*GT)rA>o9Ow|N|We(NScR=nX^RogIWb@7MTn=8`bXcdx09w zrqHf1q!4>PzeJ74jO-yx)O0qDc6U}R_{IPl?1;Rk%!jlFcsD%4a#ois!(%73wV5xg3$? z($}5C(iLhoHkZEYl<@U@#5RwjLXb|q*9vtgRnwAF-=%p@#%`}vW1vw1j+<1d0_i5( zRfd1(tIuHS9+KW212(yP)Tbd}w;G2Tb;f`tyK%r}G#$?FQX7NM9^`X5B<@kuF$9E- zyRns2gYiw#0>byIF?h^fu}ZDSQ`71eLgkfe7ufrr8ja~3QZle(FIv-Tr!*4x;rklr z7(3SB`&wwW4@p=D$JeNJF#ux7tmj%BeFHLpQ*#(x+or1U!&)^4zcRf60(Ph~V9s`| zDp-eA#k4cLUW7E>TZbcV1lxLbD%k}4H=*nIXgvUz3TO;*Sp0BQed+s zT^6XNBUdNrvvNX3fqe@qVtEOA=!11Nl%1q)%hm_O4jq{}<(zm7OkM{~Fel zGmulFzQq1RUnq+%1k_z>74{*0&RO4Vmzs#*RA07F?MBYQ!+mNt`-r|KVQHZ6SL6N9 z(*lBvV%_AraD9;)>73<16{;i11-PkH~?wGN*34BK3?8Wr`4^F0DB`2PUC$7iVk delta 20449 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

    ); /// Unsubscribe from new head subscription. #[rpc(name = "unsubscribe_newHead")] @@ -63,16 +63,16 @@ build_rpc_trait! { } /// Chain API with subscriptions support. -pub struct Chain { +pub struct Chain { /// Substrate client. - client: Arc>, + client: Arc>, /// Current subscriptions. subscriptions: Subscriptions, } -impl Chain { +impl Chain { /// Create new Chain API RPC handler. - pub fn new(client: Arc>, remote: Remote) -> Self { + pub fn new(client: Arc>, remote: Remote) -> Self { Chain { client, subscriptions: Subscriptions::new(remote), @@ -80,23 +80,23 @@ impl Chain { } } -impl ChainApi for Chain where - B: client::backend::Backend + Send + Sync + 'static, - E: client::CallExecutor + Send + Sync + 'static, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error>, +impl ChainApi for Chain where + Block: BlockT + 'static, + B: client::backend::Backend + Send + Sync + 'static, + E: client::CallExecutor + Send + Sync + 'static, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { type Metadata = ::metadata::Metadata; - type Header = block::Header; - fn header(&self, hash: block::HeaderHash) -> Result> { - self.client.header(&block::Id::Hash(hash)).chain_err(|| "Blockchain error") + fn header(&self, hash: Block::Hash) -> Result> { + self.client.header(&BlockId::Hash(hash)).chain_err(|| "Blockchain error") } - fn head(&self) -> Result { + fn head(&self) -> Result { Ok(self.client.info().chain_err(|| "Blockchain error")?.chain.best_hash) } - fn subscribe_new_head(&self, _metadata: Self::Metadata, subscriber: pubsub::Subscriber) { + fn subscribe_new_head(&self, _metadata: Self::Metadata, subscriber: pubsub::Subscriber) { self.subscriptions.add(subscriber, |sink| { let stream = self.client.import_notification_stream() .filter(|notification| notification.is_new_best) diff --git a/substrate/rpc/src/chain/tests.rs b/substrate/rpc/src/chain/tests.rs index 0bfb29fd5d5c5..c2788a9324f1e 100644 --- a/substrate/rpc/src/chain/tests.rs +++ b/substrate/rpc/src/chain/tests.rs @@ -18,6 +18,7 @@ use super::*; use jsonrpc_macros::pubsub; use client::BlockOrigin; use test_client::{self, TestClient}; +use test_client::runtime::Header; #[test] fn should_return_header() { @@ -30,10 +31,10 @@ fn should_return_header() { }; assert_matches!( client.header(client.client.genesis_hash()), - Ok(Some(ref x)) if x == &block::Header { + Ok(Some(ref x)) if x == &Header { parent_hash: 0.into(), number: 0, - state_root: "0c81ab6cfac8c8d7201d78cb699b6b79d714462a4ba00abcacce22444babe315".into(), + state_root: "0d7ce1cafdb5ff10d3445ec13cd1412bb1232179cb16e5cceb878aba8c28fa50".into(), extrinsics_root: "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421".into(), digest: Default::default(), } @@ -69,7 +70,7 @@ fn should_notify_about_latest_block() { // assert notification send to transport let (notification, next) = core.run(transport.into_future()).unwrap(); assert_eq!(notification, Some( - r#"{"jsonrpc":"2.0","method":"test","params":{"result":{"digest":{"logs":[]},"extrinsicsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","number":1,"parentHash":"0x72ae67388233893fb4594f13df56d4e654aa8721763bcd0bd4e187fee7b2f349","stateRoot":"0x2e1f2f1c53ffb1767fe1abf4fe5953cc87c7650d4af2d4393d1f72324f2cc5d7"},"subscription":0}}"#.to_owned() + r#"{"jsonrpc":"2.0","method":"test","params":{"result":{"digest":{"logs":[]},"extrinsicsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","number":1,"parentHash":"0x27a851b5c445924dc632cdad76c6eb292e75f4992972d36384e429b41c057fdb","stateRoot":"0x643016ad98f8d9f15ef06c5bfaf98a934873684d60729dc3ba738ebe0f6bbb19"},"subscription":0}}"#.to_owned() )); // no more notifications on this channel assert_eq!(core.run(next.into_future()).unwrap().0, None); diff --git a/substrate/rpc/src/state/mod.rs b/substrate/rpc/src/state/mod.rs index 9fa41d38a14bb..4c68beb507d9f 100644 --- a/substrate/rpc/src/state/mod.rs +++ b/substrate/rpc/src/state/mod.rs @@ -23,7 +23,9 @@ mod tests; use std::sync::Arc; use client::{self, Client, CallExecutor}; -use primitives::{block, Hash, blake2_256}; + +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::Block as BlockT; use primitives::storage::{StorageKey, StorageData}; use primitives::hexdisplay::HexDisplay; use state_machine; @@ -32,65 +34,67 @@ use self::error::Result; build_rpc_trait! { /// Polkadot state API - pub trait StateApi { - /// Returns a storage entry. + pub trait StateApi { + /// Returns a storage entry at a specific block's state. #[rpc(name = "state_getStorageAt")] - fn storage_at(&self, StorageKey, block::HeaderHash) -> Result; + fn storage_at(&self, StorageKey, Hash) -> Result; - /// Call a contract. + /// Call a contract at a block's state. #[rpc(name = "state_callAt")] - fn call_at(&self, String, Vec, block::HeaderHash) -> Result>; + fn call_at(&self, String, Vec, Hash) -> Result>; - /// Returns the hash of a storage entry. + /// Returns the hash of a storage entry at a block's state. #[rpc(name = "state_getStorageHashAt")] - fn storage_hash_at(&self, StorageKey, block::HeaderHash) -> Result; + fn storage_hash_at(&self, StorageKey, Hash) -> Result; - /// Returns the size of a storage entry. + /// Returns the size of a storage entry at a block's state. #[rpc(name = "state_getStorageSizeAt")] - fn storage_size_at(&self, StorageKey, block::HeaderHash) -> Result; + fn storage_size_at(&self, StorageKey, Hash) -> Result; - /// Returns the hash of a storage entry. + /// Returns the hash of a storage entry at the best block. #[rpc(name = "state_getStorageHash")] fn storage_hash(&self, StorageKey) -> Result; - /// Returns the size of a storage entry. + /// Returns the size of a storage entry at the best block. #[rpc(name = "state_getStorageSize")] fn storage_size(&self, StorageKey) -> Result; - /// Returns a storage entry. + /// Returns a storage entry at the best block. #[rpc(name = "state_getStorage")] fn storage(&self, StorageKey) -> Result; - /// Call a contract. + /// Call a contract at the best block. #[rpc(name = "state_call")] fn call(&self, String, Vec) -> Result>; } } -impl StateApi for Arc> where - B: client::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error>, +impl StateApi for Arc> where + Block: BlockT + 'static, + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { - fn storage_at(&self, key: StorageKey, block: block::HeaderHash) -> Result { + fn storage_at(&self, key: StorageKey, block: Block::Hash) -> Result { trace!(target: "rpc", "Querying storage at {:?} for key {}", block, HexDisplay::from(&key.0)); - Ok(self.as_ref().storage(&block::Id::Hash(block), &key)?) + Ok(self.as_ref().storage(&BlockId::Hash(block), &key)?) } - fn call_at(&self, method: String, data: Vec, block: block::HeaderHash) -> Result> { + fn call_at(&self, method: String, data: Vec, block: Block::Hash) -> Result> { trace!(target: "rpc", "Calling runtime at {:?} for method {} ({})", block, method, HexDisplay::from(&data)); - Ok(self.as_ref().executor().call(&block::Id::Hash(block), &method, &data)?.return_data) + Ok(self.as_ref().executor().call(&BlockId::Hash(block), &method, &data)?.return_data) } - fn storage_hash_at(&self, key: StorageKey, block: block::HeaderHash) -> Result { - self.storage_at(key, block).map(|x| blake2_256(&x.0).into()) + fn storage_hash_at(&self, key: StorageKey, block: Block::Hash) -> Result { + use runtime_primitives::traits::{Hashing, Header as HeaderT}; + self.storage_at(key, block).map(|x| ::Hashing::hash(&x.0)) } - fn storage_size_at(&self, key: StorageKey, block: block::HeaderHash) -> Result { + fn storage_size_at(&self, key: StorageKey, block: Block::Hash) -> Result { self.storage_at(key, block).map(|x| x.0.len() as u64) } - fn storage_hash(&self, key: StorageKey) -> Result { + fn storage_hash(&self, key: StorageKey) -> Result { self.storage_hash_at(key, self.as_ref().info()?.chain.best_hash) } From 36c0b8eac2acfba27aa0682127976b3cfce63e07 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 5 Jun 2018 18:07:41 +0200 Subject: [PATCH 52/60] everything compiles --- Cargo.lock | 64 ++++--------- demo/cli/src/lib.rs | 23 ++--- polkadot/cli/Cargo.toml | 9 +- polkadot/cli/src/informant.rs | 8 +- polkadot/cli/src/lib.rs | 15 ++- polkadot/service/src/lib.rs | 131 ++++++++++++++------------- polkadot/transaction-pool/src/lib.rs | 19 +++- substrate/rpc-servers/Cargo.toml | 9 +- substrate/rpc-servers/src/lib.rs | 11 ++- 9 files changed, 140 insertions(+), 149 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 647b1aadd449e..a60521dfd7de4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -793,18 +793,6 @@ name = "itoa" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "jsonrpc-core" -version = "8.0.2" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" -dependencies = [ - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "jsonrpc-core" version = "8.0.2" @@ -820,11 +808,11 @@ dependencies = [ [[package]] name = "jsonrpc-http-server" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" dependencies = [ "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", - "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -840,16 +828,6 @@ dependencies = [ "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "jsonrpc-pubsub" -version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" -dependencies = [ - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "jsonrpc-pubsub" version = "8.0.1" @@ -863,11 +841,11 @@ dependencies = [ [[package]] name = "jsonrpc-server-utils" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -876,11 +854,11 @@ dependencies = [ [[package]] name = "jsonrpc-ws-server" version = "8.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", - "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1276,19 +1254,14 @@ dependencies = [ "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "polkadot-executor 0.1.0", - "polkadot-runtime 0.1.0", + "polkadot-primitives 0.1.0", "polkadot-service 0.1.0", "polkadot-transaction-pool 0.1.0", "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 0.1.0", - "substrate-codec 0.1.0", - "substrate-executor 0.1.0", "substrate-network 0.1.0", - "substrate-primitives 0.1.0", "substrate-rpc 0.1.0", "substrate-rpc-servers 0.1.0", - "substrate-runtime-support 0.1.0", "substrate-state-machine 0.1.0", "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1586,7 +1559,7 @@ dependencies = [ "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2081,12 +2054,13 @@ dependencies = [ name = "substrate-rpc-servers" version = "0.1.0" dependencies = [ - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", - "jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", - "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", - "jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-rpc 0.1.0", + "substrate-runtime-primitives 0.1.0", ] [[package]] @@ -2960,14 +2934,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)" = "70783119ac90828aaba91eae39db32c6c1b8838deea3637e5238efa0130801ab" "checksum itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4833d6978da405305126af4ac88569b5d71ff758581ce5a987dbfa3755f694fc" "checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682" -"checksum jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" "checksum jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" -"checksum jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" +"checksum jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" "checksum jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" -"checksum jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" "checksum jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" -"checksum jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" -"checksum jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" +"checksum jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" +"checksum jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" "checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)" = "" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" diff --git a/demo/cli/src/lib.rs b/demo/cli/src/lib.rs index 5d7fbfe0856cc..e80caa1e95d0e 100644 --- a/demo/cli/src/lib.rs +++ b/demo/cli/src/lib.rs @@ -49,17 +49,18 @@ pub mod error; use std::sync::Arc; use client::genesis; -use codec::Slicable; +use demo_primitives::Hash; use demo_runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, SessionConfig, StakingConfig, BuildExternalities}; +use demo_runtime::{Block, Header, UncheckedExtrinsic}; use futures::{Future, Sink, Stream}; struct DummyPool; -impl extrinsic_pool::api::ExtrinsicPool for DummyPool { +impl extrinsic_pool::api::ExtrinsicPool for DummyPool { type Error = extrinsic_pool::txpool::Error; - fn submit(&self, _: Vec) - -> Result, Self::Error> + fn submit(&self, _: Vec) + -> Result, Self::Error> { Err("unimplemented".into()) } @@ -102,8 +103,8 @@ pub fn run(args: I) -> error::Result<()> where struct GenesisBuilder; - impl client::GenesisBuilder for GenesisBuilder { - fn build(self) -> (primitives::Header, Vec<(Vec, Vec)>) { + impl client::GenesisBuilder for GenesisBuilder { + fn build(self) -> (Header, Vec<(Vec, Vec)>) { let god_key = hex!["3d866ec8a9190c8343c2fc593d21d8a6d0c5c4763aaab2349de3a6111d64d124"]; let genesis_config = GenesisConfig { consensus: Some(ConsensusConfig { @@ -113,7 +114,7 @@ pub fn run(args: I) -> error::Result<()> where system: None, // block_time: 5, // 5 second block time. session: Some(SessionConfig { - validators: vec![god_key.clone()], + validators: vec![god_key.clone().into()], session_length: 720, // that's 1 hour per session. }), staking: Some(StakingConfig { @@ -121,7 +122,7 @@ pub fn run(args: I) -> error::Result<()> where intentions: vec![], transaction_base_fee: 100, transaction_byte_fee: 1, - balances: vec![(god_key.clone(), 1u64 << 63)].into_iter().collect(), + balances: vec![(god_key.clone().into(), 1u64 << 63)].into_iter().collect(), validator_count: 12, sessions_per_era: 24, // 24 hours per era. bonding_duration: 90, // 90 days per bond. @@ -149,8 +150,8 @@ pub fn run(args: I) -> error::Result<()> where }; let storage = genesis_config.build_externalities(); - let block = genesis::construct_genesis_block(&storage); - (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) + let block = genesis::construct_genesis_block::(&storage); + (block.header, storage.into_iter().collect()) } } @@ -160,7 +161,7 @@ pub fn run(args: I) -> error::Result<()> where let _rpc_servers = { let handler = || { let chain = rpc::apis::chain::Chain::new(client.clone(), core.remote()); - rpc::rpc_handler(client.clone(), chain, Arc::new(DummyPool), DummySystem) + rpc::rpc_handler::(client.clone(), chain, Arc::new(DummyPool), DummySystem) }; let http_address = "127.0.0.1:9933".parse().unwrap(); let ws_address = "127.0.0.1:9944".parse().unwrap(); diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index ed59ec8ae10ab..8cc19b0f66e2e 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -24,15 +24,10 @@ ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" } fdlimit = "0.1" parking_lot = "0.4" substrate-client = { path = "../../substrate/client" } -substrate-network = { path = "../../substrate/network" } -substrate-codec = { path = "../../substrate/codec" } -substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-state-machine = { path = "../../substrate/state-machine" } -substrate-executor = { path = "../../substrate/executor" } -substrate-primitives = { path = "../../substrate/primitives" } substrate-rpc = { path = "../../substrate/rpc" } substrate-rpc-servers = { path = "../../substrate/rpc-servers" } -polkadot-executor = { path = "../executor" } -polkadot-runtime = { path = "../runtime" } +substrate-network = { path = "../../substrate/network" } +polkadot-primitives = { path = "../primitives" } polkadot-service = { path = "../service" } polkadot-transaction-pool = { path = "../transaction-pool" } diff --git a/polkadot/cli/src/informant.rs b/polkadot/cli/src/informant.rs index 8c5f6deca24ff..c5bbe0c2a26b9 100644 --- a/polkadot/cli/src/informant.rs +++ b/polkadot/cli/src/informant.rs @@ -21,7 +21,7 @@ use futures::stream::Stream; use service::Service; use tokio_core::reactor; use network::{SyncState, SyncProvider}; -use runtime_support::Hashable; +use polkadot_primitives::Block; use state_machine; use client::{self, BlockchainEvents}; @@ -30,9 +30,9 @@ const TIMER_INTERVAL_MS: u64 = 5000; /// Spawn informant on the event loop pub fn start(service: &Service, handle: reactor::Handle) where - B: client::backend::Backend + Send + Sync + 'static, - E: client::CallExecutor + Send + Sync + 'static, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error> + B: client::backend::Backend + Send + Sync + 'static, + E: client::CallExecutor + Send + Sync + 'static, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { let interval = reactor::Interval::new_at(Instant::now(), Duration::from_millis(TIMER_INTERVAL_MS), &handle) .expect("Error creating informant timer"); diff --git a/polkadot/cli/src/lib.rs b/polkadot/cli/src/lib.rs index 18c66dbc570ca..0d56f0d11e323 100644 --- a/polkadot/cli/src/lib.rs +++ b/polkadot/cli/src/lib.rs @@ -32,16 +32,12 @@ extern crate ed25519; extern crate triehash; extern crate parking_lot; -extern crate substrate_codec as codec; extern crate substrate_state_machine as state_machine; extern crate substrate_client as client; -extern crate substrate_primitives as primitives; extern crate substrate_network as network; extern crate substrate_rpc; extern crate substrate_rpc_servers as rpc; -extern crate substrate_runtime_support as runtime_support; -extern crate polkadot_executor; -extern crate polkadot_runtime; +extern crate polkadot_primitives; extern crate polkadot_service as service; extern crate polkadot_transaction_pool as txpool; @@ -60,6 +56,7 @@ mod informant; use std::io; use std::net::SocketAddr; use std::path::{Path, PathBuf}; +use polkadot_primitives::Block; use futures::sync::mpsc; use futures::{Sink, Future, Stream}; @@ -187,9 +184,9 @@ pub fn run(args: I) -> error::Result<()> where fn run_until_exit(mut core: reactor::Core, service: service::Service, matches: &clap::ArgMatches, config: service::Configuration) -> error::Result<()> where - B: client::backend::Backend + Send + Sync + 'static, - E: client::CallExecutor + Send + Sync + 'static, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error> + B: client::backend::Backend + Send + Sync + 'static, + E: client::CallExecutor + Send + Sync + 'static, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { let exit = { // can't use signal directly here because CtrlC takes only `Fn`. @@ -209,7 +206,7 @@ fn run_until_exit(mut core: reactor::Core, service: service::Service let handler = || { let chain = rpc::apis::chain::Chain::new(service.client(), core.remote()); - rpc::rpc_handler( + rpc::rpc_handler::( service.client(), chain, service.transaction_pool(), diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs index 8f808bc96853a..698415dc545cf 100644 --- a/polkadot/service/src/lib.rs +++ b/polkadot/service/src/lib.rs @@ -19,6 +19,7 @@ extern crate futures; extern crate ed25519; +extern crate exit_future; extern crate parking_lot; extern crate tokio_timer; extern crate polkadot_primitives; @@ -37,6 +38,7 @@ extern crate substrate_state_machine as state_machine; extern crate tokio_core; extern crate substrate_client as client; +extern crate substrate_client_db as client_db; #[macro_use] extern crate error_chain; @@ -54,18 +56,19 @@ use std::thread; use futures::prelude::*; use tokio_core::reactor::Core; use codec::Slicable; -use primitives::block::{Id as BlockId, ExtrinsicHash, HeaderHash, Header}; -use primitives::{AuthorityId}; +use primitives::AuthorityId; use transaction_pool::TransactionPool; use substrate_executor::NativeExecutor; use polkadot_executor::Executor as LocalDispatch; use keystore::Store as Keystore; use polkadot_api::PolkadotApi; +use polkadot_primitives::{Block, BlockId, Hash, Header}; use polkadot_runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, SessionConfig, StakingConfig, BuildExternalities}; use client::backend::Backend; use client::{genesis, Client, BlockchainEvents, CallExecutor}; use network::ManageNetwork; +use exit_future::Signal; pub use self::error::{ErrorKind, Error}; pub use config::{Configuration, Role, ChainSpec}; @@ -75,26 +78,27 @@ type CodeExecutor = NativeExecutor; /// Polkadot service. pub struct Service { thread: Option>, - client: Arc>, - network: Arc, - transaction_pool: Arc>, + client: Arc>, + network: Arc>, + transaction_pool: Arc, + signal: Option, _consensus: Option, } struct TransactionPoolAdapter where A: Send + Sync, E: Send + Sync { pool: Arc, - client: Arc>, + client: Arc>, api: Arc, } -impl network::TransactionPool for TransactionPoolAdapter +impl network::TransactionPool for TransactionPoolAdapter where - B: Backend + Send + Sync, - E: client::CallExecutor + Send + Sync, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error>, + B: Backend + Send + Sync, + E: client::CallExecutor + Send + Sync, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error>, A: PolkadotApi + Send + Sync, { - fn transactions(&self) -> Vec<(ExtrinsicHash, Vec)> { + fn transactions(&self) -> Vec<(Hash, Vec)> { let best_block = match self.client.info() { Ok(info) => info.chain.best_hash, Err(e) => { @@ -103,21 +107,27 @@ impl network::TransactionPool for TransactionPoolAdapter } }; - let id = self.api.check_id(BlockId::Hash(best_block)).expect("Best block is always valid; qed."); + let id = match self.api.check_id(BlockId::hash(best_block)) { + Ok(id) => id, + Err(_) => { + return Vec::new() + } + }; + let ready = transaction_pool::Ready::create(id, &*self.api); self.pool.cull_and_get_pending(ready, |pending| pending .map(|t| { - let hash = ::primitives::Hash::from(&t.hash()[..]); - let tx = codec::Slicable::encode(t.as_transaction()); - (hash, tx) + let hash = t.hash().clone(); + (hash, t.primitive_extrinsic()) }) .collect() ) } - fn import(&self, transaction: &[u8]) -> Option { - if let Some(uxt) = codec::Slicable::decode(&mut &transaction[..]) { + fn import(&self, transaction: &Vec) -> Option { + let encoded = transaction.encode(); + if let Some(uxt) = codec::Slicable::decode(&mut &encoded[..]) { match self.pool.import_unchecked_extrinsic(uxt) { Ok(xt) => Some(*xt.hash()), Err(e) => match *e.kind() { @@ -134,7 +144,7 @@ impl network::TransactionPool for TransactionPoolAdapter } } - fn on_broadcasted(&self, propagations: HashMap>) { + fn on_broadcasted(&self, propagations: HashMap>) { self.pool.on_broadcasted(propagations) } } @@ -161,12 +171,12 @@ fn poc_2_testnet_config() -> ChainConfig { }), system: None, session: Some(SessionConfig { - validators: initial_authorities.clone(), + validators: initial_authorities.iter().cloned().map(Into::into).collect(), session_length: 720, // that's 1 hour per session. }), staking: Some(StakingConfig { current_era: 0, - intentions: initial_authorities.clone(), + intentions: initial_authorities.iter().cloned().map(Into::into).collect(), transaction_base_fee: 100, transaction_byte_fee: 1, balances: endowed_accounts.iter().map(|&k|(k, 1u128 << 60)).collect(), @@ -206,12 +216,12 @@ fn poc_2_testnet_config() -> ChainConfig { fn testnet_config(initial_authorities: Vec) -> ChainConfig { let endowed_accounts = vec![ - ed25519::Pair::from_seed(b"Alice ").public().into(), - ed25519::Pair::from_seed(b"Bob ").public().into(), - ed25519::Pair::from_seed(b"Charlie ").public().into(), - ed25519::Pair::from_seed(b"Dave ").public().into(), - ed25519::Pair::from_seed(b"Eve ").public().into(), - ed25519::Pair::from_seed(b"Ferdie ").public().into(), + ed25519::Pair::from_seed(b"Alice ").public().0.into(), + ed25519::Pair::from_seed(b"Bob ").public().0.into(), + ed25519::Pair::from_seed(b"Charlie ").public().0.into(), + ed25519::Pair::from_seed(b"Dave ").public().0.into(), + ed25519::Pair::from_seed(b"Eve ").public().0.into(), + ed25519::Pair::from_seed(b"Ferdie ").public().0.into(), ]; let genesis_config = GenesisConfig { consensus: Some(ConsensusConfig { @@ -220,12 +230,12 @@ fn testnet_config(initial_authorities: Vec) -> ChainConfig { }), system: None, session: Some(SessionConfig { - validators: initial_authorities.clone(), + validators: initial_authorities.iter().cloned().map(Into::into).collect(), session_length: 10, }), staking: Some(StakingConfig { current_era: 0, - intentions: initial_authorities.clone(), + intentions: initial_authorities.iter().cloned().map(Into::into).collect(), transaction_base_fee: 1, transaction_byte_fee: 0, balances: endowed_accounts.iter().map(|&k|(k, (1u128 << 60))).collect(), @@ -239,7 +249,7 @@ fn testnet_config(initial_authorities: Vec) -> ChainConfig { minimum_deposit: 10, }), council: Some(CouncilConfig { - active_council: endowed_accounts.iter().filter(|a| initial_authorities.iter().find(|b| a == b).is_none()).map(|a| (a.clone(), 1000000)).collect(), + active_council: endowed_accounts.iter().filter(|a| initial_authorities.iter().find(|&b| &a.0 == b).is_none()).map(|a| (a.clone(), 1000000)).collect(), candidacy_bond: 10, voter_bond: 2, present_slash_per_voter: 1, @@ -276,16 +286,23 @@ struct GenesisBuilder { config: GenesisConfig, } -impl client::GenesisBuilder for GenesisBuilder { +impl client::GenesisBuilder for GenesisBuilder { fn build(self) -> (Header, Vec<(Vec, Vec)>) { let storage = self.config.build_externalities(); - let block = genesis::construct_genesis_block(&storage); - (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) + let block = genesis::construct_genesis_block::(&storage); + (block.header, storage.into_iter().collect()) } } /// Creates light client and register protocol with the network service -pub fn new_light(config: Configuration) -> Result>>, error::Error> { +pub fn new_light(config: Configuration) + -> Result< + Service< + client::light::Backend, + client::RemoteCallExecutor, network::OnDemand>> + >, + error::Error, + > { Service::new(move |_, executor, genesis_builder: GenesisBuilder| { let client_backend = client::light::new_light_backend(); let fetch_checker = Arc::new(client::light::new_fetch_checker(client_backend.clone(), executor)); @@ -299,7 +316,7 @@ pub fn new_light(config: Configuration) -> Result Result>, error::Error> { +pub fn new_full(config: Configuration) -> Result, client::LocalCallExecutor, CodeExecutor>>, error::Error> { let is_validator = (config.roles & Role::VALIDATOR) == Role::VALIDATOR; Service::new(|db_settings, executor, genesis_builder: GenesisBuilder| Ok((Arc::new(client_db::new_client(db_settings, executor, genesis_builder)?), None)), @@ -326,9 +343,9 @@ pub fn new_full(config: Configuration) -> Result Service where - B: Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error> + B: Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { /// Creates and register protocol with the network service fn new(client_creator: F, api_creator: G, consensus_creator: C, mut config: Configuration) -> Result @@ -337,13 +354,13 @@ impl Service client_db::DatabaseSettings, CodeExecutor, GenesisBuilder, - ) -> Result<(Arc>, Option>>), error::Error>, + ) -> Result<(Arc>, Option>>>), error::Error>, G: Fn( - Arc>, + Arc>, ) -> Arc, C: Fn( - Arc>, - Arc, + Arc>, + Arc>, Arc, &Keystore ) -> Result, error::Error>, @@ -452,39 +469,23 @@ impl Service // Spin consensus service if configured let consensus_service = consensus_creator(client.clone(), network.clone(), transaction_pool.clone(), &keystore)?; - let thread_client = client.clone(); - let thread_network = network.clone(); - let thread_txpool = transaction_pool.clone(); - let thread = thread::spawn(move || { - thread_network.start_network(); - let mut core = Core::new().expect("tokio::Core could not be created"); - let events = thread_client.import_notification_stream().for_each(|notification| { - thread_network.on_block_imported(notification.hash, ¬ification.header); - prune_imported(&*thread_client, &*thread_txpool, notification.hash); - - Ok(()) - }); - if let Err(e) = core.run(events) { - debug!("Polkadot service event loop shutdown with {:?}", e); - } - debug!("Polkadot service shutdown"); - }); Ok(Service { thread: Some(thread), client: client, network: network, transaction_pool: transaction_pool, + signal: Some(signal), _consensus: consensus_service, }) } /// Get shared client instance. - pub fn client(&self) -> Arc> { + pub fn client(&self) -> Arc> { self.client.clone() } /// Get shared network instance. - pub fn network(&self) -> Arc { + pub fn network(&self) -> Arc> { self.network.clone() } @@ -495,11 +496,11 @@ impl Service } /// Produce a task which prunes any finalized transactions from the pool. -pub fn prune_imported(api: &A, pool: &TransactionPool, hash: HeaderHash) +pub fn prune_imported(api: &A, pool: &TransactionPool, hash: Hash) where A: PolkadotApi, { - match api.check_id(BlockId::Hash(hash)) { + match api.check_id(BlockId::hash(hash)) { Ok(id) => { let ready = transaction_pool::Ready::create(id, api); pool.cull(None, ready); @@ -510,8 +511,12 @@ pub fn prune_imported(api: &A, pool: &TransactionPool, hash: HeaderHash) impl Drop for Service { fn drop(&mut self) { - self.client.stop_notifications(); self.network.stop_network(); + + if let Some(signal) = self.signal.take() { + signal.fire(); + } + if let Some(thread) = self.thread.take() { thread.join().expect("The service thread has panicked"); } diff --git a/polkadot/transaction-pool/src/lib.rs b/polkadot/transaction-pool/src/lib.rs index 2cf29872c21cc..862ef7f110ce7 100644 --- a/polkadot/transaction-pool/src/lib.rs +++ b/polkadot/transaction-pool/src/lib.rs @@ -40,8 +40,9 @@ use std::{ use codec::Slicable; use extrinsic_pool::{Pool, txpool::{self, Readiness, scoring::{Change, Choice}}}; +use extrinsic_pool::api::ExtrinsicPool; use polkadot_api::PolkadotApi; -use primitives::{AccountId, Hash}; +use primitives::{AccountId, Hash, UncheckedExtrinsic as FutureProofUncheckedExtrinsic}; use runtime::UncheckedExtrinsic; use substrate_runtime_primitives::traits::{Bounded, Checkable, BlakeTwo256, Hashing}; @@ -262,3 +263,19 @@ impl Deref for TransactionPool { &self.inner } } + +impl ExtrinsicPool for TransactionPool { + type Error = Error; + + fn submit(&self, xts: Vec) -> Result> { + // TODO: more general transaction pool, which can handle more kinds of vec-encoded transactions, + // even when runtime is out of date. + xts.into_iter() + .map(|xt| xt.encode()) + .map(|encoded| UncheckedExtrinsic::decode(&mut &encoded[..])) + .map(|maybe_decoded| maybe_decoded.ok_or_else(|| ErrorKind::InvalidExtrinsicFormat.into())) + .map(|x| x.and_then(|x| self.import_unchecked_extrinsic(x))) + .map(|x| x.map(|x| x.hash().clone())) + .collect() + } +} diff --git a/substrate/rpc-servers/Cargo.toml b/substrate/rpc-servers/Cargo.toml index 5f82e47a1b8af..036b14a974de5 100644 --- a/substrate/rpc-servers/Cargo.toml +++ b/substrate/rpc-servers/Cargo.toml @@ -4,9 +4,10 @@ version = "0.1.0" authors = ["Parity Technologies "] [dependencies] -jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } -jsonrpc-http-server = { git = "https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } -jsonrpc-pubsub = { git = "https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } -jsonrpc-ws-server = { git = "https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } +jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } +jsonrpc-http-server = { git = "https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } +jsonrpc-pubsub = { git = "https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } +jsonrpc-ws-server = { git = "https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } log = "0.3" substrate-rpc = { path = "../rpc", version = "0.1" } +substrate-runtime-primitives = { path = "../runtime/primitives" } diff --git a/substrate/rpc-servers/src/lib.rs b/substrate/rpc-servers/src/lib.rs index 05e4cd70fd9ba..ec3d2d6fdd98a 100644 --- a/substrate/rpc-servers/src/lib.rs +++ b/substrate/rpc-servers/src/lib.rs @@ -24,25 +24,28 @@ extern crate jsonrpc_core as rpc; extern crate jsonrpc_http_server as http; extern crate jsonrpc_pubsub as pubsub; extern crate jsonrpc_ws_server as ws; +extern crate substrate_runtime_primitives; #[macro_use] extern crate log; use std::io; +use substrate_runtime_primitives::traits::Block as BlockT; type Metadata = apis::metadata::Metadata; type RpcHandler = pubsub::PubSubHandler; /// Construct rpc `IoHandler` -pub fn rpc_handler( +pub fn rpc_handler( state: S, chain: C, author: A, system: Y, ) -> RpcHandler where - S: apis::state::StateApi, - C: apis::chain::ChainApi, - A: apis::author::AuthorApi, + Block: 'static, + S: apis::state::StateApi, + C: apis::chain::ChainApi, + A: apis::author::AuthorApi, Y: apis::system::SystemApi, { let mut io = pubsub::PubSubHandler::default(); From 621be3459caeb898f750a0067b24ec462a39d3b0 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 5 Jun 2018 18:19:28 +0200 Subject: [PATCH 53/60] tests compile --- demo/executor/src/lib.rs | 78 ++++++++++++++----------- substrate/runtime/council/src/lib.rs | 7 ++- substrate/runtime/council/src/voting.rs | 6 +- substrate/runtime/democracy/src/lib.rs | 7 ++- substrate/runtime/staking/src/mock.rs | 2 +- 5 files changed, 55 insertions(+), 45 deletions(-) diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 85bc248e2ae3d..009e5f2de0676 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -42,7 +42,7 @@ mod tests { use super::Executor; use substrate_executor::WasmExecutor; use codec::{Slicable, Joiner}; - use keyring::Keyring::{self, Alice, Bob}; + use keyring::Keyring; use runtime_support::{Hashable, StorageValue, StorageMap}; use state_machine::{CodeExecutor, TestExternalities}; use primitives::twox_128; @@ -63,13 +63,21 @@ mod tests { ) } + fn alice() -> Hash { + Keyring::Alice.to_raw_public().into() + } + + fn bob() -> Hash { + Keyring::Bob.to_raw_public().into() + } + fn xt() -> UncheckedExtrinsic { let extrinsic = Extrinsic { - signed: Alice.into(), + signed: alice(), index: 0, - function: Call::Staking(staking::Call::transfer::(Bob.into(), 69)), + function: Call::Staking(staking::Call::transfer::(bob(), 69)), }; - let signature = Keyring::from_raw_public(extrinsic.signed).unwrap() + let signature = Keyring::from_raw_public(extrinsic.signed.0).unwrap() .sign(&extrinsic.encode()).into(); UncheckedExtrinsic { extrinsic, signature } @@ -82,7 +90,7 @@ mod tests { #[test] fn panic_execution_with_foreign_code_gives_error() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![70u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -97,7 +105,7 @@ mod tests { #[test] fn panic_execution_with_native_equivalent_code_gives_error() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![70u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -112,7 +120,7 @@ mod tests { #[test] fn successful_execution_with_native_equivalent_code_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -124,15 +132,15 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 42); - assert_eq!(Staking::balance(&Bob), 69); + assert_eq!(Staking::balance(&alice()), 42); + assert_eq!(Staking::balance(&bob()), 69); }); } #[test] fn successful_execution_with_foreign_code_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -144,26 +152,26 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 42); - assert_eq!(Staking::balance(&Bob), 69); + assert_eq!(Staking::balance(&alice()), 42); + assert_eq!(Staking::balance(&bob()), 69); }); } fn new_test_ext() -> TestExternalities { use keyring::Keyring::*; - let three = [3u8; 32]; + let three = [3u8; 32].into(); GenesisConfig { consensus: Some(Default::default()), system: Some(Default::default()), session: Some(SessionConfig { session_length: 2, - validators: vec![One.into(), Two.into(), three], + validators: vec![One.to_raw_public().into(), Two.to_raw_public().into(), three], }), staking: Some(StakingConfig { sessions_per_era: 2, current_era: 0, - balances: vec![(Alice.into(), 111)], - intentions: vec![Alice.into(), Bob.into(), Charlie.into()], + balances: vec![(alice(), 111)], + intentions: vec![alice(), bob(), Charlie.to_raw_public().into()], validator_count: 3, bonding_duration: 0, transaction_base_fee: 1, @@ -178,7 +186,7 @@ mod tests { use triehash::ordered_trie_root; let extrinsics = extrinsics.into_iter().map(|extrinsic| { - let signature = Pair::from(Keyring::from_public(Public::from_raw(extrinsic.signed)).unwrap()) + let signature = Pair::from(Keyring::from_public(Public::from_raw(extrinsic.signed.0)).unwrap()) .sign(&extrinsic.encode()).into(); UncheckedExtrinsic { extrinsic, signature } @@ -204,9 +212,9 @@ mod tests { [69u8; 32].into(), hex!("76b0393b4958d3cb98bb51d9f4edb316af48485142b8721e94c3b52c75ec3243").into(), vec![Extrinsic { - signed: Alice.into(), + signed: alice(), index: 0, - function: Call::Staking(staking::Call::transfer(Bob.into(), 69)), + function: Call::Staking(staking::Call::transfer(bob(), 69)), }] ) } @@ -218,14 +226,14 @@ mod tests { hex!("8ae9828a5988459d35fb428086170dead660176ee0766e89bc1a4b48153d4e88").into(), vec![ Extrinsic { - signed: Bob.into(), + signed: bob(), index: 0, - function: Call::Staking(staking::Call::transfer(Alice.into(), 5)), + function: Call::Staking(staking::Call::transfer(alice(), 5)), }, Extrinsic { - signed: Alice.into(), + signed: alice(), index: 1, - function: Call::Staking(staking::Call::transfer(Bob.into(), 15)), + function: Call::Staking(staking::Call::transfer(bob(), 15)), } ] ) @@ -238,15 +246,15 @@ mod tests { Executor::new().call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 41); - assert_eq!(Staking::balance(&Bob), 69); + assert_eq!(Staking::balance(&alice()), 41); + assert_eq!(Staking::balance(&bob()), 69); }); Executor::new().call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 30); - assert_eq!(Staking::balance(&Bob), 78); + assert_eq!(Staking::balance(&alice()), 30); + assert_eq!(Staking::balance(&bob()), 78); }); } @@ -257,22 +265,22 @@ mod tests { WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 41); - assert_eq!(Staking::balance(&Bob), 69); + assert_eq!(Staking::balance(&alice()), 41); + assert_eq!(Staking::balance(&bob()), 69); }); WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 30); - assert_eq!(Staking::balance(&Bob), 78); + assert_eq!(Staking::balance(&alice()), 30); + assert_eq!(Staking::balance(&bob()), 78); }); } #[test] fn panic_execution_gives_error() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![70u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -288,7 +296,7 @@ mod tests { #[test] fn successful_execution_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -301,8 +309,8 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 42); - assert_eq!(Staking::balance(&Bob), 69); + assert_eq!(Staking::balance(&alice()), 42); + assert_eq!(Staking::balance(&bob()), 69); }); } } diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index b15128c656156..9a0dcf38d9b92 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -31,7 +31,7 @@ extern crate substrate_primitives; #[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; #[macro_use] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; -#[macro_use] extern crate substrate_runtime_support as runtime_support; +#[macro_use] extern crate substrate_runtime_support; extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_democracy as democracy; @@ -41,8 +41,8 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use primitives::traits::{Zero, One, RefInto, As}; -use runtime_support::{StorageValue, StorageMap}; -use runtime_support::dispatch::Result; +use substrate_runtime_support::{StorageValue, StorageMap}; +use substrate_runtime_support::dispatch::Result; pub mod voting; @@ -610,6 +610,7 @@ mod tests { use primitives::testing::{Digest, Header}; impl_outer_dispatch! { + #[derive(Debug, Clone, Eq, Serialize, Deserialize, PartialEq)] pub enum Proposal { Staking = 0, Democracy = 1, diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index 9b59449dc35c3..0b9dec8976c39 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -20,8 +20,8 @@ use rstd::prelude::*; use rstd::borrow::Borrow; use primitives::traits::{Executable, RefInto, Hashing}; use runtime_io::print; -use runtime_support::dispatch::Result; -use runtime_support::{StorageValue, StorageMap, IsSubType}; +use substrate_runtime_support::dispatch::Result; +use substrate_runtime_support::{StorageValue, StorageMap, IsSubType}; use {system, democracy}; use super::{Trait, Module as Council}; @@ -218,7 +218,7 @@ impl Executable for Council { mod tests { use super::*; use ::tests::*; - use runtime_support::Hashable; + use substrate_runtime_support::Hashable; use democracy::VoteThreshold; type CouncilVoting = super::Module; diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 75ea9408600d1..d6b6a4640f110 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -26,7 +26,7 @@ extern crate serde; extern crate serde_derive; #[macro_use] -extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_support; #[cfg(feature = "std")] extern crate substrate_primitives; @@ -45,8 +45,8 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::result; use primitives::traits::{Zero, Executable, RefInto, As, MaybeSerializeDebug}; -use runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; -use runtime_support::dispatch::Result; +use substrate_runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; +use substrate_runtime_support::dispatch::Result; mod vote_threshold; pub use vote_threshold::{Approved, VoteThreshold}; @@ -358,6 +358,7 @@ mod tests { use primitives::testing::{Digest, Header}; impl_outer_dispatch! { + #[derive(Debug, Clone, Eq, Serialize, Deserialize, PartialEq)] pub enum Proposal { Session = 0, Staking = 1, diff --git a/substrate/runtime/staking/src/mock.rs b/substrate/runtime/staking/src/mock.rs index 7a805a6c02a72..2a778b8f88740 100644 --- a/substrate/runtime/staking/src/mock.rs +++ b/substrate/runtime/staking/src/mock.rs @@ -38,7 +38,7 @@ impl system::Trait for Test { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = ::primitives::traits::BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; From a10bc64552dde8fbcdc53f962424ebe4c5ac360a Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 6 Jun 2018 15:04:15 +0200 Subject: [PATCH 54/60] fix grumbles --- polkadot/transaction-pool/src/lib.rs | 2 +- substrate/runtime-support/src/dispatch.rs | 1 + substrate/runtime/primitives/src/generic.rs | 1 + substrate/runtime/primitives/src/lib.rs | 6 ++++-- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/polkadot/transaction-pool/src/lib.rs b/polkadot/transaction-pool/src/lib.rs index 862ef7f110ce7..2c2224b5d3da7 100644 --- a/polkadot/transaction-pool/src/lib.rs +++ b/polkadot/transaction-pool/src/lib.rs @@ -70,7 +70,7 @@ impl VerifiedTransaction { let message = Slicable::encode(&xt); match xt.check() { Ok(xt) => { - let hash = BlakeTwo256::hash_of(&message); + let hash = BlakeTwo256::hash(&message); Ok(VerifiedTransaction { inner: xt, hash: hash.into(), diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index b19c12818ae6c..4b6c0a603efbe 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -59,6 +59,7 @@ pub trait Callable { } // dirty hack to work around serde_derive issue. +// https://github.com/rust-lang/rust/issues/51331 pub type CallableCallFor = ::Call; #[cfg(feature = "std")] diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 37156a3f96554..f2b33ae94ec3f 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -274,6 +274,7 @@ pub struct Header { // Hack to work around the fact that deriving deserialize doesn't work nicely with // the `hashing` trait used as a parameter. // dummy struct that uses the hash type directly. +// https://github.com/serde-rs/serde/issues/1296 #[cfg(feature = "std")] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[derive(Deserialize)] diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 20da96f9b70f2..e62f508f9dc1b 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -125,8 +125,10 @@ impl From for MaybeUnsigned { /// Verify a signature on an encoded value in a lazy manner. This can be /// an optimization if the signature scheme has an "unsigned" escape hash. pub fn verify_encoded_lazy(sig: &V, item: &T, signer: &V::Signer) -> bool { - // TODO: unfortunately this is a lifetime relationship that can't - // be expressed without higher-kinded lifetimes. + // The `Lazy` trait expresses something like `X: FnMut &'a T>`. + // unfortunately this is a lifetime relationship that can't + // be expressed without generic associated types, better unification of HRTBs in type position, + // and some kind of integration into the Fn* traits. struct LazyEncode { inner: F, encoded: Option>, From 5204fe444925e979548745c4847d7765bed1ad46 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 6 Jun 2018 15:37:33 +0200 Subject: [PATCH 55/60] test-runtime uses its own transfer type --- .../release/demo_runtime.compact.wasm | Bin 402945 -> 402924 bytes .../release/demo_runtime.wasm | Bin 436992 -> 437008 bytes .../release/polkadot_runtime.compact.wasm | Bin 419490 -> 419506 bytes .../release/polkadot_runtime.wasm | Bin 461033 -> 461049 bytes substrate/client/src/client.rs | 17 ++--- substrate/client/src/genesis.rs | 17 ++--- substrate/network/src/test/mod.rs | 19 +++--- substrate/runtime/staking/src/lib.rs | 2 +- substrate/test-runtime/src/lib.rs | 51 +++++++++++--- substrate/test-runtime/src/system.rs | 64 +++++++++--------- substrate/test-runtime/wasm/genesis.wasm | Bin 20741 -> 20404 bytes .../substrate_test_runtime.compact.wasm | Bin 24548 -> 20404 bytes .../release/substrate_test_runtime.wasm | Bin 26943 -> 22513 bytes 13 files changed, 104 insertions(+), 66 deletions(-) diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 5db5fb7445d1cf57228086c057fda300bc6389af..7826337c1f65ec7a1791a7faae5bae8c1745ca3e 100644 GIT binary patch delta 18018 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 delta 17997 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 diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index 1e9a7b26ab2d029f196e3a23dca49956832746e3..ad637520eb000264f9b25325b0f793c00db61203 100755 GIT binary patch delta 20098 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 delta 19917 zcmeHvcU+W5^Z4zvg$^g2il}g4BT=M?fFv0%N@^;Z@iI+Kow3{eIwAh%T1rpuPm{(?fsBD7*gRJW#?A;5$R{RE z()pW-QpbEkc_)>*`7!3lgq|?`Cs+-go(cReh|uW}g8wIi2@xQ{1plLYLro6^d&myN z^CFbg^rDmr0|K=^cRdk;%73*C_>bU6>-S)syg?c^f-qACnX06H-J<%oo{YC2NoQXTJdR zaDKVst1w^j@HGz?Gs8~grKRaiE%a;C@Tv1Mxwh};6)A2j73x+)U+eh{L=Inz`0}m{%RSYDdg7XP#?R^{90p z{`bIY8Tk)F{}1c%zadwxn*JMkyiA>`O*ggP;1BQlFe@dn6zA(psl83X?8US1em?bUG8& z&z8APm{(^X52Ke!NjB*sbjNJCUK00czIra0^z%|49#9)SO~wl!ZS-?KI-|R(I3G4e zk%m6^`r2; z25X$A^dP;e1|yS`tA^MHy1|m3WI)w8I9g-BbG6_|*w>3ZS2ftC#I99?ZTj<5PxdCW zeH662TkA+Txd6puNgNCxM)Yv-CDPFapdz3imz~o`l4gj#VVDsx%x$jRJY6{z$8QM7LhQdoVbYmtTAM1 z1Gc+B@e(pl;#e)K_X_fwdTc3qSrf6MGv66!s+wgc{r}VA;EwZEJFX&k?5B=OW)Kf( zCZ3SCjtqC8p0WX*WBc`_hHGCzrM_4&ZXgYv@g_PqV^z~e^0*o;Iqh%(OR~tbRV&_x z=&v@)COOrJjjPi}t-FatRWq9gU$=$4)!MM;khbdX7)-PPMKM6BP0C1QqknCdM?<5J z(OZAq>Z0G*dOVHP-ebY>{=ew)GX__TQg?IZ7tJ8Hcq-B4G+g#n29tvj>7|5`MJmP; zg9k=F7-LXI$_RMIpuFuR)!EgkG$qH>$wuY#P}%O+QF#jO>79Jrf?MxVdfTq;9i<^5hdK zHaw`zwo`OESE~mPDShor;sk=w!^-zI0V+Y}z?LJ*UK_ZJh07k6=~9j=Sc$Q^PiGK( zq}=u=o8j$C%66&EMwgYbQk%;zEBkQB0d3{OEi2y)AE?h4uPT2SzN&!GI7LFxCPrUV zcF9@-?DnK#YOCu?U14ucy{+hLx5$&Jj8PbC*w=a6QS7k?_zfD|-vPb>KDe)>815Ep zoal`@X@drQV3K4UOrKWL4ny)^%4wf%7Auvp0r~IrKq>bi*VSg6_La333rpE<)R#)} zkin~N>h||&08t7uV0jJ=f-9TobBdY)#?3TVjv$}Y1X!|}2Dqio#L0bpV0c4i8j<}d_A|%^ zR?`d+yPMWWG5hVN&nhb_G<0@1?M`Mx-9nsUd&Laz6e6WLkY7lnl!8nsE2Oo_T=iZd zJ*arj)&%f;M?Vif+(YYGCyE5Gz0}h|=q`I{7G~HQio=?=Q)y?MaOP2JAoJ9#M$8A3jl$0Az7tU6Jbi^MR^K{L_feni z(qW((l}@*axMbfYeJgyu%s|Qp+J=mpGonjPAw&y=o2j`!rk+ zhpD%nfNw9+ZOVJNTQ6JP++{qDE>%6R(Dw;$rsAs>Yu8*+(_D1D#%pwd^jex9UUm&P z0eaO>uG#%?YTQaGKpc8J>5NS7$wqE+OAg~Q7o{eKJ}^>Og;P}beoludF;0rFvLr8; zy294(9fA%w=qR~$_p2;8z`k`AtGm6L0pF?Y4jjHor>T8H={jo#Jpdku(XKUI=F?}Z z7lP?K3OmUNH}}ySVBuMAlGHyv%N?lOoH{7EZ_iM(cp#HU`=gdC=oF zh9#VHkh-SI+Z52tkOput_RaM)knAKOhvhs329%`c#Go=P)~nN^W+T#Wc@;G zs=uzI7l^vF9ODA6)ZsfAG|=sRd53P&Jl=O0eC!^NShay3@8EZI4v`Y2OANcdY#1mJ zVypmjeZaYonE_h-MHBd3>4#VCX0>H}MFK&q zzG5|Mm~^2`>0s2EN_EL5J&uqUN)YurV-VuWVnP3a&O+C3en4O9W9P%V<6PUWPGpT# zZ?%5>ejapqNc$+IE*zIUq%T=ztPta+NAz7X7j8YGbzMbNWB;ajiFHaNBZUe=&8#Nu zF`2(wVN)EWtpm9V>nyDZ#cvArDXU>sBK#Q4j40+P%7DyPA5xY@WOgLg1p7F9LAl|~ zrP@uf7K+uGq4E^z%oez_h)T}fRZ0J}?W)uQC#AYV%R9+fftiwz-IuzeJgJTQ?=273 z->SDrc;vz4>Bh+}_M@(@da{;Q9o2!SyjZjx@uC-d-U<1j7t2NDG2W;ygm3glIA%|X z*VGqn&kHRt%3^pB;=^Jvlj`TgA|(ojhy{Z`r&Gr+r2A*!q;>lVV(U$GT zmf;z;CD>`tpg&-i-Q%TSC&K{jXpa=u?2ro6bZdY{?d&?$LQ1c8thJK4Ln=H%vcA6^ zTPmO3+M_pIKNGgL$L(fOuZADeflZR|RUO#e|L0E7Rb^>MP$+w(xgX;4ZozfSEs8yC zSrUxHS@aH3KQ*x;cbSQ#e97vl8@jRI+;Ksd_h;icS-W>A%k?DNA#Wu6gX~Z@jbe?7 zl9L0UB%!;r+E$IxY+2(Rsa4GX4(pN|;xuVGzp7rhfRm%yBwVPruduI_wKTtQ3-It@ z^%}a`(&59BPwtRvZ#xQk<5&;$kN3y1j$|veO<~~{vVkx?1@{%oi;T)F4ZccY*GLW& zzrj}etd$~rnIb~HP5C+S@_05)!RHs_*;7?<6F33=s>ZAl=1xG9`n*DXcldrnMU3&7 z$hs-FE9P7>ku4_M)OwRx9R(@GO<~4LTgX*RSNpi1r>0L~GYQi1oXYAW9X0%I)<(hh zsCU=}g6&o_*iQtP`l&S56%RHO)7UAp1D=`5_DaEjpUH})OWivQ7k*owR7eoeciDKC zl?xZ46qO5b@LhJG3O%Ulv)R*%6h3nii-TROm>c{&mkmav=sJ&`am$tt$K(lz=VS02 zl+L0Jpjj3(JtpI26(rPHTfY|8r?V`X2UQSxdp>Kg?A#%H+Nt;FOFR8@4}>mcL*)8l zZ={wE?p(+=;R5zu#7@eLNn*p0#jJsHP#bFH=)hu3qA)Mhz=kDkAcoE4CG4Wy_ok(+ z0V#ygF)RRj&qrt6XEAeEH!o#_6=GH&E@#W-DlJ*b8m1m|+IG$@*A=^qRojXkTq@1f zzMq}z0T1^%!nQf>{FRO~Qasf{>?&k;Eeu(O{?4j(6}A2VmmG3|MZp4pnxJgm0bkU{ z!2XjzwWWlbQws{9y{y1G@W_A|`2o~d>iNR}8tJ(9ZU)*(x=SRZmF#92=*!l&Hu72N zZE;XTc%>$7?)Lr;xz6s;*FYNwU>-!24oamgyu7AXh!VBvO|-~wYSF8t01ns26c|^_ zI*}R>NMFIakUA}hUZGFi7_Mr!9=6(5Dgad8L6YH$gQ*iCxC*Q-*$B1P;9kmr@7G`k zw;~Vft+jZKfos{nl#TYb`u$p548-%=z`7_q@?qcx78a0iy~DK^5)1Ox1shlqA(_xF zgJHFEC)~(j;hGu0o56-!J39ZI~nmlr-E0O(^gpKv=z#oT34Jfzk&fO8z~j4 zl?v<%wUr7`p;#)2vF9$bKp@Yb@9bx%sq#1tx*cNkl>58k=L_iEemulFNfk#FTV2Pf z50Q9Yp&c3ute7=Hd=*jJDrlj}N7!ZbnH`U^-^q40;Unp2=c|K`W6Zwcv3mKT{6`ib{)4Kdd;7(9yOLq$JyD(QywwWL^68KyPvRrPiJY_AJG>| zaG0-A4De};$6jn8-Wr~40fhSD=DcwlPYS7@vh`5^4Ex<-x2w%QWp{0Q)EotNgu>ub z^udRZz?xE&90gQM+0)I7&{LZoQ6y@v%yj?h@$!)D$2SBHbm@ixUG+lT==|#4vu0{mMUSY}lO;%<~ zabBw5rM`IyXTz9(=Q4W=9b&*0RO(vw`7116)?Au=fpOZR{kqWM8XH7*16*TKBb+wB z&da`|T>4GUu6o}wl*YcpN}XEePA&A?Pkqi}!qP04ylXhJpC)ZRPAQe&@!sWveBu?* z^v_w{RBao4Z{60;vBNn&xH9P4cHQ=_@T%Kt?d#01DuuO$onNrVGJrVSr*_z5hQPqz8OF>USok|ju5~d> za~H)zt~Jg6i}H?`AU?x5F78_B$@wPbP7eIS`3x&+Ej3+msvxyR?tHOC3i9N8@KNf? zvx8g~%f3r68C~ebbL^aV@!=y-(p(>2kGgAFHNL40XZ5^tB8}eKvj%TYl)RbncYj_> z?c>j<67}+zjJYEh*S}}!Vz6^;agGtr(Zo6KILDT+93#{Xd}{@Yf5BSHt%t0mO+g8d z7{1L7eIKzd0WQMcRMv{*`j&dXvSVtqnjCZQT`H-~ zFVdd>qkO9`H=^(R1{G*#FG3ZgSE$aL$V(}Lm%dbA0L^3Z&g_cy(ty}&B<1SJSj?yz zSs=BH6_65%>vRp1rv4O1&lA8>^#FBeYZ_!dq8Z?eXJ{80Tbs0_{)D`zwr)>r5%NCt z?Lb@l?9rH_rV_jY*$d_l^eLY#*=6&jYSWJNPk(X<8Vsbv$RTysK-!eR;K8&5*#~O| z(=#Mn9X$ju_Q3E0?LiJe;tO;F`9Qt!0yR;5FQL{j+L7#mp~L8O9DR8h9YDy3YO|N= zkNAY35%gy5LmCTswVFarqs@=?MC)t9x z==ZX7o0#Z?179K1V~$47!FKR6m(Pn=53W`d1ni3QA7iMM|hrui1D>jVg_t zL*uIfdMreP!t!ho8*EpC_KH4y?* zfVROE%mutLUI||S-l=4(_kcE(;?!S@$v*PaW*v>QTZpDvn6VB~vS8CX+6T&h#qx{h zplU+j-`Ll+T{fOAk%z2D>=z_!{+lgCvU@_fAZp_Q{G|j8@Us{3IW5smc^>8RaMb)L zpG-EYn~(D62t?QAC0NP&t1iE)RkAMD=SEq{`m;W7gq5uN!Mq6P2fX>H1?9nfl#;y% zdWC3S6Xu5SE;#mV2tP%lTp4pd;Z=^bP!h^p6I4zZ?}rl&3gai0+&vJ|057KObvWB4 z4A$ZLG~igV{RYl7QPLQ$oE%+@|UT7>&BIH|`*OHGVs=C_FDwO5Plp~$8Q0h7W%o8%#(gP{+se2;ju)MMF|1!#_=G7g}9dkaV(_< z$MZm3&-i#gL^-+#mdB$+AKOZp)a0qXpmBPSdLo{`fvQvETk%x{&y;6c^E_EDnAXO! zjzw+wc3Ec})|Q81oe_F>;xz%<@}JR(&wqw@cT{(@vZ!GT@*u>Z*0cU^gZd*trl9VeRw6T0&kr5D4TBUV}l@5!^#GIDzI26`=? zqkAnQmck&Ef5ey6)LuEpx0TCf&Wb1A@MP1`d{}sl4FrOMq)|TH16la zmnFOhxvWN=;sY7h5a*uZfB8O^M|l&|QkD6iI>&p+KS1kqgV%zH^E_7Bz7s~C=Wj}?*UzKH*s1EQ zRr~CnYK_m(LX`q-SaXWuPr-G7x|C)wqE2V9^$U3 z+Q@$LM2v&NVfqd32A?4dU0nT~OWPsslUk{$pe%EG-3*UB(KmSqInTtKyt|y|@J-%P zGR4X&a?;*qytC}XYjXo!zr`CvX&Ki?RJLR}SH;B*F>RNc)}NM98uD+U^!xJdL;|7z zEgpa(YcYA+Enc5|3Ttoi2uGyOZUq(+5Plo;;$`Zqw|P@7qObXqw;%!X0Oyn(VPW~k zSNwg9bmp&lXR=bg`ZZ4_eLNa(K|iy~nDl`pU!WSN$97Q@rO z@o>))Y1Ohk!r;Rnczt;5H(sxU%Qmd^$FEM}*(^k#ElJ@*Z9A%7{0;LE6g2z~UWN~k zKeeTa`xBQ&?pzmJ#~z!xnMyTy^~PJK!K+`IyBhqTEREki-U%0@|2=JK=G^0nWVQP3 zJq$zmoc|a4F>(gpe8`7eGfQSF$IH*X@a02pmXJq$qzmNRN4RH8AmVS{(a%LyFyn77 z&*|#Ezxgj**;@d4O#CQ2)^jnI;-Bt<@DTEp2;DqHU2+yidx#$7A{2Ru_Yy2+oHY4n z^I^+(>l?|IH=t3E+MgXG7|kF~3B)h%$)=Lyu-H?`S>dFo2qvZQji=~F&Ox-7(8`ok zyo7c`g?VY7vO6DM@)ltMdu%mj+uJ{CzPiF&tS5mRwBrhfWe@9pT}Ptb*g<^xq}E;#tX{uOBjaR*moz_~ufnI!rG%k$M*` z6Fx*)qLm~Ebb!{YL^f(f{@#gYZTwhXpcndLQ$w_PA;jpL&X@X;6n9iBtpVm z*>PCmzS*GDQ7CLM_ z6*yPaE|H>$HP=cY_;POrJqrWw6+K=*wO6oO>+W?r3dYBZICXfeDD;$H6LRqN7oyhb zC?cr_g3mgOT$ulyxC9yPMK`$9Ui<-FI*WmD<9YEt(Sb2u)P~ep(NtBsqRpwTyW#IO zz>@BwDU9we!Zo6h_`C=}+)2-iWa!jgG=SReMPKaL-(7s_b~?dprC&r4Ea@R?)sG0$ z>B4n7T^FX)b;D;z{1E(j)z#@5!15jf!h zD*9nuPcfPp;bKpr1{dQD1_bYP)9E-qvyc9HDabXp3$R^Br%Sa1 zj^h9c*yOL%)x&2Z4wPE!iyw-gRP1l)&_C4LpNn{saU1?tYkw>34|nL#xAqT4Iu-q? zI^ALfNY0xgpqaw}Gk(XF)BTEs5*+$hTl;NF?HQocp-{TE_(W9QZsb-f-KN>z*e?ZX zj~}VomvLpJMzZi3hV$!eDv6RE*tV(8W*n{rY=lb@UrIh4Kay~tnij&#@G0ro=-#!q zUFpj4FuS*SG4*&Yoh}$he2LHJ@i_}WQs-A|qgwFE(CnmWLvb1;rdx*nUGe!heo$-n z_G6c}WDBLY!--3~9ATOf*a+USbl3-chiyj!-@CLgV;gz4<6pt=jtuQ_f$zmO%3{Y? z@p}Lop}iv$JJ2%ii)Y(#xaGACXIqmN$hKV67WhGs?l!iKvTg0}j^CvQ3$Y#L(BH$_ zKOOs}6>h<&56*8N*wcz&TVxwS+eA%pD+|Q&#wYG_oq|tKd=|;?__2)}i2afYxs@b? zHpX51qmW3dv=-ZjmL0Nf+t4p#I|SRgNL|{9t(}kUIBb_$@om;+Yk!NgHbD3$gi9uD zKIv6dix0NbuwTNLE4t@&^&L8L@Ox{Aw%oWfk0htFq`ko19(*p}msP-6h5 ze`RXK01-y~_4o@q!zbbo;v~M3G<-rz%A^|RXeF?wzrWU>IBwL4l&QnVj+>J5YEppq zYeB?djwS~7O46j7@=E~zWKb<%i9F)9#8;DIhR3vwQ-2sJ7B|7{JY8m5i$QQ`wFttr;>v2#i2`yo6GUqm0;rxfkP6~eWi5f9 z$BGc}T7z<}gZgX4YPy~bu*_FDUDWg3K(>?NFZ7CzY6YPSFlb*`BNpKcA&G0nUYdb& zFCB!O^;;*xJTu894KpDI&TSISV8=SK8H?NPXJh1U_Ab)TmfvH^doXIIXhk;3)#wS^ zH=+VJBO#5qTN#+RZqb-B!u5^#vr${6pcyoWBw8@qWr`+r8!ozr|6ZnOM7P^Uvn*jG zJHUOOh=IXbIAg9eGF9sg?Alqe`cNuyFwfl}GTe8O7g5Z(Xc)IzGy#1!W+ery zQ$;l1jN8oxywh+%Aq1z1)uaeIEEY>)=>p;F-zqk#RbtCgqhk_V#3#ikwe0*pWXu#} z$sTZ@CDO@WSUyX)9gw5m zglThdvJYVK9Fc}sKNU<&o{Rm5WPb|$A-{hpCGLc22F^0tKQ2D5WmHU3VpM!mQp@;} zqdFg!{7!@R>7p(@g0Eg^6P2cm`s675I~^DNBU|S?ON2Lw1xWIkgiHhT0<^f}Qc$xT z?+HB?BJhMo@*fxCk>DiwED}R#3BK8}dx2O8zb+C%$|uH%dx{XCd)Vd$r5+S+DcHUYU9wh7gD7D_gWeRw3CxmlFrxd|V8wSDLx z8x=J=w$+G{Es~-}jEWl3vh#T`Ws6Mu8EFIeb1;GIxfOHA3y`=~48`*)KH9(^TSYLv zgvN~~8xOs5Pyv_aZfpUWImqV~*qtLfldJG&j_5_M$wwqi-X=om=cKEJXz?}?O0L7L zZK5mvf;=Y$353quMe}EG5U<3^lg6Y>z#kb)ns~GF&yAH;`n9oJEag(S4i95uu{{!s9e@OrU diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index 2f2ed185ab4ad8a28e228683ff0d88c59754e98b..5cd71498f44d692b43d7c46047f1d1f985d4f24d 100644 GIT binary patch delta 17038 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

    #>?{(}Qhxh$vtU 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 E0SjY^;s5{u diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 84a43d0485699..f87bb062515bc 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -493,7 +493,7 @@ mod tests { use test_client::{self, TestClient}; use test_client::client::BlockOrigin; use test_client::runtime as test_runtime; - use test_client::runtime::{Call, UncheckedExtrinsic, Extrinsic}; + use test_client::runtime::{Transfer, Extrinsic}; #[test] fn client_initialises_from_genesis_ok() { @@ -528,9 +528,9 @@ mod tests { assert_eq!(client.info().unwrap().chain.best_number, 1); } - fn sign_tx(tx: Extrinsic) -> UncheckedExtrinsic { - let signature = Keyring::from_raw_public(tx.signed.0.clone()).unwrap().sign(&tx.encode()).into(); - UncheckedExtrinsic { extrinsic: tx, signature } + fn sign_tx(tx: Transfer) -> Extrinsic { + let signature = Keyring::from_raw_public(tx.from.0.clone()).unwrap().sign(&tx.encode()).into(); + Extrinsic { transfer: tx, signature } } #[test] @@ -539,10 +539,11 @@ mod tests { let mut builder = client.new_block().unwrap(); - builder.push(sign_tx(Extrinsic { - signed: Keyring::Alice.to_raw_public().into(), - function: Call { to: Keyring::Ferdie.to_raw_public().into(), amount: 42 }, - index: 0, + builder.push(sign_tx(Transfer { + from: Keyring::Alice.to_raw_public().into(), + to: Keyring::Ferdie.to_raw_public().into(), + amount: 42, + nonce: 0, })).unwrap(); client.justify_and_import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index bbda1221b1be4..d6f86982f56dc 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -49,19 +49,19 @@ mod tests { use state_machine::backend::InMemory; use test_client; use test_client::runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; - use test_client::runtime::{Hash, Call, Block, BlockNumber, Header, Digest, Extrinsic, UncheckedExtrinsic}; + use test_client::runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest, Extrinsic}; use ed25519::{Public, Pair}; native_executor_instance!(Executor, test_client::runtime::api::dispatch, include_bytes!("../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm")); - fn construct_block(backend: &InMemory, number: BlockNumber, parent_hash: Hash, state_root: Hash, txs: Vec) -> (Vec, Hash) { + fn construct_block(backend: &InMemory, number: BlockNumber, parent_hash: Hash, state_root: Hash, txs: Vec) -> (Vec, Hash) { use triehash::ordered_trie_root; let transactions = txs.into_iter().map(|tx| { - let signature = Pair::from(Keyring::from_public(Public::from_raw(tx.signed.0)).unwrap()) + let signature = Pair::from(Keyring::from_public(Public::from_raw(tx.from.0)).unwrap()) .sign(&tx.encode()).into(); - UncheckedExtrinsic { extrinsic: tx, signature } + Extrinsic { transfer: tx, signature } }).collect::>(); let extrinsics_root = ordered_trie_root(transactions.iter().map(Slicable::encode)).0.into(); @@ -114,10 +114,11 @@ mod tests { 1, genesis_hash, hex!("25e5b37074063ab75c889326246640729b40d0c86932edc527bc80db0e04fe5c").into(), - vec![Extrinsic { - signed: Keyring::One.to_raw_public().into(), - function: Call { to: Keyring::Two.to_raw_public().into(), amount: 69 }, - index: 0, + vec![Transfer { + from: Keyring::One.to_raw_public().into(), + to: Keyring::Two.to_raw_public().into(), + amount: 69, + nonce: 0, }] ) } diff --git a/substrate/network/src/test/mod.rs b/substrate/network/src/test/mod.rs index cc69a37c83eb0..73ac9ff7294aa 100644 --- a/substrate/network/src/test/mod.rs +++ b/substrate/network/src/test/mod.rs @@ -33,7 +33,7 @@ use network::{PeerId, SessionInfo, Error as NetworkError}; use keyring::Keyring; use codec::Slicable; use test_client::{self, TestClient}; -use test_client::runtime::{Block, Hash, Call, Extrinsic, UncheckedExtrinsic}; +use test_client::runtime::{Block, Hash, Transfer, Extrinsic}; pub struct TestIo<'p> { pub queue: &'p RwLock>, @@ -172,13 +172,14 @@ impl Peer { let mut nonce = 0; if with_tx { self.generate_blocks(count, |builder| { - let xt = Extrinsic { - signed: Keyring::Alice.to_raw_public().into(), - function: Call { to: Keyring::Alice.to_raw_public().into(), amount: 1 }, - index: nonce, + let transfer = Transfer { + from: Keyring::Alice.to_raw_public().into(), + to: Keyring::Alice.to_raw_public().into(), + amount: 1, + nonce, }; - let signature = Keyring::from_raw_public(xt.signed.0).unwrap().sign(&xt.encode()).into(); - builder.push(UncheckedExtrinsic { extrinsic: xt, signature }).unwrap(); + let signature = Keyring::from_raw_public(transfer.from.0).unwrap().sign(&transfer.encode()).into(); + builder.push(Extrinsic { transfer, signature }).unwrap(); nonce = nonce + 1; }); } else { @@ -195,11 +196,11 @@ impl Peer { struct EmptyTransactionPool; impl TransactionPool for EmptyTransactionPool { - fn transactions(&self) -> Vec<(Hash, UncheckedExtrinsic)> { + fn transactions(&self) -> Vec<(Hash, Extrinsic)> { Vec::new() } - fn import(&self, _transaction: &UncheckedExtrinsic) -> Option { + fn import(&self, _transaction: &Extrinsic) -> Option { None } diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 1337bdb9fefa4..d1a646c4f7648 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -806,7 +806,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = ::primitives::traits::BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/test-runtime/src/lib.rs b/substrate/test-runtime/src/lib.rs index b96c9676094bf..837572efc0030 100644 --- a/substrate/test-runtime/src/lib.rs +++ b/substrate/test-runtime/src/lib.rs @@ -51,28 +51,65 @@ pub mod system; use rstd::prelude::*; use codec::Slicable; -use runtime_primitives::traits::BlakeTwo256; +use runtime_primitives::traits::{Checkable, BlakeTwo256}; use runtime_primitives::Ed25519Signature; pub use primitives::hash::H256; /// Calls in transactions. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct Call { +pub struct Transfer { + pub from: AccountId, pub to: AccountId, pub amount: u64, + pub nonce: u64, } -impl Slicable for Call { +impl Slicable for Transfer { fn encode(&self) -> Vec { let mut v = Vec::new(); + self.from.using_encoded(|s| v.extend(s)); self.to.using_encoded(|s| v.extend(s)); self.amount.using_encoded(|s| v.extend(s)); + self.nonce.using_encoded(|s| v.extend(s)); v } fn decode(input: &mut I) -> Option { - Slicable::decode(input).map(|(to, amount)| Call { to, amount }) + Slicable::decode(input).map(|(from, to, amount, nonce)| Transfer { from, to, amount, nonce }) + } +} + +/// Extrinsic for test-runtime. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Extrinsic { + pub transfer: Transfer, + pub signature: Ed25519Signature, +} + +impl Slicable for Extrinsic { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + self.transfer.using_encoded(|s| v.extend(s)); + self.signature.using_encoded(|s| v.extend(s)); + v + } + + fn decode(input: &mut I) -> Option { + Slicable::decode(input).map(|(transfer, signature)| Extrinsic { transfer, signature }) + } +} + +impl Checkable for Extrinsic { + type Checked = Self; + + fn check(self) -> Result { + if ::runtime_primitives::verify_encoded_lazy(&self.signature, &self.transfer, &self.transfer.from) { + Ok(self) + } else { + Err(self) + } } } @@ -87,13 +124,9 @@ pub type Index = u64; /// The digest of a block. pub type Digest = runtime_primitives::generic::Digest>; /// A test block. -pub type Block = runtime_primitives::generic::Block; +pub type Block = runtime_primitives::generic::Block; /// A test block's header. pub type Header = runtime_primitives::generic::Header>; -/// Extrinsic -pub type Extrinsic = runtime_primitives::generic::Extrinsic; -/// Signed extrinsic. -pub type UncheckedExtrinsic = runtime_primitives::generic::UncheckedExtrinsic; /// Run whatever tests we have. pub fn run_tests(mut input: &[u8]) -> Vec { diff --git a/substrate/test-runtime/src/system.rs b/substrate/test-runtime/src/system.rs index fa379d38e72c1..97529bb74e9b2 100644 --- a/substrate/test-runtime/src/system.rs +++ b/substrate/test-runtime/src/system.rs @@ -22,7 +22,7 @@ use runtime_io::{storage_root, enumerated_trie_root}; use runtime_support::storage::{self, StorageValue, StorageMap}; use runtime_primitives::traits::{Hashing, BlakeTwo256}; use codec::{KeyedVec, Slicable}; -use super::{AccountId, BlockNumber, Call, UncheckedExtrinsic, H256 as Hash, Block, Header}; +use super::{AccountId, BlockNumber, Extrinsic, H256 as Hash, Block, Header}; const NONCE_OF: &[u8] = b"nonce:"; const BALANCE_OF: &[u8] = b"balance:"; @@ -88,7 +88,7 @@ pub fn execute_block(block: Block) { /// Execute a transaction outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. -pub fn execute_transaction(utx: UncheckedExtrinsic) { +pub fn execute_transaction(utx: Extrinsic) { let extrinsic_index = ExtrinsicIndex::get(); ExtrinsicData::insert(extrinsic_index, utx.encode()); ExtrinsicIndex::put(extrinsic_index + 1); @@ -115,7 +115,7 @@ pub fn finalise_block() -> Header { } } -fn execute_transaction_backend(utx: &UncheckedExtrinsic) { +fn execute_transaction_backend(utx: &Extrinsic) { use runtime_primitives::traits::Checkable; // check signature @@ -124,27 +124,26 @@ fn execute_transaction_backend(utx: &UncheckedExtrinsic) { Err(_) => panic!("All transactions should be properly signed"), }; - let ref tx = utx.as_unchecked().extrinsic; + let tx: ::Transfer = utx.transfer; // check nonce - let nonce_key = tx.signed.to_keyed_vec(NONCE_OF); + let nonce_key = tx.from.to_keyed_vec(NONCE_OF); let expected_nonce: u64 = storage::get_or(&nonce_key, 0); - assert!(tx.index == expected_nonce, "All transactions should have the correct nonce"); + assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); // increment nonce in storage storage::put(&nonce_key, &(expected_nonce + 1)); // check sender balance - let from_balance_key = tx.signed.to_keyed_vec(BALANCE_OF); + let from_balance_key = tx.from.to_keyed_vec(BALANCE_OF); let from_balance: u64 = storage::get_or(&from_balance_key, 0); // enact transfer - let Call { to, amount } = tx.function.clone(); - assert!(amount <= from_balance, "All transactions should transfer at most the sender balance"); - let to_balance_key = to.to_keyed_vec(BALANCE_OF); + assert!(tx.amount <= from_balance, "All transactions should transfer at most the sender balance"); + let to_balance_key = tx.to.to_keyed_vec(BALANCE_OF); let to_balance: u64 = storage::get_or(&to_balance_key, 0); - storage::put(&from_balance_key, &(from_balance - amount)); - storage::put(&to_balance_key, &(to_balance + amount)); + storage::put(&from_balance_key, &(from_balance - tx.amount)); + storage::put(&to_balance_key, &(to_balance + tx.amount)); } #[cfg(feature = "std")] @@ -171,7 +170,7 @@ mod tests { use runtime_io::{with_externalities, twox_128, TestExternalities}; use codec::{Joiner, KeyedVec}; use keyring::Keyring; - use ::{Header, Digest, Extrinsic, UncheckedExtrinsic}; + use ::{Header, Digest, Extrinsic, Transfer}; fn new_test_ext() -> TestExternalities { map![ @@ -184,9 +183,9 @@ mod tests { ] } - fn construct_signed_tx(tx: Extrinsic) -> UncheckedExtrinsic { - let signature = Keyring::from_raw_public(tx.signed.0).unwrap().sign(&tx.encode()).into(); - UncheckedExtrinsic { extrinsic: tx, signature } + fn construct_signed_tx(tx: Transfer) -> Extrinsic { + let signature = Keyring::from_raw_public(tx.from.0).unwrap().sign(&tx.encode()).into(); + Extrinsic { transfer: tx, signature } } #[test] @@ -225,14 +224,15 @@ mod tests { parent_hash: [69u8; 32].into(), number: 1, state_root: hex!("0dd8210adaf581464cc68555814a787ed491f8c608d0a0dbbf2208a6d44190b1").into(), - extrinsics_root: hex!("65ed452ee5c22a1b3527658f921f9a052d5942762f6363a5ed6525bc017bad44").into(), + extrinsics_root: hex!("951508f2cc0071500a74765ab0fb2f280fdcdd329d5f989dda675010adee99d6").into(), digest: Digest { logs: vec![], }, }, extrinsics: vec![ - construct_signed_tx(Extrinsic { - signed: Keyring::Alice.to_raw_public().into(), - function: Call { to: Keyring::Bob.to_raw_public().into(), amount: 69 }, - index: 0, + construct_signed_tx(Transfer { + from: Keyring::Alice.to_raw_public().into(), + to: Keyring::Bob.to_raw_public().into(), + amount: 69, + nonce: 0, }) ], }; @@ -249,20 +249,22 @@ mod tests { parent_hash: b.header.hash(), number: 2, state_root: hex!("c93f2fd494c386fa32ee76b6198a7ccf5db12c02c3a79755fd2d4646ec2bf8d7").into(), - extrinsics_root: hex!("f6ba96c4df7fcfbcdf58d4ad6ca360dbf7894f17a7136894edb518c0c06829e6").into(), + extrinsics_root: hex!("3563642676d7e042c894eedc579ba2d6eeedf9a6c66d9d557599effc9f674372").into(), digest: Digest { logs: vec![], }, }, extrinsics: vec![ - construct_signed_tx(Extrinsic { - signed: Keyring::Bob.to_raw_public().into(), - function: Call { to: Keyring::Alice.to_raw_public().into(), amount: 27 }, - index: 0, + construct_signed_tx(Transfer { + from: Keyring::Bob.to_raw_public().into(), + to: Keyring::Alice.to_raw_public().into(), + amount: 27, + nonce: 0, + }), + construct_signed_tx(Transfer { + from: Keyring::Alice.to_raw_public().into(), + to: Keyring::Charlie.to_raw_public().into(), + amount: 69, + nonce: 1, }), - construct_signed_tx(Extrinsic { - signed: Keyring::Alice.to_raw_public().into(), - function: Call { to: Keyring::Charlie.to_raw_public().into(), amount: 69 }, - index: 1, - }) ], }; diff --git a/substrate/test-runtime/wasm/genesis.wasm b/substrate/test-runtime/wasm/genesis.wasm index af45da8fb27778851a7b178bd8582c3ca5b6fc25..858e33d53b17d1c3fce5edea3199e4bc041b93cf 100644 GIT binary patch literal 20404 zcmchfTZ~-CncvT?d-^)lq$HabWvQmkwT3n&&yYjTaH7~egO%2dR$i?vZ2S;l*wfP^ z&Tww(X;LEA76%E}(1YRSE)1*}SRf3t2_0Y=Xn_slB!1w7lPG~7gv3dNKmiD>u+W1M z@WDv@u!!^fe|6639$s{D77<0BsybC)ef8bztLhVUb~nQy2*TfNo(qC=@s%rAf^*@O z@QM|Agw!Kzd?PrQ@Y>hyP56dh@o!1(8e|>9E76aliMY3Qsn&aau(a9P*x2p{ks2y$ zSncR(&4-4Wey}{D%V7uRWrMCnU+d*A}8+tW(ZTt15nd9?8 zsHO=uF*fh*ryarceD8ISeam`gFbzXn=>au&H+r3Z0m2r0Q0={y<0ntfoL;)r>#wa| z4jS{r;_>KKA#+ zYI(D_x!u1U1qb>UcLz($y;s(@mM(6+wzjnrJW|eh@tMSU@Myhrad3XSzcyIw?FQ}E z+7_kG#@cRgX&IJX2tLOOd)SH%S#{)({|Uo!579?*S1E7e6d;$gEXwi zkGsj*fBC)e@lw!g1@%ghzTIpc4(k6X45KU28U1lVnygPnK|6Ng1sDBRGjO4c*4vQ_ z&$h#6m7romU6p#h1XWn2K5NnW*rcJypBp)(a1^M~H8 zgO9qT6*j_p-XX3#0G^5%2nsHwRG+8|&(=dhy+*SzX_e~rAl<8^?N$^7^?x145yFmi zgZoEg{{YOBn~RM%+NB%W5?pD~y?G-Ie&e3ilyhXY8Y;kRY(T1FN#ze)QnG(ZPa26D zEVm_!w<1apub-q8Q##~Jtns@^oUq2qmCpsKyU>o0K&CVvOu~T4l3#bWddM8OB#ke& z%QqLJZ@0&8v@2pt;>Pk7C9VQLs?Rn{V4tkFYc71Q88)JNnoL#!s73i^R$ouU$p(#y z*kp57TrGWleX>qtt$V2v_Y#V*y~2PBa`PL_pzdJug*3jDhU=5193~(t z3=btG&1?Y-YeyGcn8{#W;upF4dK+kGK{=7&jRU*l#?KyZk85$XK8s9_v#g0{n`JlQ z8g3k{5;ra}o21_2H7HF?Hdv?uoUCX`YSg#};#p@{wCXzd=^_{xi+pLqN(=(Rd5SrWvL+zT1cRRI$SQ!48nqB79+gQ%|EM<`=t3GupulJ@KIFp1aE|%H^u5}ts6}fC zSN!{UE_O6TbMch5yYYBr>n54ocu41eNPU{(xDd4Q$^u0M$dF@1-0Zp_0O%K)G>m6V>< z^xz=f+q)CI+V@EGsr?xHS#E$io91{a=}&B z#d$PhEWNVc9y80EQx^Wq9-<=1F{@8h{4G`m>(-%RdWO&gy_rNLW#N;<7!-vY6lgD@ zSg2sykmfO8rf5|cNny>6fr1Eh3k})}pObPKoA5}&rXnwfK3{P7qzK9Tc>0_M3^;3Z zf3*6uEQG>rwThnzH<2)6E?l#hffTd)R50C^w8hUIPUBZI-;hE<8JRILtUf6VQI{{2 z2BhI7%mbxMQXM?QsmQpm#U|LJUk1;^gxDnuK_d;#hf0RiUruE07$T_GUkIA&m6k6d zosg7|SfdTg$4pp_F?mCQM&2-v zx5QS+7-LeeAV--wZkG{`$-om2eHHT|9^4KgEnyxWTf+j3Hj)VOMDh@s&_Fo@y+JmC zIUGKQu#61%V~w=3`DuvF_vSwh>KkDwZ-q~ca0fVIh|dEaD3p2(=E&Ja>5-yD!!a6e zH{}npucxAidAwaYg{O%qRdA0}R+^&ZXlbpdKWoZ2w&Yf|9Q~8D9;-ixPY&gii7+*P zC@)N~fTvTrGG}xDHB%8?mg?`C5MUu8@(cj)upC+iZ_XuY4LNoBZ(Z4R5il*DP z$%t<*mcHFiZs4vlqFC8H&@HNXu%d3R4m6^+1He%cFa&6Rm;k$Wece?J=u~tBBQJA0O0*JTy~U(i z2wL;CNRMgt_Lw^nvE2}v6CgbC0uPG>Fc}JL8*WSyD6y>sMB#N&Wg!!;mRB?EVT5a% zHCA*=H0a}3R|1%86cqyA@uEV&J5f{|y8vkg&PjR%FJi2TA{~5eBsrLe3!xTa4D&=1 zsYRCgb}1(dQ!3`9wE7iNO^)4q(X2Rc|i3Z@bFPs}_iu zy0AYLiQfsbkW;aG`m<_!qV-t{|D={aWre(@MbMu9RV_WH*1t^15}?M{qfCuKg)M`` z8kPleBAI1?ld8ys$y)4%?0s5C=niIY`XM5jy-9x&XoXoXn)3$na1SB)Maau*>@X3= zY!7Au%1e%dD)UI@A*zLUYR@##x=GDdolugEj#%O>`A3X%s!$n0Q=)nU>^nJ zdw7R9bwG(Eui$tWwCkS)nlMW4#pni>2Kat?AC8gXA_9xpNS>rfe#%pPGQ`a_HYS7k z41KcQwccurD2WK={M2c%-o}a5eZc;mP;d-N`lgk=^jwdSo<%t?xrf{@4LuZW|DFi` zo$*uAH5I-`K~9VpvPtq#FoF_GGiN2X|H-%<)B6WYRW^rmM)8QS`OU2S5nNP7;fTXa zJJJ9pOe}w#D_ua%o?zF1$OMX>=(la>UBb(DS@Nh9RB63kLS*Gj_WuDQ_7SoXbI4~9 z0(ilpX!~@tl6r@wlM7u7lTQU3FZm5i!tG(&1 z@vXq5K5-*;=8c{8jZ(b_F+w)$FKNFW3Mhi0HWPdN5$0!T;;CbvhKr$&E()Cj$Qg4{ zQjc75F!SZKqQB5PF_Owzu^%LIZ<7c>mgqy1l3er~dx5}78XU>E8rP6fqMeUm7<>}+ zF)_&)CcrdifMc;ol9RC~lL(_iz5;s(nIv%;dqh-EQjLQ>(p$ZwXiiFO_2?RVm|ko! zva%yq*;v5dN#zL-YtO?fxsf{awsLmqJ?z217nJqv*@H9%e{LHS-GL#BG{B+Oz6N=i zyulE~GM>u_TZXXw{cugl2rK0WBch`V?UrYoQCI2!5U8tcW-cx4$FfOl-kJYObh_o~ zL;}v!O?4CFT&z8v%JTQ676sgSB+pCqf{Zc)Akovs5$R(eF3TWR9>3&~=M z+X2^d@dYotlH(ZB7C~BR`~pEGZfh@UAG9oST>)kjl~c%hEhDZrtBsw!h@FZg(n_o#Z47?qBe))u`g;3%d2^lgqX#fKcJ*v!#r4YzL$N=dt z(-4A9w#X^R?EiBaAu!9PP#;WEg$*OggwoA667p?VziL@8lbx$df`dK=2Nerj58FP1 zJfg{!=z>DxpK(g404}QJOf~&}LmN>Xm;A&*B4&svX|z$cxj70!Cx=qk7NM}|M4P$I z%Zwm#rd}X-qc5<4iGM--n!oUJsAO>}^K{o6bQj$1%?L1!F=yo8jLgpzCc0j@^ErSb zCwZOL5hy^AZC2|Lf()MX&Pc^`W~0qsUq?Lx7f75cJj^e$FVlWhNm}*B<3c=b^SzU^ z%8|^RTIHCwxS(Z~SsR4fS?!t3Q(EQ60sJdE{)C#@NqhG*YVr+!*!$GXa@xE1s9Atu zwVzT0E$hibGktDZXl0yL*3h#5k_iHQGVig}}1-}b+Q8)x5ddib$|`VSChf_ixMi%4Ojk_A)I&m&SQJnux>)*OvL zh$QCeyV?Pye~rU^U(vp1$^ZD>OqAXcS=7;Yp==hB=Ar>J@PT~4O|1x*08Eh}gb{Jj zRKJyQp$jh9)&n&Th%f`A9+m(toB~F>akDH!`QZPV13Woe7JxW|7x|G?F*YV#d>Btdy2=Z0aQ^=o~T z-6fenLz;qxDw9gHAkid8he&Y65r5o~UntKZGYmym zJb+^8`!PBt^|F2CZP_LS;)jUaBIiSI$%wtBWJ^wGErP7awQv)I3)_E~C;>DTy+sCa zNH&6RSzc|803aa@TTiOnjvaq8Oo^N1tlJ99C{hep@RnnChtY&o+r zxdm}o*+pn~=M9MGHC5>E$Z!j723y3z%zu&ikeQ=49dsIgttrDni0vha4bL}|)~9H^ z#$byzz|dzHETm8~!I2?85^1Q}^vc#V>bEO%@ikeVDE(2aqfZanwPcCXoAq>@^XZTs zuMid#N|KknQkE=I`yd|Kd#1Oo1_1+c!-yQVjsnM%H8676hLfREbOOw(UE9SW8=W7+Xgo+#=BC^iP4d8Ss%z z3V^b_$t{oX5KT3J<`6qIfZaVv-2$n*at;YO2ma>Uv>H)9+cb-Yvu&E~TN9-lkOfOO zAbNK}xnJgjT*iYl7da@I6~(`hooL3$N-^IO`*&Cv%yGtywuOLZYJA*GHr>A)388OU zM2)YHI2scv3X7vRz>}BpRBI1+yL!juI*rgflZ4Ey*}{E3Kt*kN&(O_TuY<$9fm#6n zkZTq*(gG`r6o@L8r?(~0_u-+b)Rd15(-fMCK-@{2j>cz-4K693TY>$f4Vur)(O{{$ zuZ*VVv}b1P%{>%eN|k+{#}t6^U-4-;t##g$M8ZsQXpi-7+LJ`@C>ALaqtVoQTOLyH zC>9wmdq)=k)7d+Uc{Ypy!Md~5Jfo-ZRS+P?kZhV6y)x$Vj$%PIV+JaQG>1mK_94-x zWRz=vM&-nP3I?L*lfNIp+4;l6JLj@PdLNUczG)n%6n*|8uxJf?ukrbN`|fQ@M};hE@Wbu zEov5rMntsPScARi(-~v#VAfi84`n40)5I~WOA89!sJVx;=Bj%nD;Yp%l(r&19;EH2 zRk07Wz)a@Ts|E2ea}@F(AQyf|$2vHA9i~YGB+WSK_m|4F77O9lB(+@Ab*!0f_6!J- zO%Z|wN}Ct@7l?I5qBY>0W0-~|5~7yNT#$Z1Ef=>yHmFd`Abpn_>yaHN3(x622l+4( zITX$&-Sc+T1U|lYFcX_+p-wq*%cHJul8>3P0~TPegn`v@KZLHsI_n5wefB=W+MqJHG$sK$0PYWcdIY+s@DMrzQcP#y zk&*krm+{ih*iTd0w+LOW(+pf(kwr0l=wG?FzY;TA_Wefi;$ho!LkNLa&k8$b(!NAL zm>4x6L7YJNZKwLEVz9|J%@{DY`-eF^7c4h6ZwWAhU>|!7CJcE?gN3arqbQ79%?#;qZH&_X^W)*g^6!t4RHv10dcT0rQc>yx(a!;He5;T_Mv zYD78)Bh=g@;0bjhBmF*xA7biiaGN*|bCx-X)A@ei^hmmJ=vXgJFTnkCF3SgULytMfc9 zRwA2dmT_NS*+#RF`&wlq%~I}bMf7Op-+isJnPxfjR!|RKB-bD$VHx*HWnQ=p2Fo(@ z0&l5vYqX6vRyDxPOO+l-owqGjDYB6r#jT1xMr|r2ic(nOVQYxDSwo=YkLh(3I!Tkn zRi93@3Q#TdvkHSPura9BA=IPs_ruAWq0D$0lOc50TN7M(#N-(oM`6{y1B8ZFSuKWW ziMr$fRk)_AtGT-ClzsrqJWE^at?}Zrn#+!mLDRp@5?<0hSJlQ(4Ch}c>$6EJW_{nW zlwFwqfX#^YAkK=@JDhyCj%oI{BBtm0gJ`mf`>4@LIV3H~=K(BTK+1?*vVX@_fG~a6 z`edRiDnRHDaG38#!pbo7om%^D)X-B<0hhhar_1jlRdlRruyjq5Ld(@&;`oQ_m5bpw z5&Gy8BPn&vBAO92M-X^hYtik1^oI~BPXAY(suAawvaJy3ha%El^swuXq80SG?+h^K zS0w@DvD7Xk04;1lyZ*9%P>_Nu|IV+E;P{R*!Ql9IWG3+b%wr3{IFD@3JlUgr=>mDV zlK3lQjuke{8_HePT>V?zFZoc?-4}^`dY&Y|J#%#53IVtm+UVLoCNwQ@D*B1#@#UF) z{YO@hiu#{f-F_l~w~XyvF#V(aF3-J%_k2d<=l=1X3FSBbcq}X{p>gMv-szD>N3GAB zCgFm=kKX*Yw&2q2$P9d;?N+rnnfj9&@+zFC`lNI3MCo;ZXNH${ormzy>_jF67URF8 zofRd;j_H2g4Qa*NzGE7m_u#3y_T3{?6oXU>*|(5aL$CE@nkB^nqkBv5Fv;TBT=Y{- zCJ+G~?0S~oOhxZT3Oex}Q^9}AF8)dQ8w65vvH{)F*uDCd)GJ{p{gek`3O&0$o6RxP&7IzJJ3PE?~w(OksA9A{S% zv47$v`ds$!Mp>C(E7-Sw&q~yh8&Dts;P*|iN7IGM`uTT%;gvv+fi|!Y2(HNL0W!zr z|5d8|itR#{myM&e+{y1e6&j{YAuk?q0m|e?iAagdgD*fqyt^(yrT?*-wsqa^#=~*b z&gf9jTLiCmD_E3{z2h@V2bt0smDz|&Ve({#Q5kN$7@5Np{j^uTOKqeEsLgd_rQTA% zPNX@iGC-Q5he_3kAwbl1KLpMJQmtX_%Fm_n0m26?HN7AS@OQ=YcKOrfo;MY&kpovIYL zrr@1`LW|}q@2HX!u!;v&-4$jdyHCk=G59Vezpjlh+KF=W0|uc|&rm_RM^KS+XBgC^ z%k;`_m|hPtG;AjV7&XNZe>Q~b>pH5dd(GYp+ckebwJF86pRnm9kYCPmV>^KLb}o?X z_0@1v*%sEpmfW`3{!wE{G%8BPVTj*m#V<1IUJ;UwFcE@R*?XRa5Q(&0K0eH0Tz;EI ziz<#=vl9VG#D!d4O=dGxT*lx~G9CfTtziz)bd8zgUfpV@1nB39J{VliZ(+nY+Y`El zF>#fj|2=4pnY7-$#t~_SZsXcA)?{k9@gb&+!5%I$S&1_}j)q-g*D^|u%^tsJF`+eq zvfMOGo8|UMMA(i=%w*J#^B|B|>Xg%+il*!|&n~KG#PbOZwnhe#9f7B5ahfNxi^%&^ zEs{8CjxZQyZgyFAl)Lve6b!wW!{8uT_ZSK8(Q|)aIK03iIZo|*2*E#m@{cwWiy`Ml zAy=su18!Ok&4gW6&dsB)GT84U3*%7~?uUTC-TM)%f6&^MoXBYD4cWe0C9kQ=Ib>$2 z16r#SjU?{+m4n@16i3B4_VGG8P$!DRV+Flq8aBQ{o~AAJ)@5a8yanDt_gyKV(~YX^{gFKfb!i z?}C!~Qxs8~dT|v=29i3;HFC;ATH|^s4)cQy8HNKsF7da?bfn3T_9o-_3|;sQZGJ2& z$07@&Ul9>dRdrj3eQ{kOO-o?1Tlv_~Z=h%pCAYIaXTWSUOhw;di>}~L7zL6gi?uz5 zRyP~rS73G6AYNqs*(0Y)64@+LazXI^BLk14nGj@UL}folduA!oyAU}yf{2&L0y#rQ zZFeK2whu+>{!<}b!$oIyFDJyPam?Fn@m|gL6M)nlWR}NzGxX#}ZoHHizcf*ceyf1* zrDH}C{nkW7yj=J&{7s^65iFDDX$_n87fq)1Qw*asXIzK?S51|Vg@Ixv^u@`41NTAo z#Wuh7z_p8-#uq-nb`>2TMyw0MUNTTN*qUDtZfrPyYvZZtFor$#4K-nApIF8MYcX@C@ zKg6f*JtOr5sP@x%oI(B1$C!MtQvY|Qmo9D%);4?2e|E$5UO(UAyBocgr(L?d-5;!N zy|S^kY+pe6Qor*WpZMrL-QVqYb~@d)!DYA2CqGs>1zZx!do431|RV z?5w!8t(}Vlx6&DO+)jV{(%MRI#SOOI5x3RZ>}6jyacjG7YkT0fE^cfbbA$7}es6WV z54PawmV2(_F7fdW#$Dd&z0`a4;#wadG+pfN7Jb&XTn24-(BI}$DW3%Bg1#`akY=A5 zxvZfeyVL7$Tz0*!?zWI-f&mCW)%T>_y}Y~d`d~%t_oFv@TQ3W9*U{gN*E*MX-N=Va z?l+z<#R$yK`HqLSw!vp(b_ZYW?4CDzu++}R*Zo&ooW9cHSG(C6bk9Sk&cJm$8{LZ< zweqyc4wyl26UuLGZ*_YMaI~Xmy0PH~{m#~Ir#o2N-r9A$=eI9zKu@);_WBM;o7>PD z(!1T>)(TD8*arySK{8isS;N=mXf63q`&#z_e|AzY1Nc-<(?XS@P3nT5{q^xnL zX@7d8{VHX_|3ARt2apB)?`G{mV{Bt>>jDZHM}ImN{HtanJqiE3`BX6SnWC`xLQ!yZfU<^$`sC-caM7PYpHi z{mRhzeLgTW@%%GpkQNp)i?p!tQs=eb>2;rZ`It+;{N;rOdyVY#QKW^1-~HY0#`f;T ze(zh~T39$gyV5&7KQ}WseSG%xOmAkjHG4O#+_){}#*I-kr|0H+v!|C&%+1fvuAZJb zu<%hR^n1I#{-qvc=TFHCwnVHj%-20uRPyOxPi_6$L5g@ZkOKaN;3-|l}6!@L$O`n*b>7G2^ne75_ z_0xYhUmM1LVL^1gIR9nW!8jCPW%zivyRp{oEN`&NuV*EQ@695ByC+xX=6ju$>CVaN zQ#0LDhqQ2n=QG)7oF28WI2}GJRbE)w>1?faCEi&P0KK`DQ{9=)%*@G?EAz|Kryo1! zyRL2y78ah{?qlu-y}tUd(0hJ%x;K5gx4L{{`ZRxzfA(qL+Zze+dVL3Tw6xk;+vutP zsS~r^Bv04zP7uw(YegRY})gkZEl+p5$GgX;m)#e$?gJ2C!IdDROH6<r!u5;J5gc7YzO??CbTP`P#+J4y@ESB zi%a*I^#aMrml z5K`@3jgyz8@Q$Da3sIGi@K02g|fdn>kt=T*X3fcjv2 X$=VeyGTZUF(`Iv*Pb|-12#^0?vry~A literal 20741 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 diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 5f17d8427d947fcc77f0283c471a74574433e5f9..858e33d53b17d1c3fce5edea3199e4bc041b93cf 100644 GIT binary patch delta 4712 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 AfB*mh delta 9025 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 Date: Wed, 6 Jun 2018 16:04:44 +0200 Subject: [PATCH 56/60] switch to master branch of jsonrpc --- Cargo.lock | 54 ++++++++++++++++---------------- substrate/rpc-servers/Cargo.toml | 8 ++--- substrate/rpc/Cargo.toml | 6 ++-- substrate/rpc/src/chain/tests.rs | 4 +-- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 22e8a37021d61..763bbbf3db65a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -796,7 +796,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "jsonrpc-core" version = "8.0.2" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -808,11 +808,11 @@ dependencies = [ [[package]] name = "jsonrpc-http-server" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" dependencies = [ "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", - "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -821,19 +821,19 @@ dependencies = [ [[package]] name = "jsonrpc-macros" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" dependencies = [ - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", - "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-pubsub" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" dependencies = [ - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -841,11 +841,11 @@ dependencies = [ [[package]] name = "jsonrpc-server-utils" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -854,11 +854,11 @@ dependencies = [ [[package]] name = "jsonrpc-ws-server" version = "8.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", - "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2035,9 +2035,9 @@ version = "0.1.0" dependencies = [ "assert_matches 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", - "jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", - "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 0.1.0", @@ -2054,10 +2054,10 @@ dependencies = [ name = "substrate-rpc-servers" version = "0.1.0" dependencies = [ - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", - "jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", - "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", - "jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", + "jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-rpc 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -2945,12 +2945,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)" = "70783119ac90828aaba91eae39db32c6c1b8838deea3637e5238efa0130801ab" "checksum itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4833d6978da405305126af4ac88569b5d71ff758581ce5a987dbfa3755f694fc" "checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682" -"checksum jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" -"checksum jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" -"checksum jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" -"checksum jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" -"checksum jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" -"checksum jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" +"checksum jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)" = "" +"checksum jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" +"checksum jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" +"checksum jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" +"checksum jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" +"checksum jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git)" = "" "checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)" = "" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" diff --git a/substrate/rpc-servers/Cargo.toml b/substrate/rpc-servers/Cargo.toml index 036b14a974de5..dec067b409fb4 100644 --- a/substrate/rpc-servers/Cargo.toml +++ b/substrate/rpc-servers/Cargo.toml @@ -4,10 +4,10 @@ version = "0.1.0" authors = ["Parity Technologies "] [dependencies] -jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } -jsonrpc-http-server = { git = "https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } -jsonrpc-pubsub = { git = "https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } -jsonrpc-ws-server = { git = "https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } +jsonrpc-core = { git = "https://github.com/paritytech/jsonrpc.git" } +jsonrpc-http-server = { git = "https://github.com/paritytech/jsonrpc.git" } +jsonrpc-pubsub = { git = "https://github.com/paritytech/jsonrpc.git" } +jsonrpc-ws-server = { git = "https://github.com/paritytech/jsonrpc.git" } log = "0.3" substrate-rpc = { path = "../rpc", version = "0.1" } substrate-runtime-primitives = { path = "../runtime/primitives" } diff --git a/substrate/rpc/Cargo.toml b/substrate/rpc/Cargo.toml index 8c78ecb27f0c0..45bddecdfdf5d 100644 --- a/substrate/rpc/Cargo.toml +++ b/substrate/rpc/Cargo.toml @@ -5,9 +5,9 @@ authors = ["Parity Technologies "] [dependencies] error-chain = "0.11" -jsonrpc-core = { git="https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } -jsonrpc-macros = { git="https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } -jsonrpc-pubsub = { git="https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } +jsonrpc-core = { git="https://github.com/paritytech/jsonrpc.git" } +jsonrpc-macros = { git="https://github.com/paritytech/jsonrpc.git" } +jsonrpc-pubsub = { git="https://github.com/paritytech/jsonrpc.git" } log = "0.3" parking_lot = "0.4" substrate-client = { path = "../client" } diff --git a/substrate/rpc/src/chain/tests.rs b/substrate/rpc/src/chain/tests.rs index c2788a9324f1e..be64bcb6e12cd 100644 --- a/substrate/rpc/src/chain/tests.rs +++ b/substrate/rpc/src/chain/tests.rs @@ -34,7 +34,7 @@ fn should_return_header() { Ok(Some(ref x)) if x == &Header { parent_hash: 0.into(), number: 0, - state_root: "0d7ce1cafdb5ff10d3445ec13cd1412bb1232179cb16e5cceb878aba8c28fa50".into(), + state_root: "06ab6eaf17c94e06295015de0cd87589b44225e7b30bfca9c7bd4f216e30de8a".into(), extrinsics_root: "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421".into(), digest: Default::default(), } @@ -70,7 +70,7 @@ fn should_notify_about_latest_block() { // assert notification send to transport let (notification, next) = core.run(transport.into_future()).unwrap(); assert_eq!(notification, Some( - r#"{"jsonrpc":"2.0","method":"test","params":{"result":{"digest":{"logs":[]},"extrinsicsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","number":1,"parentHash":"0x27a851b5c445924dc632cdad76c6eb292e75f4992972d36384e429b41c057fdb","stateRoot":"0x643016ad98f8d9f15ef06c5bfaf98a934873684d60729dc3ba738ebe0f6bbb19"},"subscription":0}}"#.to_owned() + r#"{"jsonrpc":"2.0","method":"test","params":{"result":{"digest":{"logs":[]},"extrinsicsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","number":1,"parentHash":"0xe3ba509c7569a89e0ba2c4a6e8a011a3b428ce9f0915c24906fe4e28796a8719","stateRoot":"0xd9ed4155790c85241309e78d47949badf1e73e705ee522211f409f51f89f1726"},"subscription":0}}"#.to_owned() )); // no more notifications on this channel assert_eq!(core.run(next.into_future()).unwrap().0, None); From cb355738e95d9d74dd372eebf3cbea56e1078710 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 6 Jun 2018 16:25:09 +0200 Subject: [PATCH 57/60] fix network tests and some warnings --- .../release/demo_runtime.compact.wasm | Bin 402924 -> 402944 bytes .../release/demo_runtime.wasm | Bin 437008 -> 436992 bytes polkadot/primitives/src/lib.rs | 332 +---------------- polkadot/primitives/src/parachain.rs | 342 ++++++++++++++++++ .../release/polkadot_runtime.compact.wasm | Bin 419506 -> 419388 bytes .../release/polkadot_runtime.wasm | Bin 461049 -> 460905 bytes substrate/client/src/client.rs | 1 - substrate/test-runtime/src/system.rs | 6 - substrate/test-runtime/wasm/genesis.wasm | Bin 20404 -> 20332 bytes .../substrate_test_runtime.compact.wasm | Bin 20404 -> 20332 bytes .../release/substrate_test_runtime.wasm | Bin 22513 -> 22430 bytes 11 files changed, 344 insertions(+), 337 deletions(-) create mode 100644 polkadot/primitives/src/parachain.rs diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 7826337c1f65ec7a1791a7faae5bae8c1745ca3e..fbbd57cbdeca27609f7317bff71af0541bfd4101 100644 GIT binary patch delta 16892 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 B@sR)k delta 17004 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 diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index ad637520eb000264f9b25325b0f793c00db61203..595bb32153d9deb56729f0da6e8e24526e5ed603 100755 GIT binary patch delta 18824 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ø&I+l{e} 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 AhyVZp diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index 727a12e41fb21..4deded2969293 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -44,6 +44,8 @@ use runtime_primitives::traits::BlakeTwo256; use runtime_primitives::generic; use codec::{Input, Slicable}; +pub mod parachain; + /// Block header type as expected by this runtime. pub type Header = generic::Header; @@ -112,333 +114,3 @@ impl Slicable for Log { self.0.using_encoded(f) } } - -/// Parachain data types. -pub mod parachain { - use codec::{Slicable, Input}; - use rstd::prelude::*; - use rstd::cmp::Ordering; - use super::{Hash, BlakeTwo256}; - - #[cfg(feature = "std")] - use primitives::bytes; - - /// Signature on candidate's block data by a collator. - pub type CandidateSignature = ::runtime_primitives::Ed25519Signature; - - /// Unique identifier of a parachain. - #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct Id(u32); - - impl From for u32 { - fn from(x: Id) -> Self { x.0 } - } - - impl From for Id { - fn from(x: u32) -> Self { Id(x) } - } - - impl Id { - /// Convert this Id into its inner representation. - pub fn into_inner(self) -> u32 { - self.0 - } - } - - impl Slicable for Id { - fn decode(input: &mut I) -> Option { - u32::decode(input).map(Id) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } - } - - /// Identifier for a chain, either one of a number of parachains or the relay chain. - #[derive(Copy, Clone, PartialEq)] - #[cfg_attr(feature = "std", derive(Debug))] - pub enum Chain { - /// The relay chain. - Relay, - /// A parachain of the given index. - Parachain(Id), - } - - impl Slicable for Chain { - fn decode(input: &mut I) -> Option { - let disc = input.read_byte()?; - - match disc { - 0 => Some(Chain::Relay), - 1 => Some(Chain::Parachain(Slicable::decode(input)?)), - _ => None, - } - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Chain::Relay => { v.push(0); } - Chain::Parachain(id) => { - v.push(1u8); - id.using_encoded(|s| v.extend(s)); - } - } - - v - } - - fn using_encoded R>(&self, f: F) -> R { - f(&self.encode().as_slice()) - } - } - - /// The duty roster specifying what jobs each validator must do. - #[derive(Clone, PartialEq)] - #[cfg_attr(feature = "std", derive(Default, Debug))] - pub struct DutyRoster { - /// Lookup from validator index to chain on which that validator has a duty to validate. - pub validator_duty: Vec, - /// Lookup from validator index to chain on which that validator has a duty to guarantee - /// availability. - pub guarantor_duty: Vec, - } - - impl Slicable for DutyRoster { - fn decode(input: &mut I) -> Option { - Some(DutyRoster { - validator_duty: Slicable::decode(input)?, - guarantor_duty: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - v.extend(self.validator_duty.encode()); - v.extend(self.guarantor_duty.encode()); - - v - } - - fn using_encoded R>(&self, f: F) -> R { - f(&self.encode().as_slice()) - } - } - - /// Extrinsic data for a parachain. - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] - #[cfg_attr(feature = "std", serde(deny_unknown_fields))] - pub struct Extrinsic; - - /// Candidate parachain block. - /// - /// https://github.com/w3f/polkadot-spec/blob/master/spec.md#candidate-para-chain-block - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] - #[cfg_attr(feature = "std", serde(deny_unknown_fields))] - pub struct Candidate { - /// The ID of the parachain this is a proposal for. - pub parachain_index: Id, - /// Collator's signature - pub collator_signature: CandidateSignature, - /// Unprocessed ingress queue. - /// - /// Ordered by parachain ID and block number. - pub unprocessed_ingress: ConsolidatedIngress, - /// Block data - pub block: BlockData, - } - - /// Candidate receipt type. - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] - #[cfg_attr(feature = "std", serde(deny_unknown_fields))] - pub struct CandidateReceipt { - /// The ID of the parachain this is a candidate for. - pub parachain_index: Id, - /// The collator's relay-chain account ID - pub collator: super::AccountId, - /// The head-data - pub head_data: HeadData, - /// Balance uploads to the relay chain. - pub balance_uploads: Vec<(super::AccountId, u64)>, - /// Egress queue roots. - pub egress_queue_roots: Vec<(Id, Hash)>, - /// Fees paid from the chain to the relay chain validators - pub fees: u64, - } - - impl Slicable for CandidateReceipt { - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - self.parachain_index.using_encoded(|s| v.extend(s)); - self.collator.using_encoded(|s| v.extend(s)); - self.head_data.0.using_encoded(|s| v.extend(s)); - self.balance_uploads.using_encoded(|s| v.extend(s)); - self.egress_queue_roots.using_encoded(|s| v.extend(s)); - self.fees.using_encoded(|s| v.extend(s)); - - v - } - - fn decode(input: &mut I) -> Option { - Some(CandidateReceipt { - parachain_index: Slicable::decode(input)?, - collator: Slicable::decode(input)?, - head_data: Slicable::decode(input).map(HeadData)?, - balance_uploads: Slicable::decode(input)?, - egress_queue_roots: Slicable::decode(input)?, - fees: Slicable::decode(input)?, - }) - } - } - - impl CandidateReceipt { - /// Get the blake2_256 hash - #[cfg(feature = "std")] - pub fn hash(&self) -> Hash { - use runtime_primitives::traits::Hashing; - BlakeTwo256::hash_of(self) - } - } - - impl PartialOrd for CandidateReceipt { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } - } - - impl Ord for CandidateReceipt { - fn cmp(&self, other: &Self) -> Ordering { - // TODO: compare signatures or something more sane - self.parachain_index.cmp(&other.parachain_index) - .then_with(|| self.head_data.cmp(&other.head_data)) - } - } - - /// Parachain ingress queue message. - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct Message(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - /// Consolidated ingress queue data. - /// - /// This is just an ordered vector of other parachains' egress queues, - /// obtained according to the routing rules. - #[derive(Default, PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct ConsolidatedIngress(pub Vec<(Id, Vec)>); - - /// Parachain block data. - /// - /// contains everything required to validate para-block, may contain block and witness data - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - /// Parachain header raw bytes wrapper type. - #[derive(PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct Header(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - /// Parachain head data included in the chain. - #[derive(PartialEq, Eq, Clone, PartialOrd, Ord)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - /// Parachain validation code. - #[derive(PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - /// Activitiy bit field - #[derive(PartialEq, Eq, Clone, Default)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct Activity(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - - impl Slicable for Activity { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Activity) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } - } - - #[derive(Clone, Copy, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug))] - #[repr(u8)] - enum StatementKind { - Candidate = 1, - Valid = 2, - Invalid = 3, - Available = 4, - } - - /// Statements which can be made about parachain candidates. - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug))] - pub enum Statement { - /// Proposal of a parachain candidate. - Candidate(CandidateReceipt), - /// State that a parachain candidate is valid. - Valid(Hash), - /// Vote to commit to a candidate. - Invalid(Hash), - /// Vote to advance round after inactive primary. - Available(Hash), - } - - impl Slicable for Statement { - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Statement::Candidate(ref candidate) => { - v.push(StatementKind::Candidate as u8); - candidate.using_encoded(|s| v.extend(s)); - } - Statement::Valid(ref hash) => { - v.push(StatementKind::Valid as u8); - hash.using_encoded(|s| v.extend(s)); - } - Statement::Invalid(ref hash) => { - v.push(StatementKind::Invalid as u8); - hash.using_encoded(|s| v.extend(s)); - } - Statement::Available(ref hash) => { - v.push(StatementKind::Available as u8); - hash.using_encoded(|s| v.extend(s)); - } - } - - v - } - - fn decode(value: &mut I) -> Option { - match value.read_byte() { - Some(x) if x == StatementKind::Candidate as u8 => { - Slicable::decode(value).map(Statement::Candidate) - } - Some(x) if x == StatementKind::Valid as u8 => { - Slicable::decode(value).map(Statement::Valid) - } - Some(x) if x == StatementKind::Invalid as u8 => { - Slicable::decode(value).map(Statement::Invalid) - } - Some(x) if x == StatementKind::Available as u8 => { - Slicable::decode(value).map(Statement::Available) - } - _ => None, - } - } - } -} diff --git a/polkadot/primitives/src/parachain.rs b/polkadot/primitives/src/parachain.rs new file mode 100644 index 0000000000000..9f803810e4538 --- /dev/null +++ b/polkadot/primitives/src/parachain.rs @@ -0,0 +1,342 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Polkadot parachain types. + +use codec::{Slicable, Input}; +use rstd::prelude::*; +use rstd::cmp::Ordering; +use super::Hash; + +#[cfg(feature = "std")] +use primitives::bytes; + +/// Signature on candidate's block data by a collator. +pub type CandidateSignature = ::runtime_primitives::Ed25519Signature; + +/// Unique identifier of a parachain. +#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Id(u32); + +impl From for u32 { + fn from(x: Id) -> Self { x.0 } +} + +impl From for Id { + fn from(x: u32) -> Self { Id(x) } +} + +impl Id { + /// Convert this Id into its inner representation. + pub fn into_inner(self) -> u32 { + self.0 + } +} + +impl Slicable for Id { + fn decode(input: &mut I) -> Option { + u32::decode(input).map(Id) + } + + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } +} + +/// Identifier for a chain, either one of a number of parachains or the relay chain. +#[derive(Copy, Clone, PartialEq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Chain { + /// The relay chain. + Relay, + /// A parachain of the given index. + Parachain(Id), +} + +impl Slicable for Chain { + fn decode(input: &mut I) -> Option { + let disc = input.read_byte()?; + match disc { + 0 => Some(Chain::Relay), + 1 => Some(Chain::Parachain(Slicable::decode(input)?)), + _ => None, + } + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Chain::Relay => { v.push(0); } + Chain::Parachain(id) => { + v.push(1u8); + id.using_encoded(|s| v.extend(s)); + } + } + v + } + + fn using_encoded R>(&self, f: F) -> R { + f(&self.encode().as_slice()) + } +} + +/// The duty roster specifying what jobs each validator must do. +#[derive(Clone, PartialEq)] +#[cfg_attr(feature = "std", derive(Default, Debug))] +pub struct DutyRoster { + /// Lookup from validator index to chain on which that validator has a duty to validate. + pub validator_duty: Vec, + /// Lookup from validator index to chain on which that validator has a duty to guarantee + /// availability. + pub guarantor_duty: Vec, +} + +impl Slicable for DutyRoster { + fn decode(input: &mut I) -> Option { + Some(DutyRoster { + validator_duty: Slicable::decode(input)?, + guarantor_duty: Slicable::decode(input)?, + }) + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + v.extend(self.validator_duty.encode()); + v.extend(self.guarantor_duty.encode()); + + v + } + + fn using_encoded R>(&self, f: F) -> R { + f(&self.encode().as_slice()) + } +} + +/// Extrinsic data for a parachain. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "std", serde(deny_unknown_fields))] +pub struct Extrinsic; + +/// Candidate parachain block. +/// +/// https://github.com/w3f/polkadot-spec/blob/master/spec.md#candidate-para-chain-block +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "std", serde(deny_unknown_fields))] +pub struct Candidate { + /// The ID of the parachain this is a proposal for. + pub parachain_index: Id, + /// Collator's signature + pub collator_signature: CandidateSignature, + /// Unprocessed ingress queue. + /// + /// Ordered by parachain ID and block number. + pub unprocessed_ingress: ConsolidatedIngress, + /// Block data + pub block: BlockData, +} + +/// Candidate receipt type. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "std", serde(deny_unknown_fields))] +pub struct CandidateReceipt { + /// The ID of the parachain this is a candidate for. + pub parachain_index: Id, + /// The collator's relay-chain account ID + pub collator: super::AccountId, + /// The head-data + pub head_data: HeadData, + /// Balance uploads to the relay chain. + pub balance_uploads: Vec<(super::AccountId, u64)>, + /// Egress queue roots. + pub egress_queue_roots: Vec<(Id, Hash)>, + /// Fees paid from the chain to the relay chain validators + pub fees: u64, +} + +impl Slicable for CandidateReceipt { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + self.parachain_index.using_encoded(|s| v.extend(s)); + self.collator.using_encoded(|s| v.extend(s)); + self.head_data.0.using_encoded(|s| v.extend(s)); + self.balance_uploads.using_encoded(|s| v.extend(s)); + self.egress_queue_roots.using_encoded(|s| v.extend(s)); + self.fees.using_encoded(|s| v.extend(s)); + + v + } + + fn decode(input: &mut I) -> Option { + Some(CandidateReceipt { + parachain_index: Slicable::decode(input)?, + collator: Slicable::decode(input)?, + head_data: Slicable::decode(input).map(HeadData)?, + balance_uploads: Slicable::decode(input)?, + egress_queue_roots: Slicable::decode(input)?, + fees: Slicable::decode(input)?, + }) + } +} + +impl CandidateReceipt { + /// Get the blake2_256 hash + #[cfg(feature = "std")] + pub fn hash(&self) -> Hash { + use runtime_primitives::traits::{BlakeTwo256, Hashing}; + BlakeTwo256::hash_of(self) + } +} + +impl PartialOrd for CandidateReceipt { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for CandidateReceipt { + fn cmp(&self, other: &Self) -> Ordering { + // TODO: compare signatures or something more sane + self.parachain_index.cmp(&other.parachain_index) + .then_with(|| self.head_data.cmp(&other.head_data)) + } +} + +/// Parachain ingress queue message. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Message(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + +/// Consolidated ingress queue data. +/// +/// This is just an ordered vector of other parachains' egress queues, +/// obtained according to the routing rules. +#[derive(Default, PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct ConsolidatedIngress(pub Vec<(Id, Vec)>); + +/// Parachain block data. +/// +/// contains everything required to validate para-block, may contain block and witness data +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + +/// Parachain header raw bytes wrapper type. +#[derive(PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Header(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + +/// Parachain head data included in the chain. +#[derive(PartialEq, Eq, Clone, PartialOrd, Ord)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + +/// Parachain validation code. +#[derive(PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + +/// Activitiy bit field +#[derive(PartialEq, Eq, Clone, Default)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Activity(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + +impl Slicable for Activity { + fn decode(input: &mut I) -> Option { + Vec::::decode(input).map(Activity) + } + + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } +} + +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +#[repr(u8)] +enum StatementKind { + Candidate = 1, + Valid = 2, + Invalid = 3, + Available = 4, +} + +/// Statements which can be made about parachain candidates. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Statement { + /// Proposal of a parachain candidate. + Candidate(CandidateReceipt), + /// State that a parachain candidate is valid. + Valid(Hash), + /// Vote to commit to a candidate. + Invalid(Hash), + /// Vote to advance round after inactive primary. + Available(Hash), +} + +impl Slicable for Statement { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Statement::Candidate(ref candidate) => { + v.push(StatementKind::Candidate as u8); + candidate.using_encoded(|s| v.extend(s)); + } + Statement::Valid(ref hash) => { + v.push(StatementKind::Valid as u8); + hash.using_encoded(|s| v.extend(s)); + } + Statement::Invalid(ref hash) => { + v.push(StatementKind::Invalid as u8); + hash.using_encoded(|s| v.extend(s)); + } + Statement::Available(ref hash) => { + v.push(StatementKind::Available as u8); + hash.using_encoded(|s| v.extend(s)); + } + } + + v + } + + fn decode(value: &mut I) -> Option { + match value.read_byte() { + Some(x) if x == StatementKind::Candidate as u8 => { + Slicable::decode(value).map(Statement::Candidate) + } + Some(x) if x == StatementKind::Valid as u8 => { + Slicable::decode(value).map(Statement::Valid) + } + Some(x) if x == StatementKind::Invalid as u8 => { + Slicable::decode(value).map(Statement::Invalid) + } + Some(x) if x == StatementKind::Available as u8 => { + Slicable::decode(value).map(Statement::Available) + } + _ => None, + } + } +} diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index 5cd71498f44d692b43d7c46047f1d1f985d4f24d..9ea43b2f9a1d5c885b5fddb6f6a313aac6f36f0e 100644 GIT binary patch delta 30516 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 delta 30470 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 Y4`VQ1qqhO72Cdd9Bfm8|Ieh&80K=M1ga7~l delta 33863 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 diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index f87bb062515bc..27fb80eef58cb 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -500,7 +500,6 @@ mod tests { let client = test_client::new(); let genesis_hash = client.block_hash(0).unwrap().unwrap(); - assert_eq!(client.using_environment(|| test_runtime::system::latest_block_hash()).unwrap(), genesis_hash); assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Alice.to_raw_public().into())).unwrap(), 1000); assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Ferdie.to_raw_public().into())).unwrap(), 0); } diff --git a/substrate/test-runtime/src/system.rs b/substrate/test-runtime/src/system.rs index 97529bb74e9b2..f71bbd0155d94 100644 --- a/substrate/test-runtime/src/system.rs +++ b/substrate/test-runtime/src/system.rs @@ -26,7 +26,6 @@ use super::{AccountId, BlockNumber, Extrinsic, H256 as Hash, Block, Header}; const NONCE_OF: &[u8] = b"nonce:"; const BALANCE_OF: &[u8] = b"balance:"; -const LATEST_BLOCK_HASH: &[u8] = b"latest"; const AUTHORITY_AT: &'static[u8] = b":auth:"; const AUTHORITY_COUNT: &'static[u8] = b":auth:len"; @@ -38,10 +37,6 @@ storage_items! { ParentHash: b"sys:pha" => required Hash; } -pub fn latest_block_hash() -> Hash { - storage::get(LATEST_BLOCK_HASH).expect("There must always be a latest block") -} - pub fn balance_of(who: AccountId) -> u64 { storage::get_or(&who.to_keyed_vec(BALANCE_OF), 0) } @@ -63,7 +58,6 @@ pub fn initialise_block(header: Header) { ::put(&header.number); ::put(&header.parent_hash); ::put(0); - storage::put(LATEST_BLOCK_HASH, &header.parent_hash); } /// Actually execute all transitioning for `block`. diff --git a/substrate/test-runtime/wasm/genesis.wasm b/substrate/test-runtime/wasm/genesis.wasm index 858e33d53b17d1c3fce5edea3199e4bc041b93cf..94bf42b3f97dd3681b0d3e541fb5a276868960b4 100644 GIT binary patch delta 390 zcmdlopYhE+#tkPJ85c}G$vBm7ax0@8D}#Ul12+eQkqKNad}d4&m=u^CdnR8JQDL02`Mbz$UdH8{ zCo7pT0;yBVWsIC4H3eWLo~oMCQ}_hr8Mr}K2?zr*KLfYp5lI^%jPt*WM;747a(?DwglPz!_uCcb2U2?gJS~+ z_kqn0t}7TfzjKpjWIQmL%R_^4{bXYg`}%G+1_l)d28O$=3=F(L+5?E0fOspAuYn{U z02NOJs@FmiF9Whc`iz0%dPw4RKsLynA3$@gk;FTo;tV|OIhlFcY?*oK%uI7OfA`qS F1^}kwTi5^q delta 433 zcmaDek8#U<#tkPJ88=Km$vBnoYAd50D}#Ul12+eQM~9xE~RxwLv2HSrDX1@y1?roO#+?*TPnHU@!IJl2({^zoSku4{&B(=C?^D;MS zM#dA954meFZk_zv-M)Sz8v}z10|UcjRt5%MAngalOhCLF$k#v;4}*%Q1J!FGiPr$x uAbplVaXlpQ79bmB&Oe|z)=1)gP;mwx_MFVTY_`n2bY`X{o7a2nWdi_(5ogN) diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 858e33d53b17d1c3fce5edea3199e4bc041b93cf..94bf42b3f97dd3681b0d3e541fb5a276868960b4 100644 GIT binary patch delta 390 zcmdlopYhE+#tkPJ85c}G$vBm7ax0@8D}#Ul12+eQkqKNad}d4&m=u^CdnR8JQDL02`Mbz$UdH8{ zCo7pT0;yBVWsIC4H3eWLo~oMCQ}_hr8Mr}K2?zr*KLfYp5lI^%jPt*WM;747a(?DwglPz!_uCcb2U2?gJS~+ z_kqn0t}7TfzjKpjWIQmL%R_^4{bXYg`}%G+1_l)d28O$=3=F(L+5?E0fOspAuYn{U z02NOJs@FmiF9Whc`iz0%dPw4RKsLynA3$@gk;FTo;tV|OIhlFcY?*oK%uI7OfA`qS F1^}kwTi5^q delta 433 zcmaDek8#U<#tkPJ88=Km$vBnoYAd50D}#Ul12+eQM~9xE~RxwLv2HSrDX1@y1?roO#+?*TPnHU@!IJl2({^zoSku4{&B(=C?^D;MS zM#dA954meFZk_zv-M)Sz8v}z10|UcjRt5%MAngalOhCLF$k#v;4}*%Q1J!FGiPr$x uAbplVaXlpQ79bmB&Oe|z)=1)gP;mwx_MFVTY_`n2bY`X{o7a2nWdi_(5ogN) diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index 97f6b672ed3f2444280a1382e3c2fb4e8e083393..45ee6c9b1867f4627385ed4f3c8c868d512e5f6c 100755 GIT binary patch delta 426 zcmeyko^jrK#tnBE85c~x%eYHu?j%M9P6mOA4Gj$p4BY$-jt4fcWV+A8cw=%WzcJ&J z$$R4nU~=r4Y-KOUJAo<7 zj7b8><;ZfJvN=#ZmydDz=KZRnjEu`C?^l)FtfxMQkq4@+0IchphCbtz$!wac{7XQl z3Cx4I#BtAND@`6g##fu&&8-+2KTK}2*va@|vyJ6FM%gPU3g4jcS~i;lYX zT8vXRr`j*z;attm#NgP#!F^yepU(=$&3k;M85s{uzTv0AxPCIDzkPi-8v}z10|Ucd zRt5%MAngIfOhCL9$k#v;4}gj%0@Z6FiI)M{AbrL_aXlpQIv^Wl&JUnD)=1(VP;mwx V_MFVT?8*E6SsCYSKI*T-0RW-paZmsN delta 453 zcmbQYp7G;)#tnBE88=M6%eYJE)g(p*P6mOA4Gj$p4BY$-jwd#+WV+A8_+WA;zcJ&R z$$RN&CKkmFj-A( z8E;P?P|S>J0+Rxh Date: Wed, 6 Jun 2018 16:29:59 +0200 Subject: [PATCH 58/60] all tests pass locally --- substrate/rpc/src/chain/tests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/substrate/rpc/src/chain/tests.rs b/substrate/rpc/src/chain/tests.rs index be64bcb6e12cd..506c096d6141f 100644 --- a/substrate/rpc/src/chain/tests.rs +++ b/substrate/rpc/src/chain/tests.rs @@ -34,7 +34,7 @@ fn should_return_header() { Ok(Some(ref x)) if x == &Header { parent_hash: 0.into(), number: 0, - state_root: "06ab6eaf17c94e06295015de0cd87589b44225e7b30bfca9c7bd4f216e30de8a".into(), + state_root: "9c70014029b05f780858f654bfcf297ca708b3663d32bc81486193e84a2f2f3d".into(), extrinsics_root: "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421".into(), digest: Default::default(), } @@ -70,7 +70,7 @@ fn should_notify_about_latest_block() { // assert notification send to transport let (notification, next) = core.run(transport.into_future()).unwrap(); assert_eq!(notification, Some( - r#"{"jsonrpc":"2.0","method":"test","params":{"result":{"digest":{"logs":[]},"extrinsicsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","number":1,"parentHash":"0xe3ba509c7569a89e0ba2c4a6e8a011a3b428ce9f0915c24906fe4e28796a8719","stateRoot":"0xd9ed4155790c85241309e78d47949badf1e73e705ee522211f409f51f89f1726"},"subscription":0}}"#.to_owned() + r#"{"jsonrpc":"2.0","method":"test","params":{"result":{"digest":{"logs":[]},"extrinsicsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","number":1,"parentHash":"0x45a44c50cae6ffcc413b65d6b4444a572fa4be2e5d1cd026cc113f9d8f9bc368","stateRoot":"0x987aa0851a133413b42c6d9aa3c91b1dddc2ad5337508ee8815116b11e44c64d"},"subscription":0}}"#.to_owned() )); // no more notifications on this channel assert_eq!(core.run(next.into_future()).unwrap().0, None); From 40531bb8262f7b71fcfd0a34a123f5a73115c128 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 6 Jun 2018 16:49:20 +0200 Subject: [PATCH 59/60] [ci-skip] add another comment about issue --- substrate/runtime-support/src/dispatch.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 4b6c0a603efbe..0425b6f46a368 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -46,7 +46,8 @@ pub trait AuxCallable { type Call: AuxDispatchable + Slicable + Clone + PartialEq + Eq; } -// dirty hack to work around serde_derive issue. +// dirty hack to work around serde_derive issue +// https://github.com/rust-lang/rust/issues/51331 pub type AuxCallableCallFor = ::Call; #[cfg(feature = "std")] From ccc65f72e0d2628b23f8c9ee0161718d38754775 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 6 Jun 2018 16:53:15 +0200 Subject: [PATCH 60/60] remove some curlies --- polkadot/service/src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs index 698415dc545cf..1e86d52112b96 100644 --- a/polkadot/service/src/lib.rs +++ b/polkadot/service/src/lib.rs @@ -109,9 +109,7 @@ impl network::TransactionPool for TransactionPoolAdapter id, - Err(_) => { - return Vec::new() - } + Err(_) => return Vec::new(), }; let ready = transaction_pool::Ready::create(id, &*self.api);

    Ldr`c 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 an|r|=aHh<1P3A delta 68620 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 oph1GqHcq}s*^VA92`w`)JL5(r$(5LIW^rO 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 Tc2Tl2@0W!pdz9Pii&`OE-(m4 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 d;La>jf+XqM BlockBuilder where let parent_hash = client.block_hash_from_id(block_id)? .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{}", block_id)))?; + let executor = client.executor().clone(); + let state = client.state_at(block_id)?; + let mut changes = Default::default(); + let header = <::Header as HeaderT>::new( + number, + Default::default(), + Default::default(), + parent_hash, + Default::default() + ); + + executor.call_at_state(&state, &mut changes, "initialise_block", &header.encode())?; + Ok(BlockBuilder { - header: <::Header as HeaderT>::new( - number, - Default::default(), - Default::default(), - parent_hash, - Default::default() - ), - extrinsics: Default::default(), - executor: client.executor().clone(), - state: client.state_at(block_id)?, - changes: Default::default(), + header, + extrinsics: Vec::new(), + executor, + state, + changes, }) } @@ -77,25 +84,34 @@ impl BlockBuilder where /// can be validly executed (by executing it); if it is invalid, it'll be returned along with /// the error. Otherwise, it will return a mutable reference to self (in order to chain). pub fn push(&mut self, xt: ::Extrinsic) -> error::Result<()> { - let (output, _) = self.executor.call_at_state(&self.state, &mut self.changes, "apply_extrinsic", - &vec![].and(&self.header).and(&xt))?; - self.header = <::Header as Slicable>::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); - self.extrinsics.push(xt); - Ok(()) + match self.executor.call_at_state(&self.state, &mut self.changes, "apply_extrinsic", &xt.encode()) { + Ok(_) => { + self.extrinsics.push(xt); + Ok(()) + } + Err(e) => { + self.changes.discard_prospective(); + Err(e) + } + } } /// Consume the builder to return a valid `Block` containing all pushed extrinsics. pub fn bake(mut self) -> error::Result { - let new_extrinsics_root = HashingFor::::ordered_trie_root(self.extrinsics.iter().map(Slicable::encode)); - self.header.set_extrinsics_root(new_extrinsics_root); - let (output, _) = self.executor.call_at_state( &self.state, &mut self.changes, "finalise_block", - &self.header.encode() + &[], )?; - self.header = <::Header as Slicable>::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); + self.header = <::Header as Slicable>::decode(&mut &output[..]) + .expect("Header came straight out of runtime so must be valid"); + + debug_assert_eq!( + self.header.extrinsics_root().clone(), + HashingFor::::ordered_trie_root(self.extrinsics.iter().map(Slicable::encode)), + ); + Ok(::new(self.header, self.extrinsics)) } } diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 258600b0d01b7..84a43d0485699 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -526,7 +526,6 @@ mod tests { client.justify_and_import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); assert_eq!(client.info().unwrap().chain.best_number, 1); - assert_eq!(client.using_environment(|| test_runtime::system::latest_block_hash()).unwrap(), client.block_hash(1).unwrap().unwrap()); } fn sign_tx(tx: Extrinsic) -> UncheckedExtrinsic { diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index 5aacf5e247a40..bbda1221b1be4 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -66,6 +66,7 @@ mod tests { let extrinsics_root = ordered_trie_root(transactions.iter().map(Slicable::encode)).0.into(); + println!("root before: {:?}", extrinsics_root); let mut header = Header { parent_hash, number, @@ -74,18 +75,24 @@ mod tests { digest: Digest { logs: vec![], }, }; let hash = header.hash(); - let mut overlay = OverlayedChanges::default(); + execute( + backend, + &mut overlay, + &Executor::new(), + "initialise_block", + &header.encode(), + ).unwrap(); + for tx in transactions.iter() { - let (ret_data, _) = execute( + execute( backend, &mut overlay, &Executor::new(), "apply_extrinsic", - &vec![].and(&header).and(tx) + &tx.encode(), ).unwrap(); - header = Header::decode(&mut &ret_data[..]).unwrap(); } let (ret_data, _) = execute( @@ -93,9 +100,10 @@ mod tests { &mut overlay, &Executor::new(), "finalise_block", - &vec![].and(&header) + &[] ).unwrap(); header = Header::decode(&mut &ret_data[..]).unwrap(); + println!("root after: {:?}", header.extrinsics_root); (vec![].and(&Block { header, extrinsics: transactions }), hash) } diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 0b953941dcee8..20da96f9b70f2 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -40,6 +40,7 @@ extern crate serde_json; #[cfg(feature = "std")] use std::collections::HashMap; +use rstd::prelude::*; use substrate_primitives::hash::{H256, H512}; #[cfg(feature = "std")] diff --git a/substrate/test-runtime/src/system.rs b/substrate/test-runtime/src/system.rs index 871025a0ad5b1..fa379d38e72c1 100644 --- a/substrate/test-runtime/src/system.rs +++ b/substrate/test-runtime/src/system.rs @@ -89,20 +89,18 @@ pub fn execute_block(block: Block) { /// Execute a transaction outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. pub fn execute_transaction(utx: UncheckedExtrinsic) { - ExtrinsicData::insert(ExtrinsicIndex::get(), utx.encode()); + let extrinsic_index = ExtrinsicIndex::get(); + ExtrinsicData::insert(extrinsic_index, utx.encode()); + ExtrinsicIndex::put(extrinsic_index + 1); execute_transaction_backend(&utx); } /// Finalise the block. pub fn finalise_block() -> Header { - fn extrinsics_data_root(xts: Vec>) -> H::Output { - let xts = xts.iter().map(Vec::as_slice).collect::>(); - H::enumerated_trie_root(&xts) - } - let extrinsic_index = ExtrinsicIndex::take(); - let extrinsics = (0..extrinsic_index).map(ExtrinsicData::take).collect(); - let extrinsics_root = extrinsics_data_root::(extrinsics); + let txs: Vec<_> = (0..extrinsic_index).map(ExtrinsicData::take).collect(); + let txs = txs.iter().map(Vec::as_slice).collect::>(); + let extrinsics_root = enumerated_trie_root(&txs).into(); let number = ::take(); let parent_hash = ::take(); diff --git a/substrate/test-runtime/wasm/genesis.wasm b/substrate/test-runtime/wasm/genesis.wasm index 180df41c4c560c02a6c99b9c036780f51076d9f1..af45da8fb27778851a7b178bd8582c3ca5b6fc25 100644 GIT binary patch delta 9147 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 Q>c}h6;)yRr-tmL~3qtQ(#{d8T delta 7070 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 diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 180df41c4c560c02a6c99b9c036780f51076d9f1..af45da8fb27778851a7b178bd8582c3ca5b6fc25 100644 GIT binary patch delta 9147 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 Q>c}h6;)yRr-tmL~3qtQ(#{d8T delta 7070 zcmb7JZEPIJd7h8my}gemml7>eratCYlFhSZlA=tWL@SMkHZ2J@D>*TWB0)hN$&W7dRNZJO7e<*K%{(59?_T-Z2=}gB>A7<2VDcL8KHPwZEt1L^{ZoOaRxdCwImvrZbr5oD zu5zwAG&wXp0xr8FX8v)>7-x>lq~M%;9`~}jT+Z{noR@Q4z6hi%IqUMWJm&htKfcNG znYy3+3*SDy-J7q>&DE#bF6YcrwaQe!veGzPUz%;qR+m``f>fth8ddPEPoHB?bXFD@ z=U$zJBoJxN&&dO~BiSb3PF{3A z&gGb5iYpO%$&WLKd6abddv|R&OFjw0$aL8`i+x<1})M*TPIu zila)52aqA;c{3jm(&{n~w>+w3@(+Wm-_d`O(_Z*E5qMufS+pODNQ8Y6WGcyb_*Vh} z{@xh>gR)Hi^1!28qyj?U6SWW;>z{}kB#A`wPY3qw&jRrs0fqHi4yqWc-w`kssNNJ& zChRL>O-ZitqL=*9&{x0Wy%d0@zJ)cUP}{OwB64Zj9T8=*EC(5U<^5qlbv7jcT?KUIW00FC6|ANyB@~05)D~{6M>rh_`G}A21 z>G(M~Lb@CSDPc1NkMO4^0+7VwqReAVK_Mlf(l-NrFx~KgP?_8UPFsGzujEjs?9Olrx%=A-{rQnT^BLJ0MSMJ#87Gk&Qqg zqcTJwhlq_jXikm@EY^U*mLY%J`WQ2e&~EW&#WV<0t!!l_7^8!xoB|+cE2d7UI!yIz z@uGs);*{1wa!?~!_!vphD0Ub@P#(yCVkNDh8KZQ@sx50#Cs9H+C8Z%i2K7%IRUNd2 zIm+R*Sam|^c4MLFw_7X9k%^5iKe6gUerC1(bX|W_@KIUXrYJH9j7dibv!;&_2$2?I zkPxeU9dU>d2(RW0KzCa6rIr&^l;H_Acpvo9M{2Z_v5y@_;uHl+0lvzS+P*H-P<0)R z$&PaM{fo884UCuig0hzbCywCQq)lNy3O^W=Z%`P(ZI1`2xy>*@SHxdXoHw`eD>XTeP#tXG5qugUwvP~M{ zfw5+IC?9bO=U17P=#dY`gb~ohsk<(q8=FAw9uIJI!5{Xo^Et$;fTT)>yP>mF>_*f) z(l(6UH*9?D|AksHhhe6=t^9@tq=z0PF~tu_1&t`&NL2FXb6TD!B{u7r7hSA}Tty%H z;~c??9b{uz8S5f;4x47kMY)q?Zv~$Mxf2jLqj>|zFCTyML~kU?_`r^%NJyA{%XpAc zTa-&4jz9T)Z@2}rxFJ^=7#-Gvnnw)9qECf`>_-dT@xaYv9gdP6aCRL0=%5vG)d~5r zCXd8qgib!|-52}q1p=$O)n)_-d^fZ~V#58Q)Xdsp#E0L6sf43|z{^MvM#56&e1!Vl zHtbeWS4`43$-fk*rAHIqWPOwUn*_mH6_0b z5ki8ie414_nLdw43x=F|*u4cqOq^z#Fb>`t1%MkaC3!Cvt<(*lLh4-SgKLPnxRBAw z+sqR3BeMzZGmS(@S?@}7(ZOsea#hw!!X!&>-QZdq!uZQ|AYwaZgIND3j~negK5ipv zTHbnwyuV{1}?Ngxt8OYSWs>Yj!hJ-d)CA8X77FN4F2CoJ}ZR^vxtt6;upHYYneFu}X&fESx$;H6xN0gEt4A{CqS zlSfl+DNU;=j#+p+Kv~_rh!tVs-a=^&txuUd%H48OS zZ5$->7#%7)l)Hs;!A;Sj4hk?74}uZapytp7Bzgt*RIi{)mbS#)Qaw5aP?c$*%-Y0H z6nyekBfq(7I5;728?uu4(0NFXE9&EQ05buT4aw#MQd+f){nth-HIYKflMUQcHl8aItfPy)_V>&WD%AL@c zWm*QhYx=G=jebD5a6geM$p>+zUE1snEKS5k&dkIv0-HYtTWtWxPr`o=)y=3e=RxNKSOZ0VRgTsxzkE zAT@`@16lN-kiB8rc#|gHN(Zpl-s?rTxdUdKp@>U&cej%&?fNRA?5bUnAP*2Yy5#M~ z(K2oCE#IK+;un+Nv7NE?FXJK+DiYkH#JVX%!<#9IZ*LX_$0)1!ti#AzT<>qf;7mmW z*H!c8hml%DB=um+0S@jGaWg`bW6UOiE+6Ed8wGi)O^_o^MyVhlw~omUWlyeew-D{3 z{O`nHBI0qX=1*ITQ}TD)5Qh9`Erca+^duVz)CO~3pfDq6fD)9tNg3D-ce+1ygk!_w zLz%u(5$UES1BJpDM#}^8+-A6}nzv9CARvhm+$l_wpgu5g)g}UW3s@scU!1}9jgz*j zkAaaE5i{oMPtB@1USMKK#~#ER5kOjNl^;T(qOtV?WM-M{YF=_SUm~pHKysO~^?igF zh#*z9h!6@y+UXJsL|D9D>d11JWm(=ww$>jbo(+9t$s2$SIRjk>WF#brR^1n6agA0% z5j=m>NTi?*Izd5)yC{N=Q$gR+CoXaG7L^iSv>r@IsWt@53K{iv6QDxB$tg#*60Xo6 z(rZEG;VqgCul)BiNPeq+{zkIp*<;C_XAdU1@!`^3rBPjOymYp@R8{jU%MDeTd!_Q~ zvYM)@in4>syd(eUYvVp2Jylt%E;Q8H%JNyYe73$aH$yYe<3;&Q|MJrGz})Oq|I#v^ z)Agn506Npvf%*CjaLJ!Pci35OEY*{9&ki^Y|B{!VJs8ug^!$B33``er5!%gYe=Znv z(YhXE-DvOl7S@1i-k(Sd{|uA10}jvzXbBzO-aE(VXhc(D3kq!;|N$OS5NQ^*4N($v*s1 zCijKkWAgMVW~i|7D@+g)_4H%TRhOlR_?6GuM!kK_L;lHi5Tr?z)3!BHls zsxQwjOs*`vGP^Ld!#AjUeSW70T_E$W^!tl4pI?f}y%(Oq*O1K<{d{*aHZjciBo`(I zaM|IfPKw9IllhaolRrBZ@yCF6kZZK^Mgj-DMlGjym@txg>pIy6+CEB`K^%$dQ%Q~eKr7#e7ogG&T6px1;|7G#Kvq diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index 804c466487ad051b1e18e44044bd348bbe1073e3..68349e53b0559dfc954790523dd0572223208e34 100755 GIT binary patch literal 23146 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 delta 7651 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 From 7d8272fc5e245c76646ed3dd4545b5dedf5a6a81 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Mon, 4 Jun 2018 19:20:27 +0200 Subject: [PATCH 48/60] deal with inherent extrinsics correctly in polkadot-api --- polkadot/api/src/full.rs | 56 +++++++++++++++------ polkadot/api/src/lib.rs | 6 ++- polkadot/api/src/light.rs | 6 ++- polkadot/primitives/src/lib.rs | 3 +- polkadot/runtime/src/lib.rs | 25 +++++++++ substrate/runtime/primitives/src/generic.rs | 14 +++++- 6 files changed, 89 insertions(+), 21 deletions(-) diff --git a/polkadot/api/src/full.rs b/polkadot/api/src/full.rs index f05f76cc6471f..73a9a8ab8c02e 100644 --- a/polkadot/api/src/full.rs +++ b/polkadot/api/src/full.rs @@ -23,7 +23,7 @@ use substrate_executor::{NativeExecutionDispatch, NativeExecutor}; use state_machine; use primitives::{AccountId, Block, Header, BlockId, Hash, Index, SessionKey, Timestamp}; -use primitives::parachain::{DutyRoster, Id as ParaId}; +use primitives::parachain::{CandidateReceipt, DutyRoster, Id as ParaId}; use {CheckedBlockId, PolkadotApi, LocalPolkadotApi, ErrorKind, Error, Result}; @@ -134,6 +134,19 @@ impl> PolkadotApi for Client Result>> { with_runtime!(self, at, || ::runtime::Parachains::parachain_head(parachain)) } + + fn inherent_extrinsics(&self, at: &Self::CheckedBlockId, timestamp: Timestamp, new_heads: Vec) -> Result>> { + use codec::Slicable; + + with_runtime!(self, at, || { + let extrinsics = ::runtime::inherent_extrinsics(timestamp, new_heads); + extrinsics.into_iter() + .map(|x| x.encode()) // get encoded representation + .map(|x| Slicable::decode(&mut &x[..])) // get byte-vec equivalent to extrinsic + .map(|x| x.expect("UncheckedExtrinsic has encoded representation equivalent to Vec; qed")) + .collect() + }) + } } impl> LocalPolkadotApi for Client>, Block> @@ -144,29 +157,34 @@ impl> LocalPolkadotApi for Client Vec { + vec![ + Keyring::One.to_raw_public().into(), + Keyring::Two.to_raw_public().into(), + ] + } + + fn session_keys() -> Vec { vec![ Keyring::One.to_raw_public(), Keyring::Two.to_raw_public(), ] } - fn client() -> Client>> { + fn client() -> Client, LocalCallExecutor, NativeExecutor>, Block> { struct GenesisBuilder; - impl client::GenesisBuilder for GenesisBuilder { + impl client::GenesisBuilder for GenesisBuilder { fn build(self) -> (Header, Vec<(Vec, Vec)>) { let genesis_config = GenesisConfig { consensus: Some(ConsensusConfig { code: LocalDispatch::native_equivalent().to_vec(), - authorities: validators(), + authorities: session_keys(), }), system: None, session: Some(SessionConfig { @@ -180,8 +198,8 @@ mod tests { }; let storage = genesis_config.build_externalities(); - let block = ::client::genesis::construct_genesis_block(&storage); - (substrate_primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) + let block = ::client::genesis::construct_genesis_block::(&storage); + (block.header, storage.into_iter().collect()) } } @@ -191,18 +209,24 @@ mod tests { #[test] fn gets_session_and_validator_keys() { let client = client(); - let id = client.check_id(BlockId::Number(0)).unwrap(); - assert_eq!(client.session_keys(&id).unwrap(), validators()); + let id = client.check_id(BlockId::number(0)).unwrap(); + assert_eq!(client.session_keys(&id).unwrap(), session_keys()); assert_eq!(client.validators(&id).unwrap(), validators()); } #[test] - fn build_block() { + fn build_block_with_inherent_succeeds() { let client = client(); - let id = client.check_id(BlockId::Number(0)).unwrap(); - let block_builder = client.build_block(&id, 1_000_000, Vec::new()).unwrap(); - let block = block_builder.bake(); + let id = client.check_id(BlockId::number(0)).unwrap(); + let inherent = client.inherent_extrinsics(&id, 1_000_000, Vec::new()).unwrap(); + + let mut block_builder = client.new_block_at(id.block_id()).unwrap(); + for extrinsic in inherent { + block_builder.push(extrinsic).unwrap(); + } + + let block = block_builder.bake().unwrap(); assert_eq!(block.header.number, 1); assert!(block.header.extrinsics_root != Default::default()); @@ -210,14 +234,14 @@ mod tests { #[test] fn fails_to_check_id_for_unknown_block() { - assert!(client().check_id(BlockId::Number(100)).is_err()); + assert!(client().check_id(BlockId::number(100)).is_err()); } #[test] fn gets_random_seed_with_genesis() { let client = client(); - let id = client.check_id(BlockId::Number(0)).unwrap(); + let id = client.check_id(BlockId::number(0)).unwrap(); assert!(client.random_seed(&id).is_ok()); } } diff --git a/polkadot/api/src/lib.rs b/polkadot/api/src/lib.rs index 1d3e0c0c5827b..b3c05a6025d30 100644 --- a/polkadot/api/src/lib.rs +++ b/polkadot/api/src/lib.rs @@ -38,7 +38,7 @@ pub mod full; pub mod light; use primitives::{AccountId, Block, BlockId, Hash, Index, SessionKey, Timestamp}; -use primitives::parachain::{DutyRoster, Id as ParaId}; +use primitives::parachain::{CandidateReceipt, DutyRoster, Id as ParaId}; error_chain! { errors { @@ -123,6 +123,10 @@ pub trait PolkadotApi { /// Evaluate a block. Returns true if the block is good, false if it is known to be bad, /// and an error if we can't evaluate for some reason. fn evaluate_block(&self, at: &Self::CheckedBlockId, block: Block) -> Result; + + /// Attempt to produce the (encoded) inherent extrinsics for a block being built upon the given. + /// This may vary by runtime and will fail if a runtime doesn't follow the same API. + fn inherent_extrinsics(&self, at: &Self::CheckedBlockId, timestamp: Timestamp, new_heads: Vec) -> Result>>; } /// Mark for all Polkadot API implementations, that are making use of state data, stored locally. diff --git a/polkadot/api/src/light.rs b/polkadot/api/src/light.rs index 3db1dc2f6526b..08a5967f6f127 100644 --- a/polkadot/api/src/light.rs +++ b/polkadot/api/src/light.rs @@ -22,7 +22,7 @@ use client::{Client, CallExecutor}; use codec::Slicable; use state_machine; use primitives::{AccountId, Block, BlockId, Hash, Index, SessionKey, Timestamp}; -use primitives::parachain::{DutyRoster, Id as ParaId}; +use primitives::parachain::{CandidateReceipt, DutyRoster, Id as ParaId}; use full::CheckedId; use {PolkadotApi, RemotePolkadotApi, CheckedBlockId, Result, ErrorKind}; @@ -80,6 +80,10 @@ impl, E: CallExecutor> PolkadotApi for RemotePolkadotAp fn parachain_head(&self, _at: &Self::CheckedBlockId, _parachain: ParaId) -> Result>> { Err(ErrorKind::UnknownRuntime.into()) } + + fn inherent_extrinsics(&self, _at: &Self::CheckedBlockId, _timestamp: Timestamp, _new_heads: Vec) -> Result>> { + Err(ErrorKind::UnknownRuntime.into()) + } } impl, E: CallExecutor> RemotePolkadotApi for RemotePolkadotApiWrapper diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index c79cf6eec3f71..8a412c69806d1 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -61,8 +61,7 @@ pub type Block = generic::Block>; /// TODO: switch to u32 pub type BlockNumber = u64; -/// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost -/// certainly continue to be the same as the substrate's `AuthorityId`. +/// Alias to Ed25519 pubkey that identifies an account on the relay chain. pub type AccountId = primitives::hash::H256; /// The Ed25519 pub key of an session that belongs to an authority of the relay chain. This is diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index 7202967ab2476..9c50684b24721 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -58,7 +58,9 @@ extern crate substrate_runtime_timestamp as timestamp; mod parachains; +use rstd::prelude::*; use primitives::{AccountId, Balance, BlockNumber, Hash, Index, Log, SessionKey, Signature}; +use primitives::parachain::CandidateReceipt; use runtime_primitives::{generic, traits::{HasPublicAux, BlakeTwo256, Convert}}; #[cfg(feature = "std")] @@ -200,6 +202,28 @@ impl_outer_config! { } } +/// Produces the list of inherent extrinsics. +pub fn inherent_extrinsics(timestamp: ::primitives::Timestamp, parachain_heads: Vec) -> Vec { + vec![ + UncheckedExtrinsic { + extrinsic: Extrinsic { + signed: Default::default(), + function: Call::Timestamp(TimestampCall::set(timestamp)), + index: 0, + }, + signature: Default::default(), + }, + UncheckedExtrinsic { + extrinsic: Extrinsic { + signed: Default::default(), + function: Call::Parachains(ParachainsCall::set_heads(parachain_heads)), + index: 0, + }, + signature: Default::default(), + }, + ] +} + pub mod api { impl_stubs!( authorities => |()| super::Consensus::authorities(), @@ -207,6 +231,7 @@ pub mod api { apply_extrinsic => |extrinsic| super::Executive::apply_extrinsic(extrinsic), execute_block => |block| super::Executive::execute_block(block), finalise_block => |()| super::Executive::finalise_block(), + inherent_extrinsics => |(timestamp, heads)| super::inherent_extrinsics(timestamp, heads), validator_count => |()| super::Session::validator_count(), validators => |()| super::Session::validators() ); diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 534b84048e11c..37156a3f96554 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -393,13 +393,25 @@ impl Header where #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub enum BlockId where { +pub enum BlockId { /// Identify by block header hash. Hash(<::Header as HeaderT>::Hash), /// Identify by block number. Number(<::Header as HeaderT>::Number), } +impl BlockId { + /// Create a block ID from a hash. + pub fn hash(hash: Block::Hash) -> Self { + BlockId::Hash(hash) + } + + /// Create a block ID from a number. + pub fn number(number: ::Number) -> Self { + BlockId::Number(number) + } +} + impl Copy for BlockId {} #[cfg(feature = "std")] From 13532f7d0b4fc111e6956fcaa4c3a77f89398e73 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 5 Jun 2018 12:31:43 +0200 Subject: [PATCH 49/60] port transaction-pool --- Cargo.lock | 1 + polkadot/collator/Cargo.toml | 1 + polkadot/collator/src/lib.rs | 7 +- polkadot/primitives/src/lib.rs | 15 +++- polkadot/runtime/src/lib.rs | 7 ++ polkadot/transaction-pool/src/lib.rs | 125 ++++----------------------- 6 files changed, 40 insertions(+), 116 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5894d884d96ec..281db666d7d26 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1279,6 +1279,7 @@ version = "0.1.0" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "polkadot-parachain 0.1.0", + "polkadot-primitives 0.1.0", "polkadot-runtime 0.1.0", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", diff --git a/polkadot/collator/Cargo.toml b/polkadot/collator/Cargo.toml index 530d804edf8fc..161121eefad0b 100644 --- a/polkadot/collator/Cargo.toml +++ b/polkadot/collator/Cargo.toml @@ -10,3 +10,4 @@ substrate-codec = { path = "../../substrate/codec", version = "0.1" } substrate-primitives = { path = "../../substrate/primitives", version = "0.1" } polkadot-runtime = { path = "../runtime", version = "0.1" } polkadot-parachain = { path = "../parachain", version = "0.1" } +polkadot-primitives = { path = "../primitives", version = "0.1" } diff --git a/polkadot/collator/src/lib.rs b/polkadot/collator/src/lib.rs index c95ed08b1bfcb..55eca734d269b 100644 --- a/polkadot/collator/src/lib.rs +++ b/polkadot/collator/src/lib.rs @@ -48,11 +48,12 @@ extern crate futures; extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; extern crate polkadot_runtime; +extern crate polkadot_primitives; use std::collections::{BTreeSet, BTreeMap}; use futures::{stream, Stream, Future, IntoFuture}; -use polkadot_runtime::primitives::parachain::{self, ConsolidatedIngress, Message, Id as ParaId}; +use polkadot_primitives::parachain::{self, CandidateSignature, ConsolidatedIngress, Message, Id as ParaId}; /// Parachain context needed for collation. /// @@ -62,7 +63,7 @@ pub trait ParachainContext { fn produce_candidate>( &self, ingress: I, - ) -> (parachain::BlockData, polkadot_primitives::AccountId, polkadot_primitives::Signature); + ) -> (parachain::BlockData, polkadot_primitives::AccountId, CandidateSignature); } /// Relay chain context needed to collate. @@ -149,7 +150,7 @@ mod tests { use std::collections::{HashMap, BTreeSet}; use futures::Future; - use polkadot_runtime::primitives::parachain::{Message, Id as ParaId}; + use polkadot_primitives::parachain::{Message, Id as ParaId}; pub struct DummyRelayChainCtx { egresses: HashMap>>, diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index 8a412c69806d1..5c79b92684eed 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -39,8 +39,6 @@ extern crate serde; #[cfg(feature = "std")] use primitives::bytes; -use rstd::cmp::Ordering; - use rstd::prelude::*; use runtime_primitives::traits::BlakeTwo256; use runtime_primitives::generic; @@ -114,7 +112,16 @@ impl Slicable for Log { /// Parachain data types. pub mod parachain { - use super::*; + use codec::{Slicable, Input}; + use rstd::prelude::*; + use rstd::cmp::Ordering; + use super::{Hash, BlakeTwo256}; + + #[cfg(feature = "std")] + use primitives::bytes; + + /// Signature on candidate's block data by a collator. + pub type CandidateSignature = ::runtime_primitives::Ed25519Signature; /// Unique identifier of a parachain. #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] @@ -236,7 +243,7 @@ pub mod parachain { /// The ID of the parachain this is a proposal for. pub parachain_index: Id, /// Collator's signature - pub collator_signature: runtime_primitives::Ed25519Signature, + pub collator_signature: CandidateSignature, /// Unprocessed ingress queue. /// /// Ordered by parachain ID and block number. diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index 9c50684b24721..6aac1d98e28f6 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -224,6 +224,13 @@ pub fn inherent_extrinsics(timestamp: ::primitives::Timestamp, parachain_heads: ] } +/// Checks an unchecked extrinsic for validity. +pub fn check_extrinsic(xt: UncheckedExtrinsic) -> bool { + use runtime_primitives::traits::Checkable; + + xt.check().is_ok() +} + pub mod api { impl_stubs!( authorities => |()| super::Consensus::authorities(), diff --git a/polkadot/transaction-pool/src/lib.rs b/polkadot/transaction-pool/src/lib.rs index 015777a86370e..73270e8366887 100644 --- a/polkadot/transaction-pool/src/lib.rs +++ b/polkadot/transaction-pool/src/lib.rs @@ -38,108 +38,23 @@ use std::{ sync::Arc, }; -use codec::Slicable; use extrinsic_pool::{Pool, txpool::{self, Readiness, scoring::{Change, Choice}}}; use polkadot_api::PolkadotApi; -use primitives::parachain::CandidateReceipt; -use primitives::{AccountId, Timestamp, Hash}; -use runtime::{Block, UncheckedExtrinsic, TimestampCall, ParachainsCall, Call}; -use substrate_primitives::block::{Extrinsic, ExtrinsicHash}; -use substrate_primitives::hexdisplay::HexDisplay; -use substrate_runtime_primitives::traits::{Bounded, Checkable}; +use primitives::{AccountId, Hash}; +use runtime::UncheckedExtrinsic; +use substrate_runtime_primitives::traits::{Bounded, Checkable, BlakeTwo256, Hashing}; pub use extrinsic_pool::txpool::{Options, Status, LightStatus, VerifiedTransaction as VerifiedTransactionOps}; pub use error::{Error, ErrorKind, Result}; -/// Useful functions for working with Polkadot blocks. -pub struct PolkadotBlock { - block: Block, - location: Option<(&'static str, usize)>, -} - -impl PolkadotBlock { - /// Create a new block, checking high-level well-formedness. - pub fn from(unchecked: Block) -> ::std::result::Result { - if unchecked.extrinsics.len() < 2 { - return Err(unchecked); - } - if unchecked.extrinsics[0].is_signed() { - return Err(unchecked); - } - if unchecked.extrinsics[1].is_signed() { - return Err(unchecked); - } - - match unchecked.extrinsics[0].extrinsic.function { - Call::Timestamp(TimestampCall::set(_)) => {}, - _ => return Err(unchecked), - } - - match unchecked.extrinsics[1].extrinsic.function { - Call::Parachains(ParachainsCall::set_heads(_)) => {}, - _ => return Err(unchecked), - } - - // any further checks... - Ok(PolkadotBlock { block: unchecked, location: None }) - } - - /// Create a new block, skipping any high-level well-formedness checks. WARNING: This could - /// result in internal functions panicking if the block is, in fact, not well-formed. - pub fn force_from(known_good: Block, file: &'static str, line: usize) -> Self { - PolkadotBlock { block: known_good, location: Some((file, line)) } - } - - /// Retrieve the timestamp of a Polkadot block. - pub fn timestamp(&self) -> Timestamp { - if let Call::Timestamp(TimestampCall::set(t)) = self.block.extrinsics[0].extrinsic.function { - t - } else { - if let Some((file, line)) = self.location { - panic!("Invalid block used in `PolkadotBlock::force_from` at {}:{}", file, line); - } else { - panic!("Invalid block made it through the PolkadotBlock verification!?"); - } - } - } - - /// Retrieve the parachain candidates proposed for this block. - pub fn parachain_heads(&self) -> &[CandidateReceipt] { - if let Call::Parachains(ParachainsCall::set_heads(ref t)) = self.block.extrinsics[1].extrinsic.function { - &t[..] - } else { - if let Some((file, line)) = self.location { - panic!("Invalid block used in `PolkadotBlock::force_from` at {}:{}", file, line); - } else { - panic!("Invalid block made it through the PolkadotBlock verification!?"); - } - } - } -} - -#[macro_export] -macro_rules! assert_polkadot_block { - ($known_good:expr) => ( PolkadotBlock::force_from(known_good, file!(), line!()) ) -} - -impl ::std::ops::Deref for PolkadotBlock { - type Target = Block; - fn deref(&self) -> &Block { - &self.block - } -} - -impl From for Block { - fn from(pd: PolkadotBlock) -> Self { - pd.block - } -} +/// Type alias for convenience. +pub type CheckedExtrinsic = ::Checked; /// A verified transaction which should be includable and non-inherent. #[derive(Debug, Clone)] pub struct VerifiedTransaction { - inner: ::Checked, - hash: ExtrinsicHash, + inner: CheckedExtrinsic, + hash: Hash, encoded_size: usize, } @@ -153,7 +68,7 @@ impl VerifiedTransaction { let message = codec::Slicable::encode(&xt); match xt.check() { Ok(xt) => { - let hash = substrate_primitives::hashing::blake2_256(&message); + let hash = BlakeTwo256::hash_of(&message); Ok(VerifiedTransaction { inner: xt, hash: hash.into(), @@ -170,7 +85,7 @@ impl VerifiedTransaction { } /// Consume the verified transaciton, yielding the unchecked counterpart. - pub fn into_inner(self) -> ::Checked { + pub fn into_inner(self) -> CheckedExtrinsic { self.inner } @@ -190,8 +105,8 @@ impl VerifiedTransaction { } } -impl AsRef< ::Checked > for VerifiedTransaction { - fn as_ref(&self) -> &::Checked { +impl AsRef for VerifiedTransaction { + fn as_ref(&self) -> &CheckedExtrinsic { &self.inner } } @@ -303,15 +218,12 @@ impl<'a, T: 'a + PolkadotApi> txpool::Ready for Ready<'a, T pub struct Verifier; -impl txpool::Verifier for Verifier { +impl txpool::Verifier for Verifier { type VerifiedTransaction = VerifiedTransaction; type Error = Error; - fn verify_transaction(&self, xt: Extrinsic) -> Result { - info!("Extrinsic submitted: {}", HexDisplay::from(&xt.0)); - let uxt = xt.using_encoded(|ref mut s| UncheckedExtrinsic::decode(s)) - .ok_or_else(|| ErrorKind::InvalidExtrinsicFormat)?; - info!("Correctly formatted: {:?}", uxt); + fn verify_transaction(&self, uxt: UncheckedExtrinsic) -> Result { + info!("Extrinsic Submitted: {:?}", uxt); VerifiedTransaction::create(uxt) } } @@ -320,7 +232,7 @@ impl txpool::Verifier for Verifier { /// /// Wraps a `extrinsic_pool::Pool`. pub struct TransactionPool { - inner: Pool, + inner: Pool, } impl TransactionPool { @@ -337,14 +249,9 @@ impl TransactionPool { } impl Deref for TransactionPool { - type Target = Pool; + type Target = Pool; fn deref(&self) -> &Self::Target { &self.inner } } - -#[cfg(test)] -mod tests { -} - From ff852c8e454cebc8a6a213d5ab1a0971e5393573 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 5 Jun 2018 15:00:54 +0200 Subject: [PATCH 50/60] port polkadot-consensus --- Cargo.lock | 1 + polkadot/api/src/full.rs | 42 ++++++++- polkadot/api/src/lib.rs | 18 +++- polkadot/api/src/light.rs | 23 ++++- polkadot/consensus/Cargo.toml | 1 + polkadot/consensus/src/error.rs | 4 +- polkadot/consensus/src/evaluation.rs | 16 ++-- polkadot/consensus/src/lib.rs | 73 ++++++++------- polkadot/consensus/src/service.rs | 102 +++++++++------------ polkadot/consensus/src/shared_table/mod.rs | 4 +- polkadot/primitives/src/lib.rs | 5 +- polkadot/runtime/src/lib.rs | 95 ++++++++++++++++++- polkadot/statement-table/src/lib.rs | 4 +- polkadot/transaction-pool/src/lib.rs | 9 +- substrate/network/src/lib.rs | 2 +- substrate/network/src/message.rs | 1 + substrate/runtime/consensus/src/lib.rs | 4 +- 17 files changed, 283 insertions(+), 121 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 281db666d7d26..32caa5cfe90fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1308,6 +1308,7 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-network 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/polkadot/api/src/full.rs b/polkadot/api/src/full.rs index 73a9a8ab8c02e..101f59f5a70a1 100644 --- a/polkadot/api/src/full.rs +++ b/polkadot/api/src/full.rs @@ -17,15 +17,16 @@ //! Strongly typed API for full Polkadot client. use client::backend::{Backend, LocalBackend}; +use client::block_builder::BlockBuilder as ClientBlockBuilder; use client::{Client, LocalCallExecutor}; use polkadot_executor::Executor as LocalDispatch; use substrate_executor::{NativeExecutionDispatch, NativeExecutor}; use state_machine; -use primitives::{AccountId, Block, Header, BlockId, Hash, Index, SessionKey, Timestamp}; +use primitives::{AccountId, Block, Header, BlockId, Hash, Index, SessionKey, Timestamp, UncheckedExtrinsic}; use primitives::parachain::{CandidateReceipt, DutyRoster, Id as ParaId}; -use {CheckedBlockId, PolkadotApi, LocalPolkadotApi, ErrorKind, Error, Result}; +use {CheckedBlockId, BlockBuilder, PolkadotApi, LocalPolkadotApi, ErrorKind, Error, Result}; /// A checked block ID used for the substrate-client implementation of CheckedBlockId; #[derive(Debug, Clone, Copy)] @@ -64,10 +65,24 @@ macro_rules! with_runtime { }} } +impl> BlockBuilder for ClientBlockBuilder>, Block> + where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> +{ + fn push_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()> { + self.push(extrinsic).map_err(Into::into) + } + + /// Bake the block with provided extrinsics. + fn bake(self) -> Result { + ClientBlockBuilder::bake(self).map_err(Into::into) + } +} + impl> PolkadotApi for Client>, Block> where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { type CheckedBlockId = CheckedId; + type BlockBuilder = ClientBlockBuilder>, Block>; fn check_id(&self, id: BlockId) -> Result { // bail if the code is not the same as the natively linked. @@ -135,7 +150,16 @@ impl> PolkadotApi for Client) -> Result>> { + fn build_block(&self, at: &CheckedId, timestamp: Timestamp, new_heads: Vec) -> Result { + let mut block_builder = self.new_block_at(at.block_id())?; + for inherent in self.inherent_extrinsics(at, timestamp, new_heads)? { + block_builder.push(inherent)?; + } + + Ok(block_builder) + } + + fn inherent_extrinsics(&self, at: &Self::CheckedBlockId, timestamp: Timestamp, new_heads: Vec) -> Result> { use codec::Slicable; with_runtime!(self, at, || { @@ -214,6 +238,18 @@ mod tests { assert_eq!(client.validators(&id).unwrap(), validators()); } + #[test] + fn build_block_implicit_succeeds() { + let client = client(); + + let id = client.check_id(BlockId::number(0)).unwrap(); + let block_builder = client.build_block(&id, 1_000_000, Vec::new()).unwrap(); + let block = block_builder.bake().unwrap(); + + assert_eq!(block.header.number, 1); + assert!(block.header.extrinsics_root != Default::default()); + } + #[test] fn build_block_with_inherent_succeeds() { let client = client(); diff --git a/polkadot/api/src/lib.rs b/polkadot/api/src/lib.rs index b3c05a6025d30..c92f568f7b59c 100644 --- a/polkadot/api/src/lib.rs +++ b/polkadot/api/src/lib.rs @@ -37,7 +37,7 @@ extern crate substrate_keyring as keyring; pub mod full; pub mod light; -use primitives::{AccountId, Block, BlockId, Hash, Index, SessionKey, Timestamp}; +use primitives::{AccountId, Block, BlockId, Hash, Index, SessionKey, Timestamp, UncheckedExtrinsic}; use primitives::parachain::{CandidateReceipt, DutyRoster, Id as ParaId}; error_chain! { @@ -80,12 +80,23 @@ pub trait CheckedBlockId: Clone + 'static { fn block_id(&self) -> &BlockId; } +/// Build new blocks. +pub trait BlockBuilder { + /// Push an extrinsic onto the block. Fails if the extrinsic is invalid. + fn push_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()>; + + /// Bake the block with provided extrinsics. + fn bake(self) -> Result; +} + /// Trait encapsulating the Polkadot API. /// /// All calls should fail when the exact runtime is unknown. pub trait PolkadotApi { /// A checked block ID. Used to avoid redundancy of code check. type CheckedBlockId: CheckedBlockId; + /// The block builder for this API type. + type BlockBuilder: BlockBuilder; /// Check whether requests at the given block ID can be served. /// @@ -124,9 +135,12 @@ pub trait PolkadotApi { /// and an error if we can't evaluate for some reason. fn evaluate_block(&self, at: &Self::CheckedBlockId, block: Block) -> Result; + /// Build a block on top of the given, with inherent extrinsics pre-pushed. + fn build_block(&self, at: &Self::CheckedBlockId, timestamp: Timestamp, new_heads: Vec) -> Result; + /// Attempt to produce the (encoded) inherent extrinsics for a block being built upon the given. /// This may vary by runtime and will fail if a runtime doesn't follow the same API. - fn inherent_extrinsics(&self, at: &Self::CheckedBlockId, timestamp: Timestamp, new_heads: Vec) -> Result>>; + fn inherent_extrinsics(&self, at: &Self::CheckedBlockId, timestamp: Timestamp, new_heads: Vec) -> Result>; } /// Mark for all Polkadot API implementations, that are making use of state data, stored locally. diff --git a/polkadot/api/src/light.rs b/polkadot/api/src/light.rs index 08a5967f6f127..560c18669922a 100644 --- a/polkadot/api/src/light.rs +++ b/polkadot/api/src/light.rs @@ -21,10 +21,24 @@ use client::backend::{Backend, RemoteBackend}; use client::{Client, CallExecutor}; use codec::Slicable; use state_machine; -use primitives::{AccountId, Block, BlockId, Hash, Index, SessionKey, Timestamp}; +use primitives::{AccountId, Block, BlockId, Hash, Index, SessionKey, Timestamp, UncheckedExtrinsic}; use primitives::parachain::{CandidateReceipt, DutyRoster, Id as ParaId}; use full::CheckedId; -use {PolkadotApi, RemotePolkadotApi, CheckedBlockId, Result, ErrorKind}; +use {PolkadotApi, BlockBuilder, RemotePolkadotApi, CheckedBlockId, Result, ErrorKind}; + +/// Light block builder. TODO: make this work (efficiently) +#[derive(Clone, Copy)] +pub struct LightBlockBuilder; + +impl BlockBuilder for LightBlockBuilder { + fn push_extrinsic(&mut self, _xt: UncheckedExtrinsic) -> Result<()> { + Err(ErrorKind::UnknownRuntime.into()) + } + + fn bake(self) -> Result { + Err(ErrorKind::UnknownRuntime.into()) + } +} /// Remote polkadot API implementation. pub struct RemotePolkadotApiWrapper, E: CallExecutor>(pub Arc>); @@ -33,6 +47,7 @@ impl, E: CallExecutor> PolkadotApi for RemotePolkadotAp where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { type CheckedBlockId = CheckedId; + type BlockBuilder = LightBlockBuilder; fn check_id(&self, id: BlockId) -> Result { Ok(CheckedId(id)) @@ -81,6 +96,10 @@ impl, E: CallExecutor> PolkadotApi for RemotePolkadotAp Err(ErrorKind::UnknownRuntime.into()) } + fn build_block(&self, _at: &Self::CheckedBlockId, _timestamp: Timestamp, _new_heads: Vec) -> Result { + Err(ErrorKind::UnknownRuntime.into()) + } + fn inherent_extrinsics(&self, _at: &Self::CheckedBlockId, _timestamp: Timestamp, _new_heads: Vec) -> Result>> { Err(ErrorKind::UnknownRuntime.into()) } diff --git a/polkadot/consensus/Cargo.toml b/polkadot/consensus/Cargo.toml index 5be758a91bd60..9941a21b33a7a 100644 --- a/polkadot/consensus/Cargo.toml +++ b/polkadot/consensus/Cargo.toml @@ -25,3 +25,4 @@ substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-network = { path = "../../substrate/network" } substrate-keyring = { path = "../../substrate/keyring" } substrate-client = { path = "../../substrate/client" } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } diff --git a/polkadot/consensus/src/error.rs b/polkadot/consensus/src/error.rs index ebc998ab69ec9..acafa88f5e426 100644 --- a/polkadot/consensus/src/error.rs +++ b/polkadot/consensus/src/error.rs @@ -16,7 +16,7 @@ //! Errors that can occur during the consensus process. -use polkadot_primitives::AccountId; +use primitives::AuthorityId; error_chain! { links { @@ -29,7 +29,7 @@ error_chain! { description("Duty Roster had invalid length"), display("Invalid duty roster length: expected {}, got {}", expected, got), } - NotValidator(id: AccountId) { + NotValidator(id: AuthorityId) { description("Local account ID not a validator at this block."), display("Local account ID ({:?}) not a validator at this block.", id), } diff --git a/polkadot/consensus/src/evaluation.rs b/polkadot/consensus/src/evaluation.rs index b5ef81d2446a1..c7c4fe2c25dcc 100644 --- a/polkadot/consensus/src/evaluation.rs +++ b/polkadot/consensus/src/evaluation.rs @@ -19,11 +19,9 @@ use super::MAX_TRANSACTIONS_SIZE; use codec::Slicable; -use polkadot_runtime::Block as PolkadotGenericBlock; -use polkadot_primitives::Timestamp; +use polkadot_runtime::{Block as PolkadotGenericBlock, CheckedBlock}; +use polkadot_primitives::{Block, Hash, BlockNumber, Timestamp}; use polkadot_primitives::parachain::Id as ParaId; -use primitives::block::{Block as SubstrateBlock, HeaderHash, Number as BlockNumber}; -use transaction_pool::PolkadotBlock; error_chain! { links { @@ -51,7 +49,7 @@ error_chain! { description("Proposal included unregistered parachain."), display("Proposal included unregistered parachain {:?}", id), } - WrongParentHash(expected: HeaderHash, got: HeaderHash) { + WrongParentHash(expected: Hash, got: Hash) { description("Proposal had wrong parent hash."), display("Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got), } @@ -72,17 +70,17 @@ error_chain! { /// Attempt to evaluate a substrate block as a polkadot block, returning error /// upon any initial validity checks failing. pub fn evaluate_initial( - proposal: &SubstrateBlock, + proposal: &Block, now: Timestamp, - parent_hash: &HeaderHash, + parent_hash: &Hash, parent_number: BlockNumber, active_parachains: &[ParaId], -) -> Result { +) -> Result { const MAX_TIMESTAMP_DRIFT: Timestamp = 60; let encoded = Slicable::encode(proposal); let proposal = PolkadotGenericBlock::decode(&mut &encoded[..]) - .and_then(|b| PolkadotBlock::from(b).ok()) + .and_then(|b| CheckedBlock::new(b).ok()) .ok_or_else(|| ErrorKind::ProposalNotForPolkadot)?; let transactions_size = proposal.extrinsics.iter().fold(0, |a, tx| { diff --git a/polkadot/consensus/src/lib.rs b/polkadot/consensus/src/lib.rs index 2fa6c66b86326..2e23b256b28e4 100644 --- a/polkadot/consensus/src/lib.rs +++ b/polkadot/consensus/src/lib.rs @@ -37,11 +37,13 @@ extern crate polkadot_statement_table as table; extern crate polkadot_parachain as parachain; extern crate polkadot_transaction_pool as transaction_pool; extern crate polkadot_runtime; +extern crate polkadot_primitives; extern crate substrate_bft as bft; extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_network; extern crate exit_future; @@ -67,11 +69,9 @@ use std::time::{Duration, Instant}; use codec::Slicable; use table::generic::Statement as GenericStatement; use runtime_support::Hashable; -use polkadot_api::{PolkadotApi, BlockBuilder}; -use polkadot_runtime::primitives as polkadot_primitives; -use polkadot_primitives::{Hash, Timestamp}; -use polkadot_primitives::parachain::{Id as ParaId, Chain, DutyRoster, BlockData, Extrinsic, CandidateReceipt}; -use primitives::block::{Block as SubstrateBlock, Header as SubstrateHeader, HeaderHash, Id as BlockId, Number as BlockNumber}; +use polkadot_api::PolkadotApi; +use polkadot_primitives::{Hash, Block, BlockId, BlockNumber, Header, Timestamp}; +use polkadot_primitives::parachain::{Id as ParaId, Chain, DutyRoster, BlockData, Extrinsic as ParachainExtrinsic, CandidateReceipt}; use primitives::AuthorityId; use transaction_pool::{Ready, TransactionPool}; use tokio_core::reactor::{Handle, Timeout, Interval}; @@ -105,10 +105,10 @@ pub trait TableRouter: Clone { /// Future that resolves when candidate data is fetched. type FetchCandidate: IntoFuture; /// Future that resolves when extrinsic candidate data is fetched. - type FetchExtrinsic: IntoFuture; + type FetchExtrinsic: IntoFuture; /// Note local candidate data, making it available on the network to other validators. - fn local_candidate_data(&self, hash: Hash, block_data: BlockData, extrinsic: Extrinsic); + fn local_candidate_data(&self, hash: Hash, block_data: BlockData, extrinsic: ParachainExtrinsic); /// Fetch block data for a specific candidate. fn fetch_block_data(&self, candidate: &CandidateReceipt) -> Self::FetchCandidate; @@ -236,7 +236,7 @@ pub struct ProposerFactory { pub parachain_empty_duration: Duration, } -impl bft::ProposerFactory for ProposerFactory +impl bft::ProposerFactory for ProposerFactory where C: PolkadotApi, N: Network, @@ -245,14 +245,14 @@ impl bft::ProposerFactory for ProposerFactory type Proposer = Proposer; type Error = Error; - fn init(&self, parent_header: &SubstrateHeader, authorities: &[AuthorityId], sign_with: Arc) -> Result { + fn init(&self, parent_header: &Header, authorities: &[AuthorityId], sign_with: Arc) -> Result { use std::time::Duration; const DELAY_UNTIL: Duration = Duration::from_millis(5000); let parent_hash = parent_header.blake2_256().into(); - let checked_id = self.client.check_id(BlockId::Hash(parent_hash))?; + let checked_id = self.client.check_id(BlockId::hash(parent_hash))?; let duty_roster = self.client.duty_roster(&checked_id)?; let random_seed = self.client.random_seed(&checked_id)?; @@ -312,7 +312,7 @@ pub struct Proposer { handle: Handle, local_duty: LocalDuty, local_key: Arc, - parent_hash: HeaderHash, + parent_hash: Hash, parent_id: C::CheckedBlockId, parent_number: BlockNumber, random_seed: Hash, @@ -321,7 +321,7 @@ pub struct Proposer { transaction_pool: Arc, } -impl bft::Proposer for Proposer +impl bft::Proposer for Proposer where C: PolkadotApi, R: TableRouter, @@ -330,7 +330,7 @@ impl bft::Proposer for Proposer type Error = Error; type Create = future::Either< CreateProposal, - future::FutureResult, + future::FutureResult, >; type Evaluate = Box>; @@ -385,7 +385,7 @@ impl bft::Proposer for Proposer }) } - fn evaluate(&self, proposal: &SubstrateBlock) -> Self::Evaluate { + fn evaluate(&self, unchecked_proposal: &Block) -> Self::Evaluate { debug!(target: "bft", "evaluating block on top of parent ({}, {:?})", self.parent_number, self.parent_hash); let active_parachains = match self.client.active_parachains(&self.parent_id) { @@ -397,7 +397,7 @@ impl bft::Proposer for Proposer // do initial serialization and structural integrity checks. let maybe_proposal = evaluation::evaluate_initial( - proposal, + unchecked_proposal, current_timestamp, &self.parent_hash, self.parent_number, @@ -461,7 +461,10 @@ impl bft::Proposer for Proposer // evaluate whether the block is actually valid. // TODO: is it better to delay this until the delays are finished? - let evaluated = self.client.evaluate_block(&self.parent_id, proposal.into()).map_err(Into::into); + let evaluated = self.client + .evaluate_block(&self.parent_id, unchecked_proposal.clone()) + .map_err(Into::into); + let future = future::result(evaluated).and_then(move |good| { let end_result = future::ok(good); if good { @@ -489,13 +492,13 @@ impl bft::Proposer for Proposer proposer } - fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, bft::Misbehavior)>) { + fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, bft::Misbehavior)>) { use bft::generic::Misbehavior as GenericMisbehavior; - use primitives::bft::{MisbehaviorKind, MisbehaviorReport}; + use runtime_primitives::bft::{MisbehaviorKind, MisbehaviorReport}; + use runtime_primitives::MaybeUnsigned; use polkadot_runtime::{Call, Extrinsic, UncheckedExtrinsic, ConsensusCall}; - - let local_id = self.local_key.public().0; + let local_id = self.local_key.public().0.into(); let mut next_index = { let readiness_evaluator = Ready::create(self.parent_id.clone(), &*self.client); let cur_index = self.transaction_pool.cull_and_get_pending(readiness_evaluator, |pending| pending @@ -536,10 +539,11 @@ impl bft::Proposer for Proposer next_index += 1; - let signature = self.local_key.sign(&extrinsic.encode()).into(); + let signature = MaybeUnsigned(self.local_key.sign(&extrinsic.encode()).into()); let uxt = UncheckedExtrinsic { extrinsic, signature }; - self.transaction_pool.import_unchecked_extrinsic(uxt).expect("locally signed extrinsic is valid; qed"); + self.transaction_pool.import_unchecked_extrinsic(uxt) + .expect("locally signed extrinsic is valid; qed"); } } } @@ -603,7 +607,7 @@ impl ProposalTiming { /// Future which resolves upon the creation of a proposal. pub struct CreateProposal { - parent_hash: HeaderHash, + parent_hash: Hash, parent_number: BlockNumber, parent_id: C::CheckedBlockId, client: Arc, @@ -620,14 +624,13 @@ impl CreateProposal R: TableRouter, P: Collators, { - fn propose_with(&self, candidates: Vec) -> Result { + fn propose_with(&self, candidates: Vec) -> Result { + use polkadot_api::BlockBuilder; + use runtime_primitives::traits::{Hashing, BlakeTwo256}; + // TODO: handle case when current timestamp behind that in state. let timestamp = current_timestamp(); - let mut block_builder = self.client.build_block( - &self.parent_id, - timestamp, - candidates, - )?; + let mut block_builder = self.client.build_block(&self.parent_id, timestamp, candidates)?; { let readiness_evaluator = Ready::create(self.parent_id.clone(), &*self.client); @@ -643,7 +646,7 @@ impl CreateProposal if pending_size + pending.encoded_size() >= MAX_TRANSACTIONS_SIZE { break } - match block_builder.push_extrinsic(pending.as_transaction().clone()) { + match block_builder.push_extrinsic(pending.primitive_extrinsic()) { Ok(()) => { pending_size += pending.encoded_size(); } @@ -658,14 +661,14 @@ impl CreateProposal self.transaction_pool.remove(&unqueue_invalid, false); } - let polkadot_block = block_builder.bake(); + let polkadot_block = block_builder.bake()?; info!("Proposing block [number: {}; hash: {}; parent_hash: {}; extrinsics: [{}]]", polkadot_block.header.number, - Hash::from(polkadot_block.header.blake2_256()), + Hash::from(polkadot_block.header.hash()), polkadot_block.header.parent_hash, polkadot_block.extrinsics.iter() - .map(|xt| format!("{}", Hash::from(xt.blake2_256()))) + .map(|xt| format!("{}", BlakeTwo256::hash_of(xt))) .collect::>() .join(", ") ); @@ -693,10 +696,10 @@ impl Future for CreateProposal R: TableRouter, P: Collators, { - type Item = SubstrateBlock; + type Item = Block; type Error = Error; - fn poll(&mut self) -> Poll { + fn poll(&mut self) -> Poll { // 1. poll local collation future. match self.collation.poll() { Ok(Async::Ready((collation, extrinsic))) => { diff --git a/polkadot/consensus/src/service.rs b/polkadot/consensus/src/service.rs index dedab9213516f..f1ee7f49fe3b2 100644 --- a/polkadot/consensus/src/service.rs +++ b/polkadot/consensus/src/service.rs @@ -29,10 +29,9 @@ use ed25519; use futures::prelude::*; use futures::{future, Canceled}; use polkadot_api::LocalPolkadotApi; -use polkadot_primitives::AccountId; +use polkadot_primitives::{BlockId, Block, Header, Hash, AccountId}; use polkadot_primitives::parachain::{Id as ParaId, BlockData, Extrinsic, CandidateReceipt}; -use primitives::{Hash, AuthorityId}; -use primitives::block::{Id as BlockId, HeaderHash, Header}; +use primitives::AuthorityId; use runtime_support::Hashable; use substrate_network as net; use tokio_core::reactor; @@ -45,19 +44,19 @@ const TIMER_DELAY_MS: u64 = 5000; const TIMER_INTERVAL_MS: u64 = 500; struct BftSink { - network: Arc, - parent_hash: HeaderHash, + network: Arc>, + parent_hash: Hash, _e: ::std::marker::PhantomData, } struct Messages { - network_stream: net::BftMessageStream, + network_stream: net::BftMessageStream, local_id: AuthorityId, authorities: Vec, } impl Stream for Messages { - type Item = bft::Communication; + type Item = bft::Communication; type Error = bft::Error; fn poll(&mut self) -> Poll, Self::Error> { @@ -81,10 +80,10 @@ impl Stream for Messages { } } -fn process_message(msg: net::LocalizedBftMessage, local_id: &AuthorityId, authorities: &[AuthorityId]) -> Result, bft::Error> { +fn process_message(msg: net::LocalizedBftMessage, local_id: &AuthorityId, authorities: &[AuthorityId]) -> Result>, bft::Error> { Ok(Some(match msg.message { - net::BftMessage::Consensus(c) => bft::generic::Communication::Consensus(match c { - net::SignedConsensusMessage::Propose(proposal) => bft::generic::LocalizedMessage::Propose({ + net::generic_message::BftMessage::Consensus(c) => bft::generic::Communication::Consensus(match c { + net::generic_message::SignedConsensusMessage::Propose(proposal) => bft::generic::LocalizedMessage::Propose({ if &proposal.sender == local_id { return Ok(None) } let proposal = bft::generic::LocalizedProposal { round_number: proposal.round_number as usize, @@ -105,7 +104,7 @@ fn process_message(msg: net::LocalizedBftMessage, local_id: &AuthorityId, author trace!(target: "bft", "importing proposal message for round {} from {}", proposal.round_number, Hash::from(proposal.sender)); proposal }), - net::SignedConsensusMessage::Vote(vote) => bft::generic::LocalizedMessage::Vote({ + net::generic_message::SignedConsensusMessage::Vote(vote) => bft::generic::LocalizedMessage::Vote({ if &vote.sender == local_id { return Ok(None) } let vote = bft::generic::LocalizedVote { sender: vote.sender, @@ -114,21 +113,21 @@ fn process_message(msg: net::LocalizedBftMessage, local_id: &AuthorityId, author signer: ed25519::Public(vote.sender), }, vote: match vote.vote { - net::ConsensusVote::Prepare(r, h) => bft::generic::Vote::Prepare(r as usize, h), - net::ConsensusVote::Commit(r, h) => bft::generic::Vote::Commit(r as usize, h), - net::ConsensusVote::AdvanceRound(r) => bft::generic::Vote::AdvanceRound(r as usize), + net::generic_message::ConsensusVote::Prepare(r, h) => bft::generic::Vote::Prepare(r as usize, h), + net::generic_message::ConsensusVote::Commit(r, h) => bft::generic::Vote::Commit(r as usize, h), + net::generic_message::ConsensusVote::AdvanceRound(r) => bft::generic::Vote::AdvanceRound(r as usize), } }; - bft::check_vote(authorities, &msg.parent_hash, &vote)?; + bft::check_vote::(authorities, &msg.parent_hash, &vote)?; trace!(target: "bft", "importing vote {:?} from {}", vote.vote, Hash::from(vote.sender)); vote }), }), - net::BftMessage::Auxiliary(a) => { - let justification = bft::UncheckedJustification::from(a); + net::generic_message::BftMessage::Auxiliary(a) => { + let justification = bft::UncheckedJustification::::from(a); // TODO: get proper error - let justification: Result<_, bft::Error> = bft::check_prepare_justification(authorities, msg.parent_hash, justification) + let justification: Result<_, bft::Error> = bft::check_prepare_justification::(authorities, msg.parent_hash, justification) .map_err(|_| bft::ErrorKind::InvalidJustification.into()); bft::generic::Communication::Auxiliary(justification?) }, @@ -136,15 +135,15 @@ fn process_message(msg: net::LocalizedBftMessage, local_id: &AuthorityId, author } impl Sink for BftSink { - type SinkItem = bft::Communication; + type SinkItem = bft::Communication; // TODO: replace this with the ! type when that's stabilized type SinkError = E; - fn start_send(&mut self, message: bft::Communication) -> ::futures::StartSend { - let network_message = net::LocalizedBftMessage { + fn start_send(&mut self, message: bft::Communication) -> ::futures::StartSend, E> { + let network_message = net::generic_message::LocalizedBftMessage { message: match message { - bft::generic::Communication::Consensus(c) => net::BftMessage::Consensus(match c { - bft::generic::LocalizedMessage::Propose(proposal) => net::SignedConsensusMessage::Propose(net::SignedConsensusProposal { + bft::generic::Communication::Consensus(c) => net::generic_message::BftMessage::Consensus(match c { + bft::generic::LocalizedMessage::Propose(proposal) => net::generic_message::SignedConsensusMessage::Propose(net::generic_message::SignedConsensusProposal { round_number: proposal.round_number as u32, proposal: proposal.proposal, digest: proposal.digest, @@ -152,17 +151,17 @@ impl Sink for BftSink { digest_signature: proposal.digest_signature.signature, full_signature: proposal.full_signature.signature, }), - bft::generic::LocalizedMessage::Vote(vote) => net::SignedConsensusMessage::Vote(net::SignedConsensusVote { + bft::generic::LocalizedMessage::Vote(vote) => net::generic_message::SignedConsensusMessage::Vote(net::generic_message::SignedConsensusVote { sender: vote.sender, signature: vote.signature.signature, vote: match vote.vote { - bft::generic::Vote::Prepare(r, h) => net::ConsensusVote::Prepare(r as u32, h), - bft::generic::Vote::Commit(r, h) => net::ConsensusVote::Commit(r as u32, h), - bft::generic::Vote::AdvanceRound(r) => net::ConsensusVote::AdvanceRound(r as u32), + bft::generic::Vote::Prepare(r, h) => net::generic_message::ConsensusVote::Prepare(r as u32, h), + bft::generic::Vote::Commit(r, h) => net::generic_message::ConsensusVote::Commit(r as u32, h), + bft::generic::Vote::AdvanceRound(r) => net::generic_message::ConsensusVote::AdvanceRound(r as u32), } }), }), - bft::generic::Communication::Auxiliary(justification) => net::BftMessage::Auxiliary(justification.uncheck().into()), + bft::generic::Communication::Auxiliary(justification) => net::generic_message::BftMessage::Auxiliary(justification.uncheck().into()), }, parent_hash: self.parent_hash, }; @@ -175,7 +174,7 @@ impl Sink for BftSink { } } -struct Network(Arc); +struct Network(Arc>); impl super::Network for Network { type TableRouter = Router; @@ -189,20 +188,20 @@ impl super::Network for Network { fn start_bft( header: &Header, handle: reactor::Handle, - client: &bft::Authorities, - network: Arc, - bft_service: &BftService, + client: &bft::Authorities, + network: Arc>, + bft_service: &BftService, ) where - F: bft::ProposerFactory + 'static, - C: bft::BlockImport + bft::Authorities + 'static, - ::Error: ::std::fmt::Debug, - ::Error: ::std::fmt::Display + Into, + F: bft::ProposerFactory + 'static, + C: bft::BlockImport + bft::Authorities + 'static, + >::Error: ::std::fmt::Debug, + >::Error: ::std::fmt::Display + Into, { - let parent_hash = header.blake2_256().into(); + let parent_hash = header.hash(); if bft_service.live_agreement().map_or(false, |h| h == parent_hash) { return; } - let authorities = match client.authorities(&BlockId::Hash(parent_hash)) { + let authorities = match client.authorities(&BlockId::hash(parent_hash)) { Ok(authorities) => authorities, Err(e) => { debug!("Error reading authorities: {:?}", e); @@ -235,14 +234,14 @@ impl Service { pub fn new( client: Arc, api: Arc, - network: Arc, + network: Arc>, transaction_pool: Arc, parachain_empty_duration: Duration, key: ed25519::Pair, ) -> Service where A: LocalPolkadotApi + Send + Sync + 'static, - C: BlockchainEvents + ChainHead + bft::BlockImport + bft::Authorities + Send + Sync + 'static, + C: BlockchainEvents + ChainHead + bft::BlockImport + bft::Authorities + Send + Sync + 'static, { let (signal, exit) = ::exit_future::signal(); let thread = thread::spawn(move || { @@ -346,36 +345,25 @@ impl ::collation::Collators for NoCollators { fn note_bad_collator(&self, _collator: AccountId) { } } -type FetchCandidateAdapter = future::Map) -> BlockData>; - #[derive(Clone)] struct Router { - network: Arc, -} - -impl Router { - fn fetch_candidate_adapter(data: Vec) -> BlockData { - BlockData(data) - } + network: Arc>, } impl TableRouter for Router { type Error = Canceled; - type FetchCandidate = FetchCandidateAdapter; + type FetchCandidate = future::Empty; type FetchExtrinsic = future::FutureResult; - fn local_candidate_data(&self, hash: Hash, block_data: BlockData, _extrinsic: Extrinsic) { - let data = block_data.0; - self.network.set_local_candidate(Some((hash, data))) + fn local_candidate_data(&self, _hash: Hash, _block_data: BlockData, _extrinsic: Extrinsic) { + // TODO } - fn fetch_block_data(&self, candidate: &CandidateReceipt) -> Self::FetchCandidate { - let hash = candidate.hash(); - self.network.fetch_candidate(&hash).map(Self::fetch_candidate_adapter) + fn fetch_block_data(&self, _candidate: &CandidateReceipt) -> Self::FetchCandidate { + future::empty() } fn fetch_extrinsic_data(&self, _candidate: &CandidateReceipt) -> Self::FetchExtrinsic { future::ok(Extrinsic) } } - diff --git a/polkadot/consensus/src/shared_table/mod.rs b/polkadot/consensus/src/shared_table/mod.rs index 23e936eefea80..120fbb7fec365 100644 --- a/polkadot/consensus/src/shared_table/mod.rs +++ b/polkadot/consensus/src/shared_table/mod.rs @@ -486,7 +486,7 @@ mod tests { let candidate = CandidateReceipt { parachain_index: para_id, - collator: [1; 32], + collator: [1; 32].into(), head_data: ::polkadot_primitives::parachain::HeadData(vec![1, 2, 3, 4]), balance_uploads: Vec::new(), egress_queue_roots: Vec::new(), @@ -536,7 +536,7 @@ mod tests { let candidate = CandidateReceipt { parachain_index: para_id, - collator: [1; 32], + collator: [1; 32].into(), head_data: ::polkadot_primitives::parachain::HeadData(vec![1, 2, 3, 4]), balance_uploads: Vec::new(), egress_queue_roots: Vec::new(), diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index 5c79b92684eed..727a12e41fb21 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -47,12 +47,15 @@ use codec::{Input, Slicable}; /// Block header type as expected by this runtime. pub type Header = generic::Header; +/// Opaque, encoded, unchecked extrinsic. +pub type UncheckedExtrinsic = Vec; + /// A "future-proof" block type for Polkadot. This will be resilient to upgrades in transaction /// format, because it doesn't attempt to decode extrinsics. /// /// Specialized code needs to link to (at least one version of) the runtime directly /// in order to handle the extrinsics within. -pub type Block = generic::Block>; +pub type Block = generic::Block; /// An index to a block. /// 32-bits will allow for 136 years of blocks assuming 1 block per second. diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index 6aac1d98e28f6..fc13326d677c7 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -78,13 +78,104 @@ pub const PARACHAINS_SET_POSITION: u32 = 1; /// Block Id type for this block. pub type BlockId = generic::BlockId; -/// Block type as expected by this runtime. -pub type Block = generic::Block; /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type as expected by this runtime. pub type Extrinsic = generic::Extrinsic; +/// Block type as expected by this runtime. +pub type Block = generic::Block; + +/// Provides a type-safe wrapper around a structurally valid block. +#[cfg(feature = "std")] +pub struct CheckedBlock { + inner: Block, + file_line: Option<(&'static str, u32)>, +} + +#[cfg(feature = "std")] +impl CheckedBlock { + /// Create a new checked block. Fails if the block is not structurally valid. + pub fn new(block: Block) -> Result { + let has_timestamp = block.extrinsics.get(TIMESTAMP_SET_POSITION as usize).map_or(false, |xt| { + !xt.is_signed() && match xt.extrinsic.function { + Call::Timestamp(TimestampCall::set(_)) => true, + _ => false, + } + }); + + if !has_timestamp { return Err(block) } + + let has_heads = block.extrinsics.get(PARACHAINS_SET_POSITION as usize).map_or(false, |xt| { + !xt.is_signed() && match xt.extrinsic.function { + Call::Parachains(ParachainsCall::set_heads(_)) => true, + _ => false, + } + }); + + if !has_heads { return Err(block) } + Ok(CheckedBlock { + inner: block, + file_line: None, + }) + } + + // Creates a new checked block, asserting that it is valid. + #[doc(hidden)] + pub fn new_unchecked(block: Block, file: &'static str, line: u32) -> Self { + CheckedBlock { + inner: block, + file_line: Some((file, line)), + } + } + + /// Extract the timestamp from the block. + pub fn timestamp(&self) -> ::primitives::Timestamp { + let x = self.inner.extrinsics.get(TIMESTAMP_SET_POSITION as usize).and_then(|xt| match xt.extrinsic.function { + Call::Timestamp(TimestampCall::set(x)) => Some(x), + _ => None + }); + + match x { + Some(x) => x, + None => panic!("Invalid polkadot block asserted at {:?}", self.file_line), + } + } + + /// Extract the parachain heads from the block. + pub fn parachain_heads(&self) -> &[CandidateReceipt] { + let x = self.inner.extrinsics.get(PARACHAINS_SET_POSITION as usize).and_then(|xt| match xt.extrinsic.function { + Call::Parachains(ParachainsCall::set_heads(ref x)) => Some(&x[..]), + _ => None + }); + + match x { + Some(x) => x, + None => panic!("Invalid polkadot block asserted at {:?}", self.file_line), + } + } + + /// Convert into inner block. + pub fn into_inner(self) -> Block { self.inner } +} + +#[cfg(feature = "std")] +impl ::std::ops::Deref for CheckedBlock { + type Target = Block; + + fn deref(&self) -> &Block { &self.inner } +} + +/// Assert that a block is structurally valid. May lead to panic in the future +/// in case it isn't. +#[cfg(feature = "std")] +#[macro_export] +macro_rules! assert_polkadot_block { + ($block: expr) => { + $crate::CheckedBlock::new_unchecked($block, file!(), line!()) + } +} + /// Concrete runtime type used to parameterize the various modules. pub struct Concrete; diff --git a/polkadot/statement-table/src/lib.rs b/polkadot/statement-table/src/lib.rs index e3abf95686900..86b95b0d90ff1 100644 --- a/polkadot/statement-table/src/lib.rs +++ b/polkadot/statement-table/src/lib.rs @@ -21,8 +21,8 @@ pub mod generic; pub use generic::Table; -use primitives::parachain::{Id, CandidateReceipt}; -use primitives::{SessionKey, Hash, Signature}; +use primitives::parachain::{Id, CandidateReceipt, CandidateSignature as Signature}; +use primitives::{SessionKey, Hash}; /// Statements about candidates on the network. pub type Statement = generic::Statement; diff --git a/polkadot/transaction-pool/src/lib.rs b/polkadot/transaction-pool/src/lib.rs index 73270e8366887..2cf29872c21cc 100644 --- a/polkadot/transaction-pool/src/lib.rs +++ b/polkadot/transaction-pool/src/lib.rs @@ -38,6 +38,7 @@ use std::{ sync::Arc, }; +use codec::Slicable; use extrinsic_pool::{Pool, txpool::{self, Readiness, scoring::{Change, Choice}}}; use polkadot_api::PolkadotApi; use primitives::{AccountId, Hash}; @@ -65,7 +66,7 @@ impl VerifiedTransaction { bail!(ErrorKind::IsInherent(xt)) } - let message = codec::Slicable::encode(&xt); + let message = Slicable::encode(&xt); match xt.check() { Ok(xt) => { let hash = BlakeTwo256::hash_of(&message); @@ -84,6 +85,12 @@ impl VerifiedTransaction { self.as_ref().as_unchecked() } + /// Convert to primitive unchecked extrinsic. + pub fn primitive_extrinsic(&self) -> ::primitives::UncheckedExtrinsic { + Slicable::decode(&mut self.as_transaction().encode().as_slice()) + .expect("UncheckedExtrinsic shares repr with Vec; qed") + } + /// Consume the verified transaciton, yielding the unchecked counterpart. pub fn into_inner(self) -> CheckedExtrinsic { self.inner diff --git a/substrate/network/src/lib.rs b/substrate/network/src/lib.rs index fb233709cf7f9..202a081510e8b 100644 --- a/substrate/network/src/lib.rs +++ b/substrate/network/src/lib.rs @@ -65,7 +65,7 @@ pub use service::{Service, FetchFuture, ConsensusService, BftMessageStream, pub use protocol::{ProtocolStatus}; pub use sync::{Status as SyncStatus, SyncState}; pub use network::{NonReservedPeerMode, NetworkConfiguration, ConnectionFilter, ConnectionDirection}; -pub use message::{BftMessage, LocalizedBftMessage, ConsensusVote, SignedConsensusVote, SignedConsensusMessage, SignedConsensusProposal}; +pub use message::{generic as generic_message, BftMessage, LocalizedBftMessage, ConsensusVote, SignedConsensusVote, SignedConsensusMessage, SignedConsensusProposal}; pub use error::Error; pub use config::{Role, ProtocolConfig}; pub use on_demand::{OnDemand, OnDemandService, Response as OnDemandResponse}; diff --git a/substrate/network/src/message.rs b/substrate/network/src/message.rs index 5b75c052d9dd3..1b1b3c1424de0 100644 --- a/substrate/network/src/message.rs +++ b/substrate/network/src/message.rs @@ -289,6 +289,7 @@ pub mod generic { RemoteCallResponse(RemoteCallResponse), } + /// Status sent on connection. #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] pub struct Status { /// Protocol version. diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 0f73c6b0b0e9e..6a8fa64a6b804 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -68,7 +68,7 @@ decl_module! { #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { - fn report_misbehavior(aux, report: MisbehaviorReport) -> Result = 0; + fn report_misbehavior(aux, report: MisbehaviorReport) -> Result = 0; } #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] @@ -99,7 +99,7 @@ impl Module { } /// Report some misbehaviour. - fn report_misbehavior(_aux: &T::PublicAux, _report: MisbehaviorReport) -> Result { + fn report_misbehavior(_aux: &T::PublicAux, _report: MisbehaviorReport) -> Result { // TODO. Ok(()) } From ddf5a5dbf489fe94906df52578337da661baefbc Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 5 Jun 2018 17:04:45 +0200 Subject: [PATCH 51/60] port substrate-rpc --- Cargo.lock | 38 +++++++++++++++++---- substrate/rpc/Cargo.toml | 6 ++-- substrate/rpc/src/author/mod.rs | 9 ++--- substrate/rpc/src/author/tests.rs | 5 ++- substrate/rpc/src/chain/mod.rs | 38 ++++++++++----------- substrate/rpc/src/chain/tests.rs | 7 ++-- substrate/rpc/src/state/mod.rs | 56 +++++++++++++++++-------------- 7 files changed, 94 insertions(+), 65 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 32caa5cfe90fc..647b1aadd449e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -805,6 +805,18 @@ dependencies = [ "serde_json 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "jsonrpc-core" +version = "8.0.2" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "jsonrpc-http-server" version = "8.0.1" @@ -821,10 +833,10 @@ dependencies = [ [[package]] name = "jsonrpc-macros" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro#1264963914cedabdd184517738a082cc0a3d1efa" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" dependencies = [ - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", - "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -838,6 +850,16 @@ dependencies = [ "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "jsonrpc-pubsub" +version = "8.0.1" +source = "git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits#3c72add50ff1ad10d9bc537c762cdbd0c65314b5" +dependencies = [ + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "jsonrpc-server-utils" version = "8.0.1" @@ -2040,9 +2062,9 @@ version = "0.1.0" dependencies = [ "assert_matches 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", - "jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", - "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)", + "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", + "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 0.1.0", @@ -2939,9 +2961,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4833d6978da405305126af4ac88569b5d71ff758581ce5a987dbfa3755f694fc" "checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682" "checksum jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" +"checksum jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" "checksum jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" -"checksum jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" +"checksum jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" "checksum jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" +"checksum jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=rh-generic-traits)" = "" "checksum jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" "checksum jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=forward_types_in_macro)" = "" "checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" diff --git a/substrate/rpc/Cargo.toml b/substrate/rpc/Cargo.toml index e59b23cd68afb..8c78ecb27f0c0 100644 --- a/substrate/rpc/Cargo.toml +++ b/substrate/rpc/Cargo.toml @@ -5,9 +5,9 @@ authors = ["Parity Technologies "] [dependencies] error-chain = "0.11" -jsonrpc-core = { git="https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } -jsonrpc-macros = { git="https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } -jsonrpc-pubsub = { git="https://github.com/paritytech/jsonrpc.git", branch="forward_types_in_macro" } +jsonrpc-core = { git="https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } +jsonrpc-macros = { git="https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } +jsonrpc-pubsub = { git="https://github.com/paritytech/jsonrpc.git", branch="rh-generic-traits" } log = "0.3" parking_lot = "0.4" substrate-client = { path = "../client" } diff --git a/substrate/rpc/src/author/mod.rs b/substrate/rpc/src/author/mod.rs index 317d50df40803..4ed850db55837 100644 --- a/substrate/rpc/src/author/mod.rs +++ b/substrate/rpc/src/author/mod.rs @@ -28,17 +28,18 @@ use self::error::Result; build_rpc_trait! { /// Substrate authoring RPC API - pub trait AuthorApi { + pub trait AuthorApi { /// Submit extrinsic for inclusion in block. #[rpc(name = "author_submitExtrinsic")] - fn submit_extrinsic(&self, Ex) -> Result; + fn submit_extrinsic(&self, Extrinsic) -> Result; } } -impl AuthorApi for Arc where +impl AuthorApi for Arc where T: ExtrinsicPool, + T::Error: 'static, { - fn submit_extrinsic(&self, xt: B::Extrinsic) -> Result { + fn submit_extrinsic(&self, xt: Ex) -> Result { self .submit(vec![xt]) .map(|mut res| res.pop().expect("One extrinsic passed; one result back; qed")) diff --git a/substrate/rpc/src/author/tests.rs b/substrate/rpc/src/author/tests.rs index 94905ed6756a5..8e9963613d66e 100644 --- a/substrate/rpc/src/author/tests.rs +++ b/substrate/rpc/src/author/tests.rs @@ -47,7 +47,7 @@ impl api::ExtrinsicPool for DummyTxPool { fn submit(&self, xt: Vec) -> ::std::result::Result, Self::Error> { let mut submitted = self.submitted.lock(); if submitted.len() < 1 { - let hashes = xt.iter().map(|_xt| 1.into()).collect(); + let hashes = xt.iter().map(|_xt| 1).collect(); submitted.extend(xt); Ok(hashes) } else { @@ -59,11 +59,10 @@ impl api::ExtrinsicPool for DummyTxPool { #[test] fn submit_transaction_should_not_cause_error() { let p = Arc::new(DummyTxPool::default()); - let hash: Hash = 1.into(); assert_matches!( AuthorApi::submit_extrinsic(&p, 5), - Ok(hash) + Ok(1) ); assert!( AuthorApi::submit_extrinsic(&p, 5).is_err() diff --git a/substrate/rpc/src/chain/mod.rs b/substrate/rpc/src/chain/mod.rs index 4f4a1fd70f9f8..04bd4896b555a 100644 --- a/substrate/rpc/src/chain/mod.rs +++ b/substrate/rpc/src/chain/mod.rs @@ -18,7 +18,8 @@ use std::sync::Arc; -use primitives::block; +use runtime_primitives::traits::Block as BlockT; +use runtime_primitives::generic::BlockId; use client::{self, Client, BlockchainEvents}; use state_machine; @@ -38,22 +39,21 @@ use self::error::{Result, ResultExt}; build_rpc_trait! { /// Polkadot blockchain API - pub trait ChainApi { + pub trait ChainApi { type Metadata; - ASSOCIATED type Header; /// Get header of a relay chain block. #[rpc(name = "chain_getHeader")] - fn header(&self, block::HeaderHash) -> Result>; + fn header(&self, Hash) -> Result>; /// Get hash of the head. #[rpc(name = "chain_getHead")] - fn head(&self) -> Result; + fn head(&self) -> Result; #[pubsub(name = "chain_newHead")] { /// New head subscription #[rpc(name = "subscribe_newHead")] - fn subscribe_new_head(&self, Self::Metadata, pubsub::Subscriber); + fn subscribe_new_head(&self, Self::Metadata, pubsub::Subscriber

    zob7ZYftw~fP!K|(PlpRnMynIX$%Plz<)WVKuzMJaOJQCt-NH-pHO-X)g-FjB`B(`i z-Gh7g0;aqV5HB^KC%b2v@!9q^jNHvsmQdur1O+tc8y;=5JlZn=eH$IwW0HW)7_l5K z2xW&Tiq;6MhqHJgF37i#)zZZ#+l@2gLT{(|rjIw{HmvFxF>^F-!woB#&?hty>WI`= z!8orpJY%(VPiI#uqkAyBQU%>xvn!R)JrJ*atBMoFWi+SdFV;9F(9d+yirUjycJzTM>U<7P6h-VP=TqC*)3TXI>Q5ejO z^(X5DOw!|<1do$|wkKFhufgb*NX0W#<$z~KS9oT0g=a=rcxH5kXGSUmo*7+XB5Iz{ zis3cvajGo9Gc%M?zYwE&l( zj|Sf>Y1sQrTkL-5{@NV5#e3~4rPfW|f0(A_QMARKDh-9(m^NCI-rn-^uX0rq^8%+q z2x&nm4`|yGq$l{yDtfw^0P@3?uYMGMprsU*%uXvuDu1X3h4fPHgoc&MAE-eh9TZ=w z{BFGBI;zO0euR#{WO(C>F|be6JvagTt4fpgc)wzLV2lF-Im-Q-v9DhFE5)z=(X_9U zD{+PJB(T-L3Tei2Ht65}efxGxKv4k!d=vnM9OjtYJpJ1rDSi7x@v1oDb-(S?2E1(2 z6Lyq^i-rqT;e|PZ5y(g5l1hLI0gMS7JlE0#IXuKe*b^GK|7PrkN}a3W3weWQ27WGY z@QM3u-oX7o7q5!Lcu^p<#il7BOmEFQB7E9y-~DuaPwdFw$s4>QFXj#2k)O;P=*W-8 zt71p~CLQ_wMmi$Qea$+;EZXc1rI-7eLh7VN5XLF-Xny;bIY;59r!0jZX1P@2m#8oj z%Q~FV{cLR>X?LWu`@U*IJHTo@J@}{_?|3-93C+Na4XyPfT#i(e`zqSd598?Uh=2?B z{q{HslR)|?tL6VqZJ{yVr&InH9;&VNKm4*nJO^NH@M1)*gxr0SVg=&1#5xIx=lh_b zDzOQJXqxc=1=@Eaz}J3_Ig^U7A^CRdYj#L|%6n72&fdskU;8zTp**PJ8oderfC!th z-tbiUH3U#j9n?0tPV+&PL43NuAWKA>7Gub>12&ppXmK-O!Qqo(K53GbjuT6oaT04!NuXtr`18p92**IadJ3L(1I4!iqGud zz%yZO4q7%xDLXUn5K$V=nvtxpHk@*iby91&0lXd}1$6={h{fDWZw6@2Nwu zoR4ho#$KZY3VaR)&C#`CqcomE>k23 z*0zQ|m);`xcG3bX#tLyotBXnFaFiq5%;t)PIvVR8}g# z6R(Q)#b3p~c%@*W0s^z5`}ZgSr@jKJQ=?P3+KASqnf9AxUdDS*5So+DA_Ag z@o?oc!abKo@)I1X{I_awe~z2ye>-AlB%hzo8$jish*w4A{c9laOZAeg#gX@r7WN7b zi$iq89Ts1V?}>hbf1EdXM}8%5a6iG%=M8k^zmHeNj!bb_ct;Mhd{~^5gEwVPZqqX4 z2D!rui<0T~d`?#A!Mt&Y55HDxR>w?{B3C*TnBn0aSSWaFdmL*%(LP%d%{7*n4lvut#X2#i5M8 z5ktXV-!QCiVNJC->|3&7|85C0Ux`;m5?oV|?O|cLIP5*wKWyCl1xjLl=<7jAyR>4u zLE>KO?cMObJ7x7tT|!S}U2X%4#SRt%i}SG~n~xh&EEct{x54pkSEOx0plqiHH(8*Z zav?G#h$};(`(xE zdGmtBp4%Q=VL4$^hn~~QUqR4NEA}Sn(0zH(GE@hv*3sg7T5T-!K!plUXg87J9%^@lEJ~_97_0RnE&BAJ>feqBe#xEv@+$#-*|zH{Jt6 z-3pLhA7>j{XD+ZKmR!Cb@~EzL?7~2`_;=$2t(g-lf_i-vs%q`LFi?3sZoUdjyd@{^o40!Akt~ ztQ%eHGqx*=ZCWy_+0HKM?QFM!pQ%1~q;kvNJMY|@?6`AJ_s%=#`n#8R_O|W1b+mcY z%5ANs&g@|S_5;lYLMt2f#X|?T%vV@GI9#a?aX}4h(o`x`v%(0R?<#^Z{B)3?PzZ2h z%MDI&ZT0S2d)P{EqaD}pMEk9@6SO$dzMFQutP|}AXeXL)qJ4#SRMUy}gmyyvCfaYI zoe0H3yAQ25(eC|UpdCdnyPs%HgF)UfPXj7hb)~NH9_4Bp9ENMO@1z|+V)nWSw;i+- zHI%iJj#g7NQPvP|+)w+iLOY=@HLa;l+_;r?7Re^s_tMU)SD42`T;WJlefLr0Q=^vE zs%GzOt5sc7LNWE*EWo)Y2W2f-q(q8rQ_&ssTE0al=_=psfq0A%wHsro36=OM8XLzXs)@v96w z{8Q|=3hFELV2*$D{8LKRrrOEcN$6n)y(9$9TaYV#1fI_NzG_S<9>T+eD z%8oBr5~^5pSfqkAhXo4wa2Qa#heMCjJsjG@B^?^1cU1jj`e6KzP`ml3M!O{ws=mkd zuHlyWqmD^+uB%M6_H1KwuL)VwG+=}r_K4*7uslSb|3Iq|y4z7$zi8dorLGW=VhL3~ z_U>4y^%mVS2*1;_1W*i{{7s4fcv!+%l+EHhQqQRTPFRGVRqIXCJ-f>MMD8My!7pg z9_~blR))8Qp)B*c6}m~jgAMPXLsrGJ_~aoy)lLpsRc>~&9v-%NJe<#?a@fOLx&Lrj z&at|!{M55f2nT%rK~paqsf`ABGRs}BMBIn~nZ$|1gqsbk_K|D`50A|tWu2-@1l0P@ z?bi2v#MLn3LyY)#MohekkC>yNp-LBrlig|mk$y+oCsWP8L?;Ic%;dvI^hPSf@h5gO zpXVO0J;J;lW!^gQYwl-DCIRsdJwXDzmP$d3ZUmylW&~8_rUFXjWPmbBqR$tmDbX-9 zDBWqD%b|2o<7OClFq}Jql7??Ez>(-M5*!UqL_Q%H_zpqj8s}Yl)ogN?r890yX5%=0 zjfQ^;TT|;6&Uy@ z@CaElAUpyP3^|Bp6%g*$i)NC$0}y83NI*Dleb0e#n1KoicLRju0D(o+5)cHWs#A=Y z1cu>35Y9oC^s-&yWdLST*W2}HG0wnNh5v5zD`KAYte9p|z{K-p_uQP4!DeS?>y2)+ zHPfCI=9NC8Ps}De!u!yG$lGZrJC*0Q)8){vt8vYe971QJ9EClu?S^)`fLZ??^eISs zjWp;2alBQO7(;#+Fz8;C+^|=(>s7MLdMOUED{x0VPK?`W|Jm_;)*p#4JRu3V(i@RCrb!w#Pt&OLXY{$F_cSm#3d|) z6+c--X+d?7zI3Ob+>spRguv#l$q_%arCx;Y=q#o`jHHd7&C6s;QsMVhxC?E}WqeEU`Lto#i)KBT+u_GeWFy^Rs=cp0ZR!HBa_?8`-CK`PtFcWSgInp1R%7?paN? z`kC@q{S2y4?(kEkxZdukkbSblPLo4g2d*ioQyqo{Bs={SDoz&t^b4GB^3yMJy2VeS z=wy$dLI}w*KZUfD6MhOMB)k0-1WK0t6p~0RfxDK1L7vrIO96Ot+;0GtlDqvB$hv=) z0C;b~nd!Ok>TORyeGTX&J7FZVpaNJ z8*e_hn?uLG%|%H5mbVhF)W}Rg;es;7)v0AYs--)3+9tJ?`r?WDvbMZ#^G5lc`307psGsz=?z`pL>!#@vB4Bj78tnB;5L1*80-bsTp;BbE15H)fjYAO8&2570NZ&^Yy z{$+Co0{`Q+w=+Ots6d2%qf$o!DSoe3ZAGLYcQ|kdZ||Z!$*X_&*(Vc5*-F2}HU5WZ()UxtqOy9VVv(c`T+^%!f1JBm zpC12Ji$y5Bco~2G*NcAq^@fs~*D0dG5Cb2Gvrkkk^sc6w#}w`U(jdFtkdKv;w;gZY_?($8Al? zNE&UNFZ6~TeJc2dgIAOu@{3b*{$=L`B2DW=J$$@&q;gVKqw8tizu&Rm!1t{iU3Ej4 zTw7GZ8SWCX{z8QuOp8FSLvu73zX`Pr{y+BK1kSRe&iB0MoSXZ-SvRwm%vz+*y|s|V zBGoMdEwqCr~Ns43|@dR9eb@Fn-q`DgB~w55i{Zpd*~+<{3>UZ@LTHNu3d+Ga_&*sc+o=q2rn^?& z9m4pXXu@1lQ|PkSw=gqkZnRQ;pQHMmZSJ#OPM#n@S)XUQKF|JhVDJR}W!;%K1JV}w zYFnQ1-t~D#ln};*!*8LduO5ec9S+ZPJ)G-$_?9=eheS1r>f5PLWAOn_PKv~*)nhxB z`|1d;-NTo-qq%{^Li)#(SOkW45*w&)ex1Chx)5R)$EStxrUKQ3zzIpv7S|o_0vn6} zxt`htdNsHHnkKN{OK>UEuoMaD86*#`c-8X_3?tA?afE`H=edHmhFM)t>jOUzQa&tJ}LCE_OW} zdt-ZOjz6ff>fsXga4kECVM_J1W!cyfL64z8^P(V9Ph+QSr+;ni%w^Wl-g~yrP!Iv@raTqCl~g9>w!#BFz{!Z}7cV56;fa#&knR+!3z7uD zQix8lw&|{UBJ9w#j=_jn?^ebZzZ4QKxLTHN>S}@=rKRO-Z~ywwX4%Ov6KQd$l!;jZ{iAm6V+5?3*v_V3$&^EJucB zSHYZ0w)dY>?IO2wj8rVZ5HF+Hv~)qkacDi4m=sjrNq_ux<{Qd+hC zxUmggj!<**E}37?f+lQoDWYeh^l6&b{Vb(r=V z2D3j}j~rS}v?pNJ;6$!H&JnU@?}y6R-&36?yN#r?ZU1XpIueG-EF@}A6aTu-u6H}} zSR9(@IJL9%cBDBD(^sT3KjLEl&S>Titw;xbZm|8*vC4|H=5vGp6uEM&<00*m?ILzQ zxVwJRk)-fecRmvNg1J$alS}SE#kbzy!*pjI&ZoVuN!zp5Y`nwbcOJ0eT3v_}vZ%A9 zOdF_u8Rtdp0l}^Exvp}Tsrz|wwpt-LoA=;0*IA~Odq6RCSfmEOGog)>L>CqZfNdgn5k_KKAe{HGj%z^R;1J#cW8 z&`O^`!OqaqSfLU5t~!*m$_2u>%Aub+N)dAp+qrfRo5qif)=vB0+U_3X#6Be(&!vnj z*w$#~)pZ+rOgMg&g(ar%bL&>j7edn1-w6aWHNu?_nAojmAq=4zqTE0++{$;|$V$#I zWy8xhr^PssZ3Y%sBE`trkT>9>z4+nh9}3?hW+^S(=m{s%vWAU~Rb&d;sAcD|O8Qkv z@A6mp-?XESRunOR)sRrlLyEn)2@&o)Q1yVmG}4?RA)cRsa)a5-P z1YeJ=f>^FJ1@5|E=auVzSDb8ZER#rvVaL^Gmic5GI($TJ?)F?VD-JsRC;RqlQ~^f5 zx_n-M!{Q^3ha(sO+40UwE0{o>MHTwOfnjWp{>UYs)ySC**JP{>^4N+Cb(*bdNxOb? z{b|(RZz`2V$}vwHv>uU9b<^q>(~dRZRKg|(!^gd+a>&P-Nuvja)adcfhZm%i8ffCL zlrp<-wO0czVU2+n&S$?pW9`}!_PKD=LcA=K=U^AU$Y~k7u|loU6|KjH9UU-Thn@;W z0oFO)fp814!5Y5OLilx*2&aTpBG%qvKZy&H@hJhq!gVGoc!V)eYe!~pyFD7(Mgq&d zzl}szpg46q1WV#wz2I3m(3dnV-_x|Jdi@w0r|{8O2*%7X^>|Dm3ZA*a^=nKOF?sAD zhR>m;{G(z^L0tI;@5}|4uPMT_g{~&ubCHt zRj^=ZC(UQ>y^eO=bfysCi5vma3e9Na#b%r3tx09|8c8Y+Gc&YQR|#Z(mZ5h*sSL_0 z0Ur2YzJxAnU3+Ja2h6(g;G(N7$MAq*(~ZoA5qlU$=!%*#N@YEtB(#wklCGtxy3l{6!NHQ2`frWz;LjK5e)!Jr>LtS z(v^#1l=rvag5(z)wBTJ^X%HGXS%aEd*As)pt^Fo2tY85HaclzyGRI66fswa3qvB^! zA+~HC7mHZ@uDl3B(fA@3t}8Dh32j_07H7+P-CY=FoAPeqW*0q@kGhL{378&nJIsM- zJJ;!f)DG@~BmX!hwtZf7S!TTi1U_=9#;-Xh5(xk#?Qv>t-XqStw2hmE?y~Moj5TOf zlT9MvqfKd|(5BiZiVecH1}(_fR>n`313!MA9RxHkTRTlOehoutW0zYE{4fUG<2s=* zynfBu@a9&7&cn-Xv2DFATmyZ0=6p%OuNQ3Jpf{VpyN+~xD-3cxO;c)^;G zYsxan85$umxK*ooMtmal^Kq>M0&s^!pd=ng@WW{v4nO%+ilmlz#1<~VmaM5)4Vve7 zGRLa2;sBa_mXER6vh^Z>Zp<6o-oV946eCOc88aElA1!DkrsbyzvAgq#Hvo>9B8860 z^udVa#1gfKF_N#1g2v@x>msE>*g7oNP7+hJ&XmxBkpPfhS2Cv^Tkyavxebky>+pAyQ1!qFaD4gfJI`F6R1)=OUgd(z^k4luzXVrIB6fO(6ad7~JM6 z@AAc{0E*$Q3SEfqmxyBJD@0tRlP@+iTnw=1ni+0Te%#EU{P%nc%gpu8GLvnRREgS? zgaiFg4@T9Xvu-S$YDMtF1qoPQi4J!DOimW;+9mpzMmNLKU+=|Wf!}cNfJB@>=RYDx z&+h8)(V@-0a&PxQb+9%x%+*S>Mna7A$}>SIJ)1O+9g7>Ib>NtS8lb) z055>q0PU!ba^!}hm_$qovR8n`4NI*MGo5|`Vk95U2nS!OYi-BcC+5%X++aT88jpX$ zfIwFcWRBQv!LQ~+WXRbtcH+NU>hia($d}4l1`)NhADiC|28wPW2^mk@e>DUHz^rR{ zD*h&-Dz$fIxKviu4R&Yy3C4;Nfivj%`q$v+NphHCf-iP*QI(hul1@g(!07o zNa%xJixlCw-+&&8#bL)TQB?|Ef9KLaG0B6X4=}a^-A!7@ld1(m&ln~xBRXfUg@x`Uh3+sg)2Sa{j+TX(eLC`JjrnSX>x_DJ$C{`` z3tDq1!{L*mHLuNG>_f~{K7o!C97^ zdkQ({S`Joz#!N%e(PAWoHtCV{1t z;#M3z>{c9$$|Mc|Ggc8IBn|K&Y+k~HXhnTIID^!~gIjSbJUClDiwC#j4D#SsoEbdq zR-9hliX+tLRvb+ck@<({NY`M5XLObr|I5=%utu{0?JUo5+j2Sa$&YCqc zGCDeY_MAC$=gyn=mbYxT-Te7!`j7Q`qp{zD1q&DMzi83o#oKQ`HnwER4m-SW#~pXt zY3H5a`qo``S-SME{_3y)`fYF9b=SAQeYf3q-+hlg{^oDq@s2(BeCIp=_HWT zI{gtpD2w<@{GZb8f0MnhQvTKaP2)TL4f3g z-<@Z#WP2RlMB&xsL4;05yIiu89f}f6W}NnU=Y}YaS38m3`=;+qcWPN8@oKt{tmggdo#JI)|} zyo7w)Te-sc5O)=y)NamJRnkFfBgR3H`0(Nk@k$5L#;4VtcM6r8j+81h)PXG)_a`)b zSuX~HW3J4;jVSGRcJTyz4k~#g@)rjx$ChNBnTm#q@4bQ5760C=!rIu%{Qtqh+XXE>zfk#uuL1OKTlJ;JcaVK zZPU9ml9X?8%Lp=UP-;_|m3nF?7|^{NYA4!{KK}zTco-d0=H{&73Xye26qP3w+xdQN z`QRY5OG1}}cB|x$r3Pfgk2Xx<9Ax_=)v{TAn}sE;44 z-norL2up^qz;+y1hP<`EeR7|2?;)mjXNrhcg!Gqyi_DiS7qn~o32RN>80ec}#=;D8 z*7PrFB5rJ-hzt6n!A?{z!EwTMF2Pz#|J-({sbh(bGvac>#HbY3vKs3W+II+Jz{o7u zq^>3Gq=p@fk&ZUA{w^V4U$wwL$-T| z3JPw>XKpE3a&V(&o|o}5V!hyD zM*Nrz^2{>RK&G}ERcdIkY+QjuWe5sGTH{)ih3#mqmzCf!Dc}@uApR;YeKK$IG5cLu zQ#B$rZp@OEb9JNmVbuIk+(mn2YK~*#ericTn7Gmq+;)?0%&yrR+m3wWdLubvTYEF3 z*c-^MdLw)?DiO|@c{7F^xbl9)T+?XLY0%iY`?kyrbg(clxVuo&<^|rW@AQ@|t98f- zwU9?V*qpCm+5|FUH)J7ZPdFGxLVD(92GG}Gv8Yfgr%x?EIHp5WieV&GBU&U5O?7s; zfTk>|iGbjhfPmOKSjrM0AYD8fB_G>~b`UV&F=m&Qx251{ZBZb#G|Cbb_G}8?-!gTz zq-9Ea<}UCRN?#7UjoG?K$*Fx_c#KcwW_u5k=kLemOeDV9NTe z|McoVmD*LVC4dn!2r-2XE$?D5+-d5Kqc##GJ#_{Q(OG^@YIzAy z8>vcrhUq0dMpi!bfq4=S8+-w0Fv^RCHl>7aFC~Ce_Dz@QQ{gj)6nqzj5lqg^?_p|2 zw*V%U01R;-=u_l*uV$oF`=Vwz^uz*X1dbaxu(hqPZBI@0H{8_QE(Jod+^!cIMr5Ud zL!vw+LE6L=_N?f%IDO3bk`HzELR%#XQ>rXm^ayc2OJPEIDdD?}Q@$a$%GGWXymc+Y z)Hj+&1J4yjG)$2NeYO~OMrQ{^>jteFB1%@h|yic%o5vDw1EGBX9s(NQ{fNF%F- znF?|eGo?~wFjvghR%WX3nMrlcnexV1Cy!|w)P2F^W{SC_gMON1NN%5!Hv?_Fae+3P zhVj4jU$(y>S~ZSTnNF?qMF$~%755klI|Xi!K?`fl?J-16^bUIralXf}uJ9$?ixriV zAxZKD`Tb$XLYjm3DQ$yH2IkT!K{+}FD7OTE2Wi%mLix>hDF2d_jmO%7YYyh8w>Fp? zyQego=O$Ab&Pr2ZoP0RH-45}2TZ5D7oC0cArU2#AsRH@kb|62qH6USfn@YL1ueDMh zr|l#1k)Ir5`*a0n9u7G**HAiDK%aOufTk^Qc1-{$@SBLzTTg8C2Q>OM$ zw}bp}l*D#$)iEWLR1pQ`LF#2OmJ#O0G};GWUg=Ac#xfK1=gJzQ!EBT_EFV3*(X}2L zfpiw7UBMJ=yiUSeDF|x;RCpc|6~db8gt|y#E6huft(k$s7bd6K0V0#A#nkX$Xcxa; zw?1_p`x^SBCH-cf-jI13do8$!IQ2Tt)6Mt_by`m>Ak(MK{w$mi>!vaZ>?Rj_bu_F3 z){@j4tsB%uoKmD8H`zmnb;B37Zp_VWviW$Z+&t8)cy;B4-j0Bt*3fAibSCiNXZo zLoJiqR%8%X4+?#)`q4rn(Sw3hMZ8*CP#j}gL-Dy{OdqUg0_Yo-EzgF2x1-RtZve?H2(H zh0+`$kg=~BCt=`%B<+hNc*>H*=&>g7F}#f zVsUM3j!xBx?x|0@v(sUgevX`rzRgjO2Gr8|z`F(}nxj&2j!uo;9F;UjXT?}plV#?S z%X~EF2pf*g5q;P#J|3c=IXanK%@OXa%u!Esj)HY&VDo<+VEgQFZ37SRCt*N;{bAbH zHBU;!%clO%xuGb0W>&^7IQ0+Th?3l#*i|aWNrZLGpAyAVY@W|dmyajpCR(FscqZRx z9Fc{G$#S=#^;ngi`B^MpncSIqU9)4&{FZAoMKSB;>zXasRl6q~TdZVu=XI!ik}5-Bf@YQOpg0TW(6(j~;e4~)jK*fldt`1uG%c^Jc2)jK zqhdyIv!9QNESn!XCUD-&4pdx(kEKc0P)nALVPBq=mX?$vMgN^(06TRu4B+_TW5+3h zlKDaG)MJs_DfD=`^;m{jOoc0}yG;b%Wb->7yvYE2JA}jFc4t*;@+*%u-AW0|L$2q6N&I`YK_i2>*y<7ZYV&%R|AG*oKCw^QV2nxOqEZ0^CP80kps}4-Y zMn|m@Fp;W+z}E>EZD<;VwNL}XQfCUqpg$HL#(vENGx_A_CSD5LHdMR%j*aiqxM5-2 zY~SkNJBa&q&E;E;UtfJ2*IXvYD)1WSw7-@D!m{!De68AD`JhnTtk3e~4GX*6viK&Q zcw-*o>XJ3Kwyc+;!@MBPYejXJiCSCVVX5b~> zTeV-Pzx?h9Z%?y|qu}i$%k>HX>N`@?Sl3%p;$_ z^4u@H!=F@R?by&5wS+WULC0JK6NHgrrBOh#wt(m`0L`0Bi%q75CfO8mjdsZc#02V6 zzCY_kZA*vU90YDl z@dJ=lHC`-os?{V@n+ruckDIcuhfhI3Dj3WT8lTnrx z;J?;!?KdJEE2>K-g6!&Tf($XIi>|+RG3VWy(nIS6i^wObb;O>Zj24d@G2jyR*obtZ z$Kb*gnGZ{LHZ?isBk@~&$NUyoR{ycGuh#HR;!7~-64DH&0q-Pu z!LO{julOQ_0Z?X2C^5v3QZ0EP+4!C>)UY$-%T=Diuwe%78b8% zm%;I+px(?iU%o^{G+`Zxj<0G_B}@{5#hK;}+v_#$s5k4`xB7P^l+nA7E~(QoT@5Be zzC}l|;XO>TG@O|GxEuL`lH|}*pu+y-fhJE!eC;Fz`L9G45?Od;mV?#yanTAr6P@NW zZs>jw4T3PEG~#8Z*Mis#gDCBUlL+k<&7R6661-NV*As1n`LOzIoePdEWT^afaQR$W z*;_dyjJdSel4e$0{6Hd!fTP#OML3kLlj^FjK0pZEBw5BxB6`RJRZQQD6a7xA7$^uA zntCli^Dkw{Z36t_(3k#g?RQ~i94gwory*cExNjAHm>?CgTy&Zn4D8h$2*4yI`t5rv z%hdsey}+b7!7TiAGLF7YF%)o}j8*>k+>Q0G{DD#Wg z4Orr4Oo}e+a;2!jnx76po)*p%@{C|iN-H0%4mn!z7B^G1^O_$aUziL&WS%Zyh)oKI zKw_{%|5%h`|B4Yq2*NoJrc8@m5^Yz*LUuB#mJXzqn}bR#EpCbq=~zkaCNzk#DCd9C zO6@{8L($DMxffzZMU+u z-aJjP**mPxl0}Kua-YMBsu>;Dg;mmQWiw2?_@mY5gYEzlj^jpJ#|X~SulWtj*chC^ zZW7wGPjN^^G}+SW6UC?(J2n_PHlU~jcGYO!X?^5h119$cc~YRWj}Uw80*7gj%V+{V zozNX!nl!?-w(`9aO@~&sVPY(5B22>T7&R)}-;uaWiPzKbNSh;#&JCUdO^maXW1?hw zw^SlU>pR?}-8(4wxR?FmCF4KtB@-l+!UHx(GK~@IL&)Vil!^xM#oIs3)`@3%x%61_1mUhV>^4nz8B~*l2()&5x?wB zM}#c)dPJ>Q4I>P7>KbvDg?ZTwqNy@Hgt#R_yJ95uh2AM<>maLVUfS1C^rQyNc4x+b z^ct2r2WQk4J!2|7!_VYNh@gT$bBP4U%8U>i zKa0}d{i?fasx@WSFY5|8O+LAdU}C{fT*vHySR$3mx1keUl-Q%0rpv<4@ID_CVwecU z1wa=|y{dC8-G>{5u7VOY?Kuz>W`QjP;g7h0KL%#<+(Aqv8>cN6JAb^; zgp^gHW2|agY`55jbA+%>wn^uvm5-T`7IOT7 zx!yo4>Sebv6fP&Qn-t~*azDC$MfKg4cS(9flH=#H0TG6eHs)_wj-N=kJd-#B)9v>L zF!a__D#i4Qtm-E?T~YmqAgiKZd^ojh`c^@VK*KtZqoidh30xP$@Ank9qH{_R%hBkypmOUn5%&fCutgkATC`O$a7VUQmKYpaeNR z)xF5jO-~1Wc?jkV@_Ed1^ug!%u5K(KpU1+G@0~9Wh0u__h-^kkq^+@7zu6C0_1o(= z`(b)i(jlWtjWJRpTGJiRndKPHLPyCW$D_u?5UkYpIpJEI&hUAQ(gprkAb4PyFi1-O zm`*D7Yp(i@onlti9Sw|I@0v!RZYAie&(e7kLU`3K64@yU_j|KGBtvhTa*qP)N-1%vK*02et?927qukP@hP8LX;t@2n(qHy`dUhL8nl55i=-~}Ke`Ss@K${uo=&72%H z_LB<0st))hG^$sk`q37g)Tag{lo6UHL_2Z(tX(>-eH9cJj)Gs>0m?|w+G1IwVZtnu}S6hj+WDC zH6c#*sS5OE|3TjZi)Fi5$e;=WhwP}>ZCYz^+x(h4X<3Ie(i%!)O+sAug$nZ9wW}r@ z3k=wDW1(GPOoHmB>%}5uIGSzDV3pA}w62F0HN)l|$1s6vS}S%Rp&>EKG2(}Rd@zHx zoeptbMmi*Kz?5#ORKxGJKnM9UV%bFUqD|bR&Rw=}nqI?y3E>AizdIg%wsy^L?SMu< zez<-ONm!(x`I?d>NjhI}5;IBXt5LEn>0F=%+0*{HK%y83$aFXy?8hi|2}irq0dNC~ zEgbDa%u6X1I)G+T=m34?!d*s)4rs9i5mnQPBnq&$$#+1bZ?4IxT1JULF9^G~Zil8C4yAM|7qmx(Zsh1KzJe zc0xb@FxUHPNz6&LCYU$S#5Tz!TY)C!bYVKg{;n`+hNML<4c)h@T@0a$4XLsSN^uB^ zVQ@s731rY}cGQIN3Wdio&f>o;B&~I=60M{l)3jVmg>c4&;T*7Va6@YWkUbieGPBr>_^}U$1Scdkgo3l+3#-K-S*c z@600hSNZqP+*_>u0fViPzit2e9@QWEnYEYR*z)#P+aB2|uj|~Fw`*Hc=S~X6+DYHG z!+2xMc&#g@YIn#m$^}-pyXUwbe8EO%=N#tE*0MjEoNYG4yg%Fwv6vUIBRjs>O7>7| z%CLo%pJR*TU{YBNnJ=^qNPDMVYx+f-j2-iiwb!?)*tM;qWZTzTwq{og@%-B>-~hM_ z`k_k=`%-^H8bLRU*R4^>KNzPBW#e?FTk_N0l84l+jUZF9t)$7^bXZdBT)+C;Ja1aJ zek%0ZB!B)FXw=2hM|6g0av1x?S2ay75ugyS_l!jMu6 z-O_)y*;Pj;%-=9001=1(5`1+gRsC65EvkQT)|o{0N1D~{3f00@Lu4VF>DR9MOYw(0 zI=oh>*|zo5PKE?L(Fr81A@>R4**o&vK)Q`J{KWX_e;P)bTqWPNe!gIvNY+mOGnn~R zsqH2H0}tfdy?MZp_m7u>rL<;tXtUFy+DJb|c+!ytaM^NEYzE0igevATVBEkiX~gHE zf$A3;s3ah+8VjKofQl;RT-Tvy%xN8J78D(7wxOX92o>rwa=WZ+C5aYDec=>?q`mwQ zgSily?pl%lIGIq{$LLSh%Z}C3*~^ZNcqoq(kGI9kj!)Lg zp~Bf|p*00yCN|3&+N_N*ld^bhy#^Ew>&?>OZ&;O^twqXE^@wIG9n2#x<*V;(+$&=4XabP;yVeTm1 z>SJ2ilYl!K+AU?QJNuZn?Mbwdc5y$47VS7WFBXzHr z=z;|@78N3#oruuu+?eD1xg6r|EHV5XLk8j2fvrf3*$WRqAabR=tuzMylJh@cdmU^? z4s`+t$kSz_i}oo?>`O^*lHEz7o24QB7Sb}L88q3Q{QF#hQS7o@P#N1j+1t$p|CM-E zlvJ!!hcdi5PPJ^YWs~C6#M^8bD#wvo9~_3U^;#v*y>mImOSm~F%kiSX?ee^dam9&@ z^u}%yDGtLZ!;p&yXn&9gX=q@MobY$z6J~?+a|IG1NSESg!G3*dtaO$1b?1WbBq`=6 z_~0kr2me}?kq>_2eekbWM(%^pRIH*|eDIg%!a*x22nRVRg)=D{_Fwz)y%=hR1j6J78J@*HVm3~*dph}N~1XjRT%ATL{LEi1NBC>#Rg z{WKwv)dH&_{7;Qyvjf8Y=Te(1u2sX*9v3Qh&U5!}OC`UOlP5J^Q zVlA`AJSEEUE%uZs$F~U9%As+HDV--uY)*+VRQd+Wa z?Qozp-mutJ1wo5VxDaRc2xcLxInSEXWnl7>nGIaPt-_$7XseW&?2p#8*Gu4#*$aI* zX6Gf~rjcHKd}T9?*<<~^U7T8vILRK_GdkSQyaHJyVd|MCfu}xpx%<#rBJ6|HvP>uD zY|z74VM$PoQ1)p0oM525escJ_TfcQ10v4c(e#;Cfk)bh2O7eob(XeW!@v7>w_|mde zdcd+=Jt$L3NxYzrwAbx{kzgjL?3M0K)K(tLAQK_NxHO(xE`bOzKXY>b62gUzeq6f^qY?1+rUrt< zIYXe*zbo3XW9AYpF|=XKy#Nw7SEG?GaLD2)yVYoe(v%JOzNSh>B^yLqjk#Ky z3Q?=$dAVpn=u$FvF6E*@0ep!D%>~&Ci7iMENm!7A1Pn4*2>1}?3(}BVbgF;~#RVx0 zD=tV0fGkKlP1I;DNQJ~*%DNki_do%0Y7>d2x}uXjmOrB$LWIix#s;`P--GdOl?Euj zE3;~lgFaqeN^EvnlcK=mW;Q5Gg`u&TtsSQYNfXA?!*a|CY3qO)A>HcK<%D$Nsmp0; zn7W*n7U28$o;stYjP(pHqR3Ybt}AWQMOK9u(D7C_uM(M*rcM_Ms1;j8eL(7?v!#Yy4s102Gd3>`@*!5v#)SI z8t&k^XzY$h-|_X$U$o=V5_NPu8g68Sg|#ipm2-vv{&?haX`sgESd*`UPnuxG_noa( zp5yY~w~@7O#JPdR;~kWnkhAJ$xHi=}h*S?3M5?8E_+W^5Kn7Q-E;iMol`2+H-a{wEQ7n+8}C;T2oI?63ulF*db=+>57zRnfm&WTN<47$&162TzGE|hX=c8Q{~HI)QrLzvsO+|aa`S~WCo(Ddk~mYfYchTBy4myTQXf1V|t zM?iRUiJQnD*zOcW;eX#H{;Qt2yGil4vdBl>BA*A=>E7<*BIlJ>VB!N}JbS*Q_+gPl z0}N4Z9i{mq$6ADaq-it<_f1)%9Ts`sPGOOw5xJILk45h2)>u3bA}#n-Ga_emk)sq@ z9@h-B$O~2(T!~E+tg*=Ls+{5?uhgOR+MU!WLHE0b4RlS9QRF#Efuljn4&%~Y+_2EN z7+%=h38=rX&lT~Fjbi}F3EXZi24JKi$Q)?x33k8Pw&+*vMvVA3NFreV`vFxXw-e)@V&@!#O4irDt?W_~< z^}7ofNMI_7onR=0gSUsh-6qeaRi~gCqi!l_wp#d)St;5rbPQox<`VOI42IiW#1Dqs zT*NnXqnS(0eAU#>TEQ^w%!5&&3N=R+OjAUs^xBxQeo2~n8a^&zEKj4Iwe0E25!GpD zbZds$()a;BHc5iKLY3$Eey*B{?>p5@=8|!IzieI##>*Q;h7Ywt{8fi?hR?vYaC;33 z%Qe#EsAOkRFxEB==PBz}o7I@L2Yure^o?GDGi9AVD05DdTb(DslBT@}E+&#)lJW)l zWsn@k4E(G+$|DCBd52&v{_B8L;w7k#IUOnN2zWZ8ed(;I^#@Wp965GS5!b=)tsFW&JW*eK_Kh{D$EjxYrV(nnC*pjIG$Q)h2lVowpY z>Ty^Y>2L+K(%nFhAqzB6xip4P$&Q4HM}Nd=5Q*jlYrmESe>%xZ(RY*-ZOsF@%jyh0 zyy=!0y|*zS{}6WoIgNKN?P6XrbP%HNyuaYdKd>E?ek@j6NOVR(aSlX&<@j!~G_}jr z4;*f><8`GYA|=~yv%*+qOom?)&)c2FQgX(*9y^ciqxH&w9mq7sZULbFh1>SVt;hQX zRB7PZ38;35#Wi(`U5I$qkz(iJuENS{4R`e>#Ws|C^%R@WwWi<<`I-W?GD373{?&}0 zi?kOD`amXmL8-SwBVwe8N<*wc^Ew`nj&R3b_{;70T0M?}Pb?!m5x2zh^)dp8?_347 z1VtFqSdIa{3oXt`p~I46@*to zc}LmOh{HD4>B*W#$xW1#(7}dMwvlU5>8XkTv?Q%!BaX5cLnJaHHtW3?CIp253C2Q7 zFQKegE;Qb+??3DIL=uVtx;e60Ho$5W-z<;uHl@X&+)QxA<)!yQOCjS&E-$^mx}ED< zhpxYL(YADb5+J*H$Bb>(C>tMf0FGaor7;RMFog=JOQY33o=HA8-qIK5CIlJlG&f;u ztT{L0Xds&dp%YW4sJ+$lWA{%C(+@65_X?uYHn^;~5EE7rLkM@&7?jR~Fr}k#AjW3y zO;iPb0I*KA)uo$kkCviXs7tlNlG8yg5q{foJsTb*UIT&u!dS1>p#HZE`7shk|P{Nsl;rs>y_A2YKA z1AC=yGT8_RdJ8Fde^nTdA8h-AYa8v?jUtGih6S;8icp{FF%;VhSOfHHqXsdw4DkQIr8ROoD%0{X`QpF^}%>qItMJ*Nz`F_ zW8!w+6%os4U`cd^fN#aFD3`8CjxTgYxv(#VC>z(6XJVQf)WDfYZkJ6D!sCBpVmaBP z785RXa7d#Eo<9?-mv;U^@upmYUXJDodO6!CRH=GRz3kzOYU!9e!6tPiyD{t-xeP&Z zIwu`mlg`u$@DW8wh#89-&p}3`#Ebo^vkFVAjpiRY$$}qG^BKd57JPqLTE0xchBmIr z3d~8kxT>}+)VWgjENYAOQv_@daIbF6*)86}yxHPwB#xSB@}JUVg6|u7O0I*v8GkF- zdTmK+hM?Zi?nHyFv6oEeJ`_U~SMY*W+Xr(b4C({a`yu~3%pL6GWy&?ZDh~~n)8@9R+BWtKTt*3oIKp?VxSDIq z5v-xy(ZTKUhU0&P9huFCokh3c{b}#FD!PGyGeutX&%@G*PcX;|+lFXhg`BJaVvuTM z$HXIm3<$n4_;8&soLHtKL6UJIR;mjDHgf|})*H!s9pl)W*mK6R37=LaYJoT66P-m7 z1Gx=pF#FKztm~sJtl5YHv+6Nq16t=p*~LDToyePz$LwP)Ls%={H3p?pLwm@Og(@P# zN~u0i7qruRTZ>wGVCt60VXE;%;eAsFp*zYQql_@s?o)S&=RR|EKomqpY^`{bnT*=t z+E%wNkE_?{gQ7}_Y}PR=`p!}SIp>G)dxC=I;Q~#8A--<5bA#@mu3416ZAD@ zka>*OM;SvAItgkXGY7@Rg*rS?Dnf++PMB#dL}fK-rc_Xktqcf$zB0@_J=$CqGX>%7 zz|!+}+xYi6lMv7G%8YNf(<<;-V%RYW|27;z{$*gW%=j^Y%YJ#9DUYAP z@H`&G&ds^&3_N63I?G{fW!5-r`8ZvpU7Ofix=q{2Hn->|?Qbp40SGu4Tz1CkHtk=u zr`zHAZmGUwg;1#W?DtQO>RP&YAp1_tdxG@ZlPEM7CZst7_ys+6m{cp;^EqMIVTelv zGSV-bX?}$0i%d~x4mcSH9>3ll<{I`+EH)Wo0yDQwNrpz7IUAhjmy~2}8t@Y(8HvOs zEF`U5C+MUkhcLs>Qc=3nNy@88n^(b#9YeCZW!( zfeD37=OUICNp5d`t&s*a7eVeZQN7iC#9rn-B9nU8Q9%`X;w;Vr3X3yn&)wnH&3jam5kU?#3$1>pzVlxdIX;zSc72-L9SQw zo{8FVI-qkGv6Naxf0Hp)$qylH)?PAwT9K3ZW(cvzLKRBr7Oq2>f_+7jvE)NrFQBkV zs3KmQAYN{}A-hwOhPK7PNOIZ06YUMM4w9}U4++WADrI)38=&O%O2Mda)N^3B_*S0T z{i2DEc~j*>%5r21W#m@R8|8#Dcjf}}|`67T%5`3~7ykt8K^T+YY*{P?klb!psrO9dubFIi|@|g_=%oYY%VxPISp9SO7GjVqKq_e*ZTCtTVV9;f1{DScBxVreHIRX9>_2JcQ56VcA9(`_)dmgCH!+tWcf?qZ zco1Vb=7IEHqvIC)j=JiKK{+F>N$Ft%_o;3N5Tw_j_FH5?#et_W;^PT0(1wp|mZQ0D zXiyr7qAfcNVZJqoJj_gIBP7gW#<_D!kC_4WJVrHitprm)FXVgj3!#s5-DMs&gd8ts zlE_hKHi;a&MuM;;jBx>$HO#}_W`VJPF>maQrP0#VAXlVAZ3Hal4H(djW@?LjQ>m%P z$QIX(tt_xfFU{YR7;{8g=p=I7)Sg^u<+zUi$oxB%Nft}m2)LwPrE~l+STxTND3vHt zyW_lImQ6T_YyioCLzj&raiG5uKt~&=gfQdn^6>MyqJ}(YNWTMRKH7Lofojgmspd?| z2~k><! z4R4SkwKSBED4&&@pAk8CsPL%*?-o8C;bVq>$OqnSq$8|tW3pJi`zq*Me6Eh=ncDmU zF@`mFBk3?owc=2|w>rb6*U%LPeN-^a51`Xar|H*##H}(G-fUJOkAN=u>YHhs1bK*E zm(Q}BM?Q~6SY=`LEg+xOw=m>;0;tuee2cxy$mv^)y{l~rR=368#TSy#>PsNDv4GjZ zS28Q*Q{dR15x~HK76M;R0Oyg& z3E)f;IROMKTVJt zMO=J9+&YBONxh@>K?P}c5p3Zr=Kq*BBw^J(mF72N;{)P~mC8~a$d7&N1LDg1s}&lm z8}c$X;>pTT2=H@UBwPet#l@YEb3v}w z=*qMMB?b=ZG0NjmBk8(`1H?R_QEP_99TZlU`Hx>YgF>1@SlmJ3O(86 zrnR}iGn;kJNTV4joUFf{U|14@hSY_{-HuYB8!+%fH|Vj#;!amLsE5yH+q%*gEwY@0 zFTi;~V;IK_53nsO^&(Hx0retJ(*gA&PtyVQ!l&h&F~-7Fa9qY&tV`68c4?%Rj;J?q zo)8=t#Ze3#=myg56dad+=siLmwHAWoYJD(=piF-%jOYCVFe6=vUEBr7B}i?F&%rG% zAEAv6tg_mI(yMZhHRB1SW?NE^cb7J^Xo*Fq@{dvCv7yFBQ!&!4jDZ`9+TyI5!4} z4BNLT&mwgk+tXrZ1K9@W+xlW+lCQ6C@A?G-gtLS>lL#9(fj`#@mMV>l1s$={>7v@7 zOrvoI1>q#ktpd$?e7L@V*0$qsn7@T-uf_cLk;kFOxz*W)9d{fc&vc=MwHX+K@VXpg zhld<4Vu^F63k7KlEzEsZp=8z)S~%yl7S$Y)DX#>soLACr+kV8`s=MnlRXdY5+lgk{ z#u7C~HbcC)zT-fXWCwEf=JU-Fcyk2a9Dz4S;LQ>E_Zfk7$H8wUz10Vj!3UFRwV~nZ zGiJ^j8J#_6?!32bw`7MMcRD`V<*)wwZM(jGx83*nn|JK_&cA)vvTXT#{-*=~>4X3C z|MD;Y>xcfgiHj(Ozy7~#qa>qobmuqhq3DqvN9EqyO)) z!$1C?KYZ{<{>vf%_U?~fl&oHJ(7*ok$4-b&j82M9j!ubAjZTYBkIslTM%P5wM%P8x zM>j-YjBbo>if)c>iPk5#Mqi4)9NiXeioO!v9^Db$8Qm3qHM%>xC%QMfFZx<^fAsa} zf#|{Lq39dY!_gzrH=`d#KaQS_ejYs+Js&+CJrn&h`c-sK^6TiK_?z*g@ni9~;?425 z6W<%(7k@3jKmL0BK>T2QSNzrZ zjQGs>6Y<6IrSWC)dEUlCs!Z-{S= zUyANaeiOYI-JAS2`d#$7cwKx!d{grEJ6(1cR6CWEN7at#=5T6*I6rUWQ5}z8M7M~t}KE4Ri_1n>B;_pP?jn0bC zjz1Zn6Q3KO7k?@~KmIh5;1kgc(J!J~l1HQOM_ZyFL_dt4jGl^aPQDdA7G0WLm0Xg1 zA^KkQNc?boW^`6`Npy8|X>?h1T5@@GMYJJ0B{@AgBRMlUKlya>ndEcH1qR&R3i`GTY#}6kj#J`At8UHH&b^M$7#rPY^Z{y#^zmNYAzZAb5|1thk{7Sqw zIU+eSIVw3iIVL$axixt-`DSul@$<@i1lD}JVWwO`G zeg6Kv|FG{r?zjK@{)Yqp#}8~su1ns(_Z7+I$z{n`lchVqb$(huA!#f)FpgQlI(uTe)kZ;QrCDj%;Kc@IU`O{luc=n#D{~fggTV1 z3JJ_>Y?PT6<%DO9^$6X$omld;_Hw2524&4c4NgM;A?KUB=RS3<3z^SaTlf=fF4Q1R;hH3k%9+Rt-Skv;|^zRa;lR zq`pXMz*#!7KGI(xy+H1`4c)vxFI~iM{bDbJ`>fdMTv2@_$@(dI10^x|rbBhSd%4wc zfV}I;!wR;S%2Y^SN1DOlya6sGYk`6MD*4v}QHUGB83b|%$-RcscBVixufyI2@7QqM z+Ziwz_F7t#RcTl;18`5rH9+DssgC%#Z}~aZd|ftU z3UE&~AWj3sjRqoq22fW6ly|7hhDcu}Amym5rRCjHh70x` ze2X9k?p>QpO1|WUeMOfP?}fxK*`&92s zvKbV)f+9m{Lq!%~pq-~Xx*tliFKHcLE||?2#kaHhc`lAC3|w|2PYu#$p0jwq0FtX; z&&Y|BCpIt^J@sW@Ry~(dkGEy{E{_y?&a82cM7Mx{t~%Y^SY^vPRCcFcU%a)-uzOi$cd7J6R@pkXOvZtBx88q#YqgcLwJ>`u zsJ_;F^wouYr7eFJN?4Tw|31CDfOmu0VKSbxtk72l*t=>@ze}=;5b<_$Yt==LSKh0}79|5BdH+=|6ZDsY&B)e5F z&v%3loSH-GQxsj`u#j5=$-G%*&LbCKORPoKW;U0sb1loZih1RtNVE2|bd4CSYV%vk zPn~RO@pTGIEtpn?clg9lW+u-0QTuWe)pS1bTFLSH{ohZz26j!ER=6 z$oqC=ob58agGM%=th1DrF7)R#JNv1H3r9K_v$4gyokBkxMY7;gAix?I)*4+uPr;Pi z&KP&94E`aUoX9Tz^(0H_#wXN`+>=&?L+iz(O`L?Me4X-Vx{;8Ze%2s;h7Cgumz;DY zIsxq+9j81Fi&u!HFQC!WX*A5mLei&^-hM^(Ye}|<)TyL=7zbIEE2og=&^YvRdr~Kp z@&TC4^n4O&w<>m8o!j=yAF1!)bD^Bx=YjVN$#i0o_6O`IMeF`&1wWw5y(YMd60pbP zii`z~MiuGvd@sp046Abaxjg6cVQnry-&-0=wWn`tijdn2^saPVdqq16*%CT=f_2Iq zA{)~S=+m3MbbP>`aW2M)BjMsyTcKNZGX6%A?LcG4t1-E{UKwd=ON8@BD;NdWgIdws zm4g_3xg%d52Wjc9FQ6-|#zrC^%LdGlw>$CnSn8F4W(T6B=^;I`H>uGJCo;YMhkC)w zmRy7xj_PPv&X=XC59K;$me_&)N9g?_$V}QKHoWPULrkr+2wS~yfAjK@QvN?IxsSad%n{Gb` z>x0L!+=rg;$}SOvuW(g7r0!CG(jr^0%s(m9YZ!?0x%}dF3}pD=PZzWdgxcT`tu~aR8{{`Rm*8rJ)b}v_1&&X3T3P)?z)bADk*e}P2Lp<4Y_s7 zIbh5N`<%vN30Ar3G$f4sm;eSfNEb;=tu@6|PEpRbOv$Ne$;}y_1tPfCkyD@T$}Si5 zF9Cg!8Lv>rAJiQk-mc>mS6KXLP+$@h%L2_MRL8hlX|R;2rmK9XP1T=uWml@H->WGt z{rh1x)J$!=Vd&$RTl#8gEq5<^+-)q#y7#K`@dkbTJAG{Q5LDg)d=BD)r;+5b)MH2P zERP}FK?}W@#~AORW$yA8kznWD7f5%oUsy-BG7fmA73r!5pcmN04xNl%`5A|8AXV8_ zg8W5;+|hV+rqGGT9N&W`oo{m_GW|Eu`Zi}Grncd$;^%fAp3W2>R`}Dd>}tXC8({HA z`Ld15_%#_e&OhnOu2IIX$N-HzY%_CxeO|6kZBiy=w;kLT=TyzH*R>xM1qfN z#0x&~GBc;zwWn&?Q3}@Khy)*_BbEqMhJ+J*SZhK?V@a%#+&=eAOpRuMoC(L^jW_Dm z7-RxXSnDh=pnp`*e+%e?7WkMl9#ePhbOxs+mOHsYk6u=n)^)D&Os42GZE{~pvTv!{ zN2zwiuj9?i_$C=l`bVmplI%Omcti~wMK!J<74MDF`68$DRn7zv7jWqhCqcNn_xdEe zU0{6!u;S_&Np^=)4+%(#g>udRM3UX9%m-COmj7#$>;YvwK*kI(d`0z4_K1}8b#e^n z?G9}PiFr}pWmm?YnKZ3DkoDwRmsiG1iG4JKEbmg z$-b)6_ZU2*2eDc?f|1>=yt^&0tfE%%9%X)2ndJC+xmS62SwX9FMfJ)gyHA;ST4qIG z`?6nC_8pcz>MX0PaOJCB%5J6J+|C;}0>`sasGP5mSsS){YK^ zw-7DPO8s1=uA$T%ywx|Ch-Cpq)ZNWybbKaS{dSf)CyRxIGT@96*2q45P9JXMLmv?+ zdtMn=8;lt0kLt=^P{vhc5R2?^>ahCl0FvBcMLOK}1Wbex($*qTi|U*f6bQtI`h~vV z!1qoIjWfH`()VFR1cxrr&M#H&N|h6k=_n8%4ydz@&hY+MdVdA)1EjxJ#^q!r0xg~P zfySW1;Of{AKR6t~F!KY4a%~!Fquh%$-_D8I~$*)1;+3ACGZG?MttmKS5%=PhL? z^I{&u8LU#^fDdPNdc1n)QmNkX2%;nCENY7D;I0UQz4s!_E~R_oJ)>UUNIt5tLi8EN zPedNvp}hhLkN3Z3=jtW`rO!jz4S;0lAbU)wc~?EFY74d~9a51Pq=kCA7HZ=irL%0o z?h^IxSvni%5w*H8et-1`l0mPC98+%o5{ZctRFjMAJ6PE)3R`%aiOb0ds)?qXAlK1LWY!`>Yqtim0bSr(rQ~ z7rkH}wX6)rmKV&tGzVUcGff+=@FKTOyV(J|q{{FDfD5K-cJNUIHz7Hj5ITQF^(iO=p*?fl;yT_Guem0|NFPNXrYuXFubHLU)8h{1!vz`3ePfP3yIrQ^B zKYJ&mmk)!KaE3Do&P52#WGVUO=&1VrGDrw)pVOd1B871*t^M@kUcLCNUN9@#_K=z` zid3#VnbT@=v-?!=(_vb)!DQ>V3@{wfg+TwXoc&N`&TnmHpX%e~$`h)}RJO|MEHX?r z>_?_BGJr9PI#kOAN%k`_pYu%nm+^T%WHQd4Rpz-=Js&u`4_S@v06`0M`MF-4V{l1Q z?UnD6BMt0jDDc>~*cGn$*2(JPr(u8{c(1Rnr!IpJg-${sO3CKskPNe<`^nZxIEP)xeG&Xoy5G5$dOLx@Mh$> zBq}b!lD1QDY;!lXT&_v7=LN#qfB*n{m=)Gx1#4hIK!{-Jt~EWVf<1gVUD#5J#WT{} zII&VJw9#~NKst}jx;=j9(mUB>VvJ=k236+?83O^EC$-63XY38MArLfTKsHwa2ffga z^2#{|hketeigae}*ubba#X#_>%ge)77H0c2;I|_423gyWx>1pF96%yWK3T zY$j8M1Lu(kkqK1*Z8%dqE{xPXXZsm7FDI#`+H-L&6^!!erkpcV^K+Prrs;=saw(=C zbAv%Q-I!#*QeRG|FF|MgwK7gq=e%wj1lXY#9Ti_1KpU?!v>0T!sxw@jWWP~+r>Z@f zfW*0jgw1HS8-OVPTa`aW<##TPN{lf)`JHl4CO4R{ey@y^$QTM196I|4Wu8c;I9naP zAzhM=9o875P;_u(Xs(66O~=URcXAlg(x}`EMx|}Nq;F49yJI;0uBZaa%gQ>QtVLc| z`=c_BQyE5v|2K+9s(Q0~H%zFSFkLNfXj>gQdh;i>cC1>{%t#u@hfbueUEAV|SMDcI9?eq zbEXTiJUc;&mw4;@ARGvN;Clc%Q6>IB3H5~9fYf2@10AwHoUFIMQSQ`x|oO45t?|pqy-? zkb#7MAgXiaix9#keq{YYC1SJx%k8JbfGV{G+1V1S82 z7be*!_3DSbGTs6wbz^{}9t2{Dq;2;|HbPo=*)x2(f*4FW+5G*BTnr}sQ>aQr!N=#3 z^Wki{84!c+y+V?61ji4`1M#vn9_%VznQY()!PQA=AUjI^-2#Nh>xdi7mi^;q(3CBH+` z#%zz5$>^}J2$DELldwFEasrmN#*P+L9m$*dut~cGc{CsA+9{n(Pi!N zQAx88ESU4u(qnvJeIVm}Wjsno(7sxi$=9@jll3#gIai#*GV%9vRW25|OhG(P!IfeD z=3fGFC43a&6%NLh4h47~hAk)_0g4e(05X1~jE4oMC+3dh(d!$M>_xr&1~0o@uT4%u z>OiqTeH~5Hrs}!_VOW}4klTlm#yq2-G^Ob-rP7|!DnOlKc!L?PjBctM+znlD7W^6( zT($b3V07bZ*lP>dV)e&^<}1@xUR%(mn zG2zCI`doVv-%{#}l!cVcGf9$0$j3~GqdfWL+KEQd&R|-_hp?wP8g1Q{76ZP0UM*fv zX$JZr$*c_JMasL*^88Rz@M2|Nt4vJ}6|XI2mniQVE9i%kp;)iXjh0y)%1f1fwPhEF z@@ZU$^yVtwv~bZUlk9T6*uab6KK?mnTuFuz$W3wOHV9;AlJ}^QJk|MXNZ!kF*qoTw zCUJanymfrCMc>Ki2WR2mX^t*am!~8j^TqG=#ijbf%g568b7m`TKWDL0@^khoB|m4W zF2+vIRox~ELe&`B1tW!Q1a0pj_@XY+q#cHc4IwT7Sc< zBCLVdzc?Y9HUopc8o)0AaO_KV7NS%lq9&Gt9W=d`z>F{_H_i_2R{ENZu*vSF2fZD*G7EtNQgw_aZ{EMao{CHl4-$RHqc6G-385B;LMol!d{6KhB{T!pV<*S z&#Jl4I(Ve>DV7cZIWLFoz?G7Hf37m0G0F?Sfx&Uc=!;4AoU%X7r*l0;E7eCOhty8i z0`L;y&nKL{3keMJ>T&-$)oYeXEMJQXmM?54;(FT`>|@G8NZz4fMN<}fe0S5<=4gXN zv~0|qhvCGh#o71N&2#ByLq%kt#VRl1JUBr&XfIVXGxr9}F*LGb;8eKHm#^GShq686 ztXN6$nZf|^ebs+XJ_A|AC|(L~ibCZRf@zmhXH%+e#ke;nXDiiM}|AFB*RB+@*{YSz`n+%)Y9`3A_yw%wE;glI(8f9#3vu-9r2|rH&(o z?efVuyI09$NdnqD(HipZQ{FN9KqAyBxZ5b>Xcc0loW!`I`olPTRQX4dFPYi_RQVwb zOi9E}+pVO^lkiPY$s?>vlXy5Kn0;M&Yc0=9JQRFDnXd?q^D46kmG>t@Z7=bh$a!C7 z{?Rgv63;i3{jy~jC7xsPZ_=BWcvI}ecjN34<^O^F;EnTXW&B(ge1W*}ZuyAUFR6iLRY5w}j*2ZY|Io0|rH446K?%Y{bSjZ4r?^Kr1vqoaq zuuH+Y!{%Pc2#I`)W0b`BEe?f$D{OJhDr|9-wY5R#)(MPXTIWDBHUf#T>YKJX8`Bcb z&7wj@Xn4`VpBzZ|yn=r}IZ$v2K#;%m6$G3}Y9S{O1$HF0d&(MAj``fewLFzDRSCk- z&{vj#WSEnfB_Jl|S!{_hA6C#3OF1GP`rtQd>wYVImf{;~W>;20!wb~;U(k8NsXrcP z7b^Jz$@zYve_k0J&uCs?XDT^;i3^5!PFS6hOHFK_ZGiG}eeg_xG95d-fvNU= zRjRr|Z=U82jvODu^oRvl**7cu$3c+FI6{HxaS9l7(!{+aEMJS)*Vg*^?Ks<@W}j;I z6B_5eo+iQ=KDtUDJsJ91Pb%MrI6{ZAtM%dsyqLnwY$L3jk)l=mmL{wo&nCcZKDb67 zd_TbHCWP#3mHj=knULjdzs+^C^1dqXuG70G^htJlvU(vx+}hGKZ}@D@vyF%s#Q?rT zabivHD|g}FDdXGry(IBDh}!a4LI>C!P8UG3fI%3i2w(_H=(q#3GYc@ z^v*E?2nj1MP-SEh&mM#U1;Xw52Rkq0_OT(xip81p0apV=TVdFD3QPq0x+Eq#GvbX{ zJa$ZoKi&Mjy1Ci9=}0sO-~x#j(T0rUs8q~>)N|sum;(eDQ;IpXj(2fRfW7>uIN=gG zcCxXMsT`Uej+i)u2o$|pwMszmo2@GYZqNi!8Ssjn%{Uf<{XE|)=G@@DQT7M*@>}Yq zc#TB7iLU&T3Mip$i*6pXUE({gJnu%gON@(_Hj%eb!0|Iz(20VfYtt%~9{>1Zntn3<`FryB7T^ zf=+~)EwewV*+*<-ynCZ|ojE4Q7Jkm~v>?>VI2r~Ha`>F<>p5YlS+i^l_(IVEgwcKZmPama^Q0Z@2Y19DrJ@OGKTAVwMfbsVx?uP-8Z;Uvn_X}s> zag{z&%{)Xi;q=i_%231^z+hsIR`LOoJ$9xQ37*Vjl=*cs&GW)JaUQF@`<0hp2og)q zWQw#;URIxuQ<<+(CMPqRJV$?u>oP=lVR&k%m?aD>*o;==$OJ%8+3~9EJ_Ew}7|PB1 z1ZC>r@cSw$;$Yu%4oT1WtC>c z5m?Ckf7`yFkj6is?uh1(!`_ z!4K{1dh8u9$$}%=fw@AKcp{9k_#s@;;$izz@J#(0#RG7dNyY>4PaKpGKpaOxRMcNw zx!Z!Ni%3l7KS+RKd1kfca#QCWuYHqzH#+u52(02BiuVw zO~=fnbWYDlLZ2Z(c#lwiMMwQ0{RO8%@|1-8rY|?xO!xgeOvkRcbly@hhV}a0!_Mj zF3R$pbbELIQ1`KoY3oyq576MvY+b$zCVW?)YV&=uu3$Za!)402PHn7E)lVpSt*Z92 z1V?u-iL&o08+SXrALpypbXcu!uX}GCyT^&r>#gbH`uxffg&Odky*SFguNtl`7&|IMr@L*L@9+O#Ywdl`y|(|K58&{_Fo*|Mg#M>E&P4 z%j$fo8dGh)%%R+I-SG28_4|6~7kG!A1#cL>IbZlSqy8ZAF2?H!T{zoF#tRPVJOenF z4YBUKfQ$SR59)mgv|HFQKWioSTX2*vMuk%VC#aB@q%NFnFP~~fIFn5 zu{MizANg6)T}|Mt#^NKoa6xgvm{w5$w%zB;D|_ANOKOkD5s*6Iktn1tD$7tgc-g|) zHR18enSOk%l}H>zs;7OJtx(7w!B9_ zM7u_>53QTNn|*h-t&e}S`R(k}r+WXuLubovZK|HLH9Ix+bnU&(oKAnNdAI(7=H25{ zWuBhOWw!ngzmYGi0|}E4evo^(?83A${uAN)Zq)?u@9y-)+Em>>V|{fbl`vC-(Yr%0 z+3xv&WsYv#ndZ~Mi^)}7$y{93=E_`OrELg57p|WT*T3NUAz7E734lk#_0!?{=i&Ni z;rc1Azo!pANkUr}G8tjp%>60X0rzLPYG=AX3Dk*pR4Ud_AwIY0Qe|Z?IHFsS8Y1>d*S|Hhx^mv{v+Z3!{PpS z!~H|y{zKvZcf$P#!}UR~+UM)HxoR)34{)7ueLvT?+bDsAHkSG=uG&KCy+3fFgr>pQ~rH^TMp;d&}u-^TTn3VbVxw<+=KB(&4TTf+6%xN2*Q zH*@{B3O4>#5`U`110tf=yB;F&)T1@}^r(@z@lCb67uORV=-uWpKf1t!q#&>>#gl)KV zcZB?SOlXeCGW^k)czI0xNKE{2O#Dzx+!Yf)NaE+!F?W)9jS?>-@oFXRAn{po;SZ4b zbJgejW8(W_Vl^hdm=CJI(93^E;xkJ8XA*3qx4|3!p+CPE&KkWWX*pGU}_MaZW}*ks%%NxWM*|63A&r40WxCeDzs^$~wU;$3>@ z-;nr%-uYt^w&vgyBy2UpA4SL?l6a?H{sR)WMBtH__&5n$MezG1-l2CsM&dV=_$Z0D zEAenl{2qz#S4;mj2@9q_P2y#Oe1ycEN_?2aDSh?3Bz{nkha%)dBrNLvcSu+q`v*x_ z$ohjMEc~2tm*9(#HpBg8wm@@#;~gHQlS`NEbS!m77~B01lDu)UM1d4;vOY_ zmBf3Lc!0z!mG~7BHqHCXF>!xPyeTGrDJFg~CVn9%?u&_gW8z=M#2aJc4KeZhn0Q@G zyf!A*V&dmx;x#ex>X>*{O#EC-yfP+!mc(n-oO?*v%<#`d$WN27S>1mbA+I1|bBI4h z!sg?ClEk_`{|OSmsl?qR-mS!slX#aBKStu6O8h8^cPR045;n8+BP8A~$Pbe^rNj@B zu=$$1NW4vuA0+WsCGI5g>q@+g#9NfOgT!Ac@dG6OP>Js+@drwLABp!Vu}b3oO57f< zw}tEf8LrVugGUzUy6O8>vs=4`rsuDK6U>u29*U4 zym;V2OD`IDJk>uRRDZ1J{|ll`*Y83n>H5zG9s%;5s5RZ+I$#wy*OSOXUH|8B{SG9d z?*A#mQrG_}T>r;G_3w25!a?=#b^RZZBf9?ggX%x&`ri$z|ETLNaJZ=a+XvOEuK(?T zm{YF*&7k@_UH=J8E%<*8-|PBq3^R27uLji*>-wz&kD2`z_*wV=INbl2@UHG}hEa9> z=0Rmqx8F2ic`^6j7})iuaDBm`x?k}B0;3zv=z}{jckO#J#TP((k&SgJ{=v9|B$1y@To}blpS0 z>$*F%V;B9c`<<|Dq>0b;b4fJGx?Td{9^T-i{aGF!9-8>F9&ZYGn*_ zAM|TAGxXSS{~8+%U7m(2GXpZFrFO-Gz-G&O!h1i$%un%6Bc=6+HFjc#BtkyjYUQ`* zx3zD-kWmo>v*lYSh0g<*+353X#<*3iG-nDGgu?tF^J{A#ge85 z|K`z`J^cDN-SbwP8q~~-rUsYzWF&{8z2;FZOyrkWwm2-Xo);uEwamYF%v5YFj%}1u zadG!@6^Fye3hc@|m$8Ue;jSvHlt(Dt;{ayrtiH!bEYD_mUX)$=pa>?SeoMu{ao4J; zG=8Blg~-i_G6b8<;pE{#*h#5i{Z(e4?<-ccDQ*_`!e#Dfsn|89j;zyd^&DS4oL9%q zU2PLNC0!ziUm1g9B8Fn1C7Y8th8%aA%ho)QheuOjM+Jr{GYZ6+lqU0okLM2;TJ780 zx8<>;AIokX7sbli{+0QWY-!SBiH8<=&>vdXk(asf)WYpGVfJ<#y(Ah_H|97taeJK@ zc3{RbH(cpt(p=rGC@m@qv^Sw+2{xQ`>;!LiB^$RnYu1imC2NXFk?Rhlqgv`Hk4AME zoyl(U(=a-`r4A48l`TtM@2*ekI!A}KPIIJM>!G*4ZTaRs9Zk(m(Nh^rOhbDt0>#^6374`MXrF-Ln`L8*?K z*mLSPD^A!{aViPars7l*_l-WA?XS)IDnsg$^Af&WxhRLUL=esFMLPkDDSOdZfTiq>G9tD^!;E@jzeJeY zM`OgCGfg!qPQIy}jl?`l>`SUgq)w_{^ZRC`1BY)yIw+#A80kRpP3qycNkH6gNkdD{ z>R&nyE!6~LeR_bM48(g46m0;dXPy}RW~bG~h$y0N!HCFR|4=)R+C@%D1uSW;{FSYe zyHZv|4D3OO0h86xqN}bD@6!csvlc{WaF(8mmGhFxVvL0>sxF0}Q(y7Fn3HJwaR+^3 zT8A%NzB#y+J8~#I78H7`G(}cWn@QIsnaTnAMyE~lK(yR2AB^4`=0%YV4>2%AOoWVT zfK?GU*$8C;uu!9{L}p7z!Z>rXSU4#78-^{l%3H)5S(#*$76)KsoaSRDiVSUh-wlmY zQ2s$sf{-iyA^C*1b<3`BGOy4k6N2+9ubgyGmRKRtZ~=5shJc>!5+ZvZ)Js_wD^K){ zhfncbnVFoW%3U4=+Xtyvw!Dm3_ioHYqJwVfpmEVzWU8%cO#f%&dAn^Bk`tTd^aPDy z8kN;AtkL{RcuaOt=u}PAne`NjA$07hoTplM3T?3_;k*K&u3;3N(kmG1!8m%*t>8|B zfLl($-W~UIAo2dY?gcyTs}s7aGt6U_^cUMlwA4XJ6SFg*XjlMT zK^Nj^>1?+@(JBUn@SJR9ltv)k-Q!KfT>!!WN{y5s9r+nq=|;!;)0@oeK&G+PPDrQ< z&hS=kTJ*6L&`89ll6?(}-9V^wLaE)*ySCEaZU~vm%Z?_G(VgVP2@qxHBo^Ozo}rK^ zmA^Cjh6bh#$vreLfhfa3F2pHmUbEd$ge2!(;X*Ue;EQL@NA#hJNw2F@k*DP?bzFY{WJlo<-?80(Q zFR3V^lI{?_(Lx1G(PyAR0|FUoVh~}4-Y%eX?xUXKo<1@e6rV>K6z{2@$)Iqb*aAEE zdo|vO>oyh5@AS-Qd1jC~J1G6pL!CJj=J{={$PW+X35V2*y>D)!%f-qQXJw@s7BMS< z_J9Lpa}mDzjbIw87qdKl|DXX8qxOBei9+UXl;A8|+j?22Xty~n5ju?(wO%wbg6eHG zPpWBqlbVXY$eTUAEbkK>0#7Th0}#Hpo`WR80a?R>qEMJw9V!H{nUZG5XEy<>-j2TskmvY_#_TY$Lql_l zQk*Hps|wao)71(!CF8@bo5nEscy0k3V`IOV(6gSAka^;&GBgi;BSVe80WeiZjr2U9 zCs{`_usR+u#tV3W&W7hH91G)5q2lP>P;u0!D&C{Od0bFW15yY^4S7q$khj9%n`Bxe zrKZq4bsR(!DAYR+`n2%Yo5n4xqxHITeuKuIbo)h6#&S5l%ycQif*ajhD zyT(8Tf$wzL7!WmCc~kz5az}cr*`bmO4-KSCNU_XQNAa!gt1+JXu4_Rz0se@$t zhT-0_WiFg3WKInClzk*xYxIZ|*11OOl)?^-V%(?9W0PDW&j<=Xkg?dp@my*?tMY`# zfIO62Kg-c9U~INIz@M7|Gj@=;`TPuc z>7)tXzs+L&s!WLD<||vPph8_>0iwYn$jkk55KNr{8-V}$JdXVhLh(2i8peV~iF37u zqOWAv1TO>HQ7B)v@s<+_-pvgjK-z5Mcm4(9SVjDE> z5dxE3qVYCBaTOSaGjFKo3}}+R$1a&@i&3<<9D^p1@~ZWM;hgA`Nr@S1f67|Va4)S_ zp!H-ZPqA*DUCp=o=CZhInO=u;oovQ-@)g4hi5|55oTtFB;W~&Td-@gPqo*tek`RzN zz>W`Y4z!TYqgg!HGXF_xZd+IC>=_j}r|_C88;Gft>U9dRZLJZ@M}^U;-lhcAJ%0 z%D#Cl5uJU@7>@x)jiOlF@e3C%v%)7uxq^kG`GKo*s-#BY1TDQU*u=zkFx$eS5?csW zX%wtU7sp*_L_YwK8=+OIqakB~8NGbm*T^0=Xaz$&@jPbx#x5)wo!l76vA`rLIjJQp z`(b|ooX`CeL-gnUGRN;M=kGA9HP_r*7lD#Wj$|j6t?uU zyN2d8I+-K?sIWCViJ7fA266WqMRjC@OtovUv0XS-7I?F6mlxjk=3$>V3Rmsa zoU$7lxmYe*Be_~5yQz_jY9x7EBNx=e3wIDdPQNY{H(xglBiPZy=1_6L;oeJo>D8pYU~yv zvSu#?s;VugnQQT~LjmA@H`L{ADx1f(;4W-aW)JG}l`NIYF zfNo63OCrP2MOYbTYF>sw1elt~5TF9ete6_@Ze}8n-XFX`?+e%9*Bb>tpPE34L29~i zOQOwdW5TnvdPVO_P#mIe9@G}Qgk4+P=9{pS{X;jjD)~5R;idz0m)Ov4Dpj(;jJ4XJ zbHPVNk_D!cdQnhoTmj#i(r=lIzA~%caGlF%9(2D_E|9Z%U;}KtP^{0Cm`!M}WB!?c z%Wg0ZqYrQv3w_P$?CXa_~zf4q0+9Y|c! zaHIIaN9XflbVHrSm6so6WU`tSD=8+y-2afJOu<|+2@B*X$4v6PL&-dnuf6c)%0KYo zPrS`y68MZ)uPEd{UN@?=_e6EMbTXQ3B`sE-E{GM%si4L*MsSI#sM5~TR1vs+s2+uA zkDa!crJL)Mv!0t3#Ij&=(4*y}cRfdWpzZno`eH>+AxTA6>Z~$e=Jjh3GO_N_rD^_i zL@fkrkAh269&lQl>ZkDR@^jUDBgVNI+8R{6f3SGnFF}=X3xjU&ciX!jN4QB41?p2b(Hm%0ddj=KAAv z$`RRz_YoblAF|QNic-Z+*EkV1`6=*<9Gu8#rbEO-(!x}8#aS%v8y~0+;?}!~ zvjW}0bk>xxYdqgyGwxe9csuoJ+2JcMrd!WMEl;oyRP+$xhUO15Q5_T-Q9u&G)E-+7 zJ>1}x%gD1OdmsGjvchJ0U2k1r5h@wX?_BJ^8FQF+Ux>LDm8~hC*P8NqDQU{ZjA~A! zX~5w^i>)<+V)~JVRtG2he3WeKwS&D_@qf(@q1V+RcOy&GBd_2}fOAvCVSMQ6QgII_ zQ_ToDzO@dzN1vT>DQ9o0Gfaow&EVpeBjDvUjRK>nvjXKju_D{_qBM|#V-R*2 z1uATb56xRnp}PAHye~eP$jvPiNEVojyF7LwaabkR2|0WRsI=L&B<^_qg_fV%j`9qB zS*R~*J%ZKolBRHMSd_XnH5G=^KVIgAt>$s;sg6v5b+q3?ETzCK^$)pNMdJJpBfuFq zxX;Qm=r#W`A?X^S@eP03WFa`B)N@)Ytg(-J2R-Z=FPY=R#;}5;tQ}rX!;RZjkrc1t z`54y=URy4y_r2mNA7lpzga#;qA>uL@U-Fxa6*C$J>cIqiU+@TB0o<)^S(5l$Zwxke zo~C7%0pm^)u1xDNhdJ#zlg5E(fU0q6`z?E&(R4pNNV|2}19OV`7iljSd$4p8iQo^? zb}s7g;)T+0RQwk7WC3nD!Fn*^Du66hx0L*(Cos{o!BR4eOp?^=7rVhcv%1<1CijA>WH*;JcAPQX zU6FkaUw`e%a#1zQl-1YcZwi&`3=5)U?M3ZQoNFKjr%v#!NxBj{C==T4c}0^36x+B* zFCmRJSfV*!_FyT~U@7y#lKixEk17!)2w@b|9PQAvQ6T1cEymaD3AHGssTPrf(EgF^ zg_=+yrB?VZ%Cpm`Jd5Rt=DoF^{p_o=_dhfwG&8?#Z&U`WMKW`#!UHbrO#B4B^#IUt z7NR{*_MH@aQ-3`GPiKV*JO4|5TgbayBRQGD2)kWe(9{nAL)Zc0r)s1#1lfR_XcZg@ zn6{)C-z&mIqLRTq_UIDdPTKb$ebCZs`t-gzrqHLeSE2 zDtEO=inHp;?}?1}co+JxROR4G=*f&?UN=mcw^T`tBdmT#s@b?-jR;$3t$1t2zp|!{ zOo`yGA*4aZhBXmdxkJYF#wHTuVs=Hqq_ve=s;%tfW1sVP6y>@-kif8(P#@&Fmx1J1 zjJ;%)MzZ@8#9Q1V%A12A+#a5hv{Q>(F+b$U&hU(+?{SYT2%w%$j`NXhE>lLNuu7^r zLsiIYPq2gRp6~ZI@A;VXi;|smCdaNCN)Z&I2brQ4OSB8w<{6gs=PcTQ$yMvgWFJs8Ug6cZ zcPZ^0pyrd~!ftnzOYs9+L$;O#6cd;3W5e z?j7YhA;o?NA+t6wm&AHO!q?o{iNJ&ab6>`X{&jAD}CX3K3HL(PNuwFk)!7WVzGMYC;|+LL7O znPji)j>?Fy#af$BuCJ};VzH3s%WO;)&v)$E`Hmqk5Nj@9&qsQ!%M_^ZVpkq83t3L9 zcwm_Jn@jsZsHSO;5AbMQX8sFwt1&WSO#91~i-Afw#`1~+dqnTz#4ax5@pFUU#om1% zma^^rYj+QE7Y{KD{Y~XCx%#TuLfN)}ENeQ_(N-P6Jco;e@}gir=&flnIuraeIvpHl zAMxwQ+l9s@8$+jD=oPisr5+^E90_bS1{aWxtjtGxfaM9aI!$%VD*`K#c>r(o5;L^b{I`aE;z$l(p+6k?D1XO ztVNJ$0!db=Im~5F=+h)n7Bvc&GZctBO~T`G4oVP6g$biC-6vm27!@XrQXN#CsX7ck zSmY_9v`hhX#mXildwN(rw99&InumC#4o z-hu8m{#4_Wp8*C^pdt-xH9QnHauN<>Bsec6k3PHAQ#ly;X0>N?WrMu5;K1It+ z(mexkEqx021rt}87UC?LhC|>RhO|*h8|g&JHWewX(UW+QuF;rI{7%Evwb-a|X>3g( zg;J3V`$}`ZFv=Gyg9A(?XfH{g(sD)n7D6%2Gb?#>EQe{5$A_)f?Zs^iX&{1EDs$Hr z#I0em_|wH+rpqnW&!+u(c^t+etRmE#(s3pssmbBiEfzX!h_L5d3`0EI#%rFid*l+R3LeTR*a)=GyRVU2P4Ak2D*+T-C>$Bv~&>v!T6MZX@t+ z&(7M`@Cp}0@Ju@k!yQx|kUE9_Eo$Q(HI06%b4w^9`1z0L_e$z^F!GLPB(F7lZ&sRb zxc~6cWWqpT1EF|pXFCF+p(3Vpt~ZFTbAGZpqEtpd zW~QN((zqkCQ=ds*1Pz6+ow@rlbL`_@tCrlRNMTHK!$@+!Fd!EO49uEHGMB-up_4nw z=~28XTs zCw@K(qJk0QJVQEK0!9}k`jRJ}{I0S5OiWDX8v`zKk+T-l*p}=}l7*bOKu1*>*>Ez#&w>AHq`_;4r|KurQ}4Gd z0Qid|`i-==Ql7Pi`G%I=5-JfGwZey?zz16}W9_9$LXuY{3Nb^39GLzfIek$r@fBfi z#pROqNQirpwFGT}iGZ*)Fm(W}i_NWLoOoNxrKQSJkON+4+}Qv36&Xqxlm1sk{V1aR;hYQVzjb?I@q>)DV*lm ze1jUxXQa~13JQ6#CW_^=1dy1astIJ?5DE>mR*)Ji`yf7WTR37!4t&c5L)C*vLUf5T znX0f^)^Q~M_k;&Khi(c}|G@C@>TOs;jcpOuu!LH{60#LaVewGQBuVv#chd6}kyb%! zwM280vT^kg6Q#z4tFQx2_2*lNt(I&*C&lm{?~B)y`&Bkj8(*4ok_7fyGVIRVPlioA z0r%YZ=$~S@DP#(f?>v@@8Ki z$+GwfuLXv)cM5s`W1aYZJZBvt#O^cxbNg6a*DL3=C4p*JbDk<1xXT_S&TCI|p7tFc zGb>;FtLob0o{bDjo&NEVaIzNNCUagypiA^%0`{jH}?>&YYphfx-P@+w#e#x5s@8ROs-1TXci>*XBfo!F$2SB2dkn)}x%U2O47v!pV?;I~5c@9J+oM6#IExSO z$j7V!geHu$nHXD_CkGyf8Kl$2+1}j2elvhnqBw`=YAwX$&zV=15!S zNHG@ms_Jq{#xmn{W-@v~j2WWzi<(6zmu*c_Zlv~-#SKqJg7T@PE0a@-iBAW z$zJoQh2=&&AWBpPSkWYFPgC5OMIRj9HN$QYH?3-|wkD_v!fI2IGxeUKb4Jiawp0fy zMi{Zo9H_LAe^Db{m#xT=~qN>ndz<~Zn8n;gYFGgk0M$ILeO5_?nQJDWFAgG4n^ zr*kidSEl_oy{bOl>PhrOEN-(Z&HMPN7vI^uO4vVErEkRxZ^?c7>n9~Ad@k9y-lg3qkU+o0YK*^EI;df_vp=W%yK1&H^>*^FvA1J9f!{i5%)6F9((+ zxX7xqEdJ@OqgVPkcT+0bM45=&j3GNbq|b%fh8Ub3JHU?E3dBPu0>LC% z;Z6jfS;?B*C0h%%Vw$V9L1PFQ1w#uvHi2vp^#>$>2R0w4K&6 zeMbDlL%L{0_w|tb_OOmQal*ufcP|hUHpwqZm!(>+4u%)I`abDpS zwplS_4&K=%<>nyS_v-gKsq~ka%dA1nD?m&~hZ!Hc5U!Bb4HU zE_K~_2%epQLBY5P9c4I#V@4(yL_2hO^8B%FjV(>4X=RfT%uiYS4Xtoknu;l07QbJd zg@xFX3zDIvdVCaIkdoBgT2|482#A0Q#Un|5Qmt;PRx=+~`eC4leC8YZ#IX|fr7i_e zh=}s+go|dwU_s^agOP)#>QNSBNmw>k6h?)Wy7-Z+OLHSr9vKy)AF0_1~U^NGCMxla6dC2G&^n>&Fs%J`+PRPH+J(B6#xI$ zHezEb0tFCly^WY;q7S{riYWLv;T%>(bmdd9mD#8;C{Z>+CcZ@rW?}3Oyu?6oUbaW{ z{>1j|id%Rw(ATgz!{OkgXdDfe8^P4|_#Mze^>Dp&m&C(7jO3Hxp-ys|YZ;Nn2$IW$ z(liQ(Af6kidTeq#tB699aHGcZ=kWr=+z8-~gO>g2li9NDDQs1St>n>ya;SW{Ta~df zf-omBgID26ZB@o6^)ssvJsS9#`!BF59$!-U~-ut zr8e)fCnIxtL??!M_>;w;u*fuTF|%RW#}!UfZ`qp%*YxJqiW*r@w+t1gPMMn?TTQ3s z#~G9m8Z1e#>YG8A;)|@mEV38uqzE)4w`N10i2wgCp9=H{4J%fvZkPnMs6ynR)!}&8 zYUC`~SRO?6JZ6Tyl(MDlS7nko|EbR)Y9jv?m1_RoDm$9}y53M=yY&y#T1xQ-QB^kO zQpH{H)Hr;jd`hH^=&Mz+YTI{LQK1?6E5l!o8JeQA=LO48tL#YjfF8*OCKRR)4hw^B ztNV47LWa1NG+YsG?g5R{1`fvn+fpkLO=gf-DZzoCSs;e6Ua ze+pj$y}UsLjLE-Q@hZ2xo2tfF>PYJiSs@_Sa4xy2cZyB0{AS;2R{Gwxo+pJ^cje%ui2j9|4W_?BR4m3vQJW!(jB$Rsd2nY;h^!flhD1;ewAz`bNm zWKiz!NqWaM{qt=1$R6Zv?UKW;(pp~4Zn54Hjq8dPUtlJ)kHB{J8sMkE_CN!Gz=kR+ zI!LSHX^_BLMVP$eP`|Xi9*2rhW|k9yF>(F476?=eEV9qp z;Fk_D*&xzFve%307s@${$Mp&lv7m0{EuAUNM+_ak7b62Is8M{YjB42Ex7A+uru;y- z2FY-0M`!-_mhEhqME@EqMFNi+nVOx?stG67c2&Y_gy2uuu#u9u?c9obyMUt*!~RZ1 zrMH=biV9Mz=sLHGFszkq^*GTk0!}2&zvOJ;{6%#J$0}YL4HU>s$+(8npV=74pOK8K zoctN`KprH0M>39$ObV=WM)DaDZR7FDKq47$3c`0{Lls{_H5m$CgfR$pXxvj6+mO`H zsTgA|yO%mXlPl8|n2XCQMIt9;?9}V=xyO#G8)GUzO}tqpR}@BTMu6oYWXj{9m;`pg zo3s;J%^t)OX)}+k9%oNYZ3bvkuv-zho2yQ%h3MP+gx+dBna-oXVkz3{!#hs}@E~d? zb(LBex(cp}T~)VM&(uHR8Obn zwJS~Ip29}4>-3zi+8(+tbQS%$3W@|YOrOcDv*J1ER1pBZ6_?LA0QQ`U!PdSpw|FDy zp;Esm=8gt}B}%9n5n;DZ%vTbyY#VKKg=IOqBTjoMvIif7tOm8;yV*$l$>D3=@zsv_ z(!G&(Bz4DEcLToGoA_F@w;J0K2{1+70)VeLuWS`v2VZMsBPrD&@DVzMUz5N&+aB7k zDO;(LR0_j%rcMj(a*6(9(-pSS?Uf5*4_)@Uki?Dq=gti~aRMrk8Vni9R$~sQAfyFV zcX)F7MbZrL=RTTGeMh2 zYFnZ<7mYZv2BiFhsURmL5T+J^Nj&AFSI7%ptQ0`hGg4B?({sj%0J#~l8I7n0*^;~I zX6Rx@H`@~eD=-UOOSdV+f>SzZPpXB-sHK9>u97=a$sKcus3a}V2|jiyeMrVsF@z-{ zE>m3YV6ziNb*7Yk!(!bMiBT(MaAk}0rIO_di&9V|j&#Qz7P!ItO8g zF`c+p$y-d~SaJw4TWf0K5AfcP1C@?o-^E0bqCR$mr73?uh+4k>+W@X&Ql}wPG_5g++qv>31 zYW-EVdzW^>!&cCbY6R~E0gvJvfUP8G!;)0JsI~T)o0GwXK+|folAgxckQHifsphb> zekt0!Q3(I#NAkIOPK`N_iT;J#=WgpqG_LPx7@meb$6Xu=P1-U#eM^1WaOg|S9>l>v zgnuP565^LWgjz)_O9N3ek=wV*v~8NmdJzOiE6X~8?!DD4<5K(cL`$wE6F|ZQmXr+T zOC{4OKJ*7RsKZItws2&3-X}R_2e0+Tu5>!||3qf+Jw8#8aAF?vT#v&wqer^an49|^c6lkB?5oTHx+jy|5d)pp7Q`EV7+qa;0wW`8xu z%tq@7VM}do3jW+;rEF_c@VQihmq2P0iKyb^j@7l}Yi{LW@j`ipRPq$LIlD$k|`^O6T%9{E5> ztnW1H@%)vH1fwl|COZP0q^%f*N_6PeWLJQbj4QwqXop+tMo5&H2x+G+YxVKeZd=vr z279|&-C=~d#|g>rDQB-6nSM`w_PO@3?2V9Csgz*reJZhrUkE~qYoHwfA;neR4uFvM z1VXZWR(C*$7?Xz6J~-v~lyGVkb`CBH5PPl&qlwtQ5PJ?-kEq$kG(I(S z1uO;RoE<0Yvp5l83MT?=hLiP(lXJldzo&$gbINlYbZvBIW0rG;jtfDyNd?3C20Bw$ zLf=Mmv74s1xula{i?=&mxenKY290W zx=5u2HyJNuQ(SJdhvWUQfrJc`IQpHf^ZiBSN)$3XBv@{p>~&t?0gS8koI3v!GN$v- z_578La=xz~hmT_C9|)b?SLdG>;3UtFaP_hanFDDHg!9Yu!sBk*AfaD9x@h91Lna^T zpIpieM}0T{Bs-MMej9o9=%Vd1gXz=1Jo~LadsOz1WDobp7wG!Y{ut?SH2YY8Jl6fk z`{P}@|AYQ`x9PA-aLD_Brza;DDZRJ) z`sWXiP{1)sSI0HU=(Xrq%aXDVCwXziHSs2sr2r>+IKi3Ydq#khd}e^3o3!^iW$efE z%1wH%?ytHJJ4s?+oP_z|aw%l}%<>r_)#%|yS02g0Gfg;}y{A8>iA(B7$Zd%Z9z$M- zvk&zdi}kD1+fP=9G)(Gf@SD*C2BHJlAoOcL$V^xPtJfvrhxyb z2CLwQp|I0LLR4!MP1h%U7ytyMvBfnw!DRjFT1OdH*^{^CV7EgdWmHRL!CPEL-9j1GyFl`&`$M@wFljEmBY zm5&BEC|XYB0%D#W;3S_D;i|l|@^X1J0H0GnJERuNOX7>ws-e!h=(Q}?hk-D<3SvEZ;WRBo(%koz1GyHxkE@?|u~ zS$T5#G&8TNHzG54#mxFs<9|zLK2mo;Pzs$e0^^BIM0Lf+&nze9h1KXKFUHexX?dBY zy3_`KM$TBDkh~(H4t|#0QD2d~GQr_zNd&=39!qdIfkqmf~fQy zyrP`&$>eLKNv|v~RQf8VkCjK1zFO(a%1f1guF~Gildo0UsbKPTN;@4)zFz5mv=px> z8~0Gym8HGw&!NO)rRC%I)PAM3GW?!aR;88i_h93AX?62^u=c#t>P_#3Hednt1zT5# zK4|)+ygZ2RXO|JlN6U!TOUj7IOUo7VQ0ldkrxS>(yC`^GHiGU+llAn#f4>g z3+ArMNH(nICW6IiP|Lny$m;XzKV{t}0DTMp;&QmTiM z4L+Qk%%5fc%wOFwpmQxRGh3;7TtBlTxv1c6BuA)<5fyw>+pLIV#+(KxDY6&!O$|+= zJ?nE}dW`WHUyPi|2)bcp+4tlGfhlQ57Od2fWTrTi%wWJIGXqJJ%)86BN#;Ge$H>~N zdn7YsJ(J8--z4)s!I8`i3`{Z;L1>bhqD(TMOHJ0`9h$=kEbyvT$i{pcXPh3IB0i`2 zP%L;F!;e9aWGnVH8?oD3zOxPGHxA^DZlTpHR2@R9eD8dWb#25?03PtEj%R27=o6Z| zRmO5{2cn6c#tPo^8Yw7c!+4GxFtggTSMu+#^F=|mT0UFnD_lyJ8RQZyY_4Wu zd*_b@Hw)W4AEF2rHdnK-z4MJo%)<80H)299t9QNg%lT&ShOX}*3SD!ygRw;P7RFM) z!u7I1Xyn-)H(U4i<=)%$JG-@MXg0@%-u@cPnA3x2GY)<}bhsJr@(AJT^R2WHdU&tQ zfhvwk-k^5v4Z5rh`$9nj^naWQjsj0&u#2>d5@KF-VqPno1-{HixR{FV>alrah3Jb( zY%MslJ^Ey(;8>_}%sd6hP<41xPM$wn%;ASjCuACOpNZwl9=Dha)fLh?ny+oUI)6>y zWsv&qG02Mw7cz6th}72j_L%ZK7IlonmIYg$hAj!UG!3(QQb*Tg{;jns={AR1`;%^S z7`jdFuk`J!s0;I5Jft1PNxDn^MAg@Ho>l#5wzmE1{8g&@YBWt5kAHgjj!5jGqZutma=VRT& zO!4CgW2GO(dGbg|%fLT{lVQC5IH#8AES_0jnD<&19E4lOa-v2uhfYc{VW_@TmRe zUeOW_Y5(ZURq!kP)Q2PRvRHIX@Uj?-;X-*nS@aMWa3c%()PY)2!VLwZgh_X&1^RcwwVA~I!Qy9YQdoQmIYg$h8+{^Sb_;#4I!6DAqPAP zkZKDVV?x845rjiT$K#QCgD`2rtvP}>(E3PZ>L48A`+^%vf-q^qEg!+_d}NnJL8oRx zM^PZ;Q6N+jAoi_Dzy8+XR+h6#>O#G5ZFE+NaOLlUrMv*@#4~q6)qCk!w)E=i-_E^A zu=#RFwW`?@9^em7=^dDM+ZQf-y7+WqDda@iZp%MalWsH7P7>^}YO-cJ zr`)@VVb}1lo7mnP=JD_VBDVLYne4qjR62n}dS7`?um#VRk(Iv)_u;w0Dm*t>g*rC1 zEkQg#SU5sA6W8+7-@m#l1IBp{kCZm%Ncz+{4)0>S-fKQ8d+Wlq(Y! zQz2s^Z82{;m0iggpV(@HzBXNXCU2;lczH){>>7w%Ju=S5at4BIJg%_@K|I)wvt2I7 zXk!p4Ce}0v#gscD;w1oM*q(?p5tAJPQd1F(oAQTa-L;WUab)?grpP?>Ls1BQAIuOa zVG7X$F}m6%)RbntXP;aZs#@CMhlr7O@Q2tvK_jZJR~BBM*CMj78oJsiyq@|F5CTx?8!_y7$Yc)FR-Lm08O*unOv78@Wp-cp*wA z{zZ8wwK41T5lg#Dt*7Ie8fON2d=8$(%ljU32;z21bQ_hPvsXtGRa%hkZY#Zs;>Cx3%r+!!qo$MK_|0P`@?|m0JoAcJ$c9L8^@| z;c}-9RCOXk^VoQByOA0`$**cNSzuq)X3^1*%ukJ$nxm+uo2NO73UHXAXpGV}aoe!7 zN$39K`|iAha}!ZuU(8=*daXU)J|Nz^Rff!Xm@-5O+F0p)F^7+p&Z-RY5N}Y1%$u7soa}c=)I}XSf=wA_ z7Mp-eZfgTga{LS_ER6lw=Y z8cW^?v*bc+HksR-q6(vlC_2qGCtn-{MsXLIDzz+F$AFzQHAOf*w?em0OJL99eCmMM zX4501-%V;0#dwH36_M7yMoIJF&R2!NnKEPSV`kwzoWKwCZMlBVUu?|(sgH>B34Np) zKo9Pmm&2e-#>NEpS<@oa)-~uMhm(wBIIV185b1D|G0>BoqD5GbCz}>wWCFY{9?FS} zv|$n2_dX4%3H=^$RehdOaGaC@=U^;R@qzNd<@Dm9 z<^;7p`kwpAwmeS*+dx#%yRm_}oDY=e6HuessQGd~S!vWT&_U6&)+HuklAH9ViMS|P z&4!;HzO6g&Z|YTk8gn`~$nr10PUk#rIc>|5zr&daI%Uz-=qsLycqS%AX$WIhc2IJi*Sz^=2{nm=! zx+=pRWBjH`3QbX@-O%@F(&E<1jwlF2go74C_=2Rcn-mPPiWBrj@EW=_tg`Bk{?t}L z?>0f_B5IdJr(QTQ+*9rf>y^R8E(DHd60&kP0+PKq&0D!c@ss6FTL)zljz;d1(Y>o8 z?0G+vD_t#!5+Y54A}eJJ>yTMZ&nTS^sh{)$1BpTB%3fk1+udI6aZO_7TmVA53p)no z;9j%wLq&HEMh{IdZl*`Y8^;t?b1b^x9kwi3a@9Kwmsh`b={pS1S6|k@TQ&+_@{~fC zJf*-TPxT4sQ3|_?;v12F`!)Iadsu7zntU2LF_-LbJbkTDM5WhQ(U_i6 zgyx1;u(0iEY6XLsO=Fg4^r&K%(W5p}YtGqO%(BsLHdaJ5y-LkW{hpE@RdiP!vut|Q zVwNp_pCva^o+uXUC6X~b#`I{=-%_bDUeoj_0^i<8kH$z(Q#|fjA-*ISj+@26+Ka9* z2{V*e9j$2r$y^Cwg?B>O1Xl~2aAi3b+`=YYS?<=o1txQ~unAX|rbI1l!jfG{nh<*IJ;xEyG4vRc6Kf$o9YiZ2<*E)nb};mYrPv5Pb}-~73adkp z9V}`CT!$X3hS*gWdW3J z@_S+qJXlA%UR+wJao}(s&}z|)g&MQFhBz>C6v^1##(`?EJ^ z8XRl{-{!=cG~7kPlF-&3E1rRC$~pgf5` z?h3ZvrxI&a4xAp0l`sG}t%+Q3fYa0ss-_1JqwxcoOXgZYXjWr(OP)MXqgHCwB++$D(v^v{uv%B?Dw?tnTZk@>41%+i4wR6Ys(ub0W&R8 zLI@r1R=<)Kq8utO4s>yTTIFzF8IgG~t#`PnjI!@Q3X<=q7;Izndtr0Jhm8s~zJU*x zve);=i1j1cuPOMQ>s$I76R``Dg5SA+TYpR^9?4Gi36=-`b_Kz6{|*JgbA4xje6ir~ z>W`7bN3!4SkLg^(vlL~={pMqwRCfTxlj4jcOWsR9m%8y%kN;c%GJ;i)>K z>XgTSk3t|g2CF!06vnW7|SL>(luN?&zM*M{q~?R6ga%!%5x}s=vm5X?KV8I_bx@(S*~ntTWSP z32tQx-l((SR+iv(orS71n67-SV(@~xRqc58<`dqSg z3I=URt_GM45dUH`OWkAvz07!nW&cl8D>MQOnt{aA(hA9KZ-u0`rzEojE@Ze^D-?La z?p5yPX3dtCQ9AGI1?(q(A}cUFNlX+y<1BsgZxYM-6BNLa@FY=(KS5Po5}qXbXjgX| zxghl0K?(%sw@@1*;(`naJY(VZ&koQ={-~Mf1Zbl^)L#*dE(uZ&s2sv{4GKv(%PW|S zH7+O7%AoB+)!|0D>vnr4B$MMPmuHx`;ZOD9j^`lE(KC zA@Ydp4KKEICVOjvyt^}aQacz_XXmwmR)voUHPvWX52k=Q;Fy#O~iEF8- z)KQ4w>ii*UVl)k{-xtzaPqICpqM5D88d9A4A0Niu5U@CF^~eJbSenhK-!5eX!bhq&I} zcRGpfFlk`mEeuOaB)Rj z1h4x-r1#M9YUGgD|2~4`Fios2cag?40bQ{yr@>T~;8vEC;uPHaQSfG2hoME8CJjwU zSzBnrs3RK$=*CRakqz|e3BoYy$VS8U#EHtNF;&v_Af>x4oQTlgbxKU{lJgPX6ts~u zVp;lC&_+$rfky+hQFC-))U6G|Th?OY&2(VYt=?lR@l+?GLG!UgHAWJ$}PwKp$iUyRP7QxkDn{K2;>1jP_l;|2T zz^5tjwCO)|A1kF?_nm@D(S3_a{t1Bm!;%gz>wnPmcG0%!kyd_ zm3e$R6|5^)d2D(^p?XkyL!k;l#o_{UlmdXIlMRI`0HUl`r~({oC{zhADZ^6)^(ZZ6 zcwb1<+DFBjpW+*o;iXAvtplL_wTcyh_SZ^S0Oy=(E?e_2YwaiiU&i&u=!W>E(^bS= z)QO*>LaL`+N$VkPn@p&ptDbwUj0GU~xL(=cuzEQ~)VaHATtzEt-{5)C0(&r7Y%R2a zRG{P1fZXAx5(RJYbz0vcc!M<4qBFr8gekbyNAO19pNViMm_#Rv46^stkB#>Qr=d;( zjr;{SwV?MK^%30aFL3jsYd<1XgBe>-wc%6?Z z?^6R`<)-?tQ~$6UthE+agVl>aR;RwL7k>!eDC<Oh^v zKs$?ml|F6g9C;2A;(i~L8Zhf`Y6#firGTLD`vRXqN`)a@58xG&&wPe>drLcJ7qN&7qC@(yS{2H0eN{YJ<7%?Pat>BYp3!7G0T$9imhH=Nk zlSa{QSK~$VZyLqBS7LGvPh9S%-1LNooCr@Exw%@yL+0N!a+BW+lw8LXm%b@CJt4R2 z!;?mCdID;02v6$V)R~X7&nJ#cL&hVd@fukA6zR2X+DE3`Ud?GF(lT=%5fOKxasYB9 z4m=!yMu<)~2Q-ER4nUe?xh`a41rv?rF1PZ<&JV^!m6R5rnPm&<;CkT#lc#;H%Ke4F{FDD7QA_}?* z-#GCF(qlL6qmZ2mI@?)WLj&BemX`M$L03r7UC2ciX%cjW1l^GUU5HcN(`d)M0nCD zF^JY{!;|R}r6)~FPA^k#%(9IDo991a|;gM+sh35BMih zf;)guq6BvUpF|G~62L!+lN}D=lPIbkz$Z~uTYYWj-zto+oo;?0q~!v=Ta|x|B?eUf znuHet$Tm)g_#0#!#kplG8T=TFRXErSl4(_Q*FiE{>=Soyi)bd>FGN)JM&0Sav!Z$} z$-Y8{i|TbGLFpIfuFiG)25#A=M9F(vstzH+5JtSGz6iW{M>j7j>Y}LL$!F|-5+6W# z7Li<3@8-d7&szB{v2fjAdk+uT=R{w;m*gIQ=Y1r1I`sV{*%(DHe1PO$d!cMym94SO zdI=Wp(RS+(@#q|{gYsWKS=#>3MfHQkTM?MXUMb4qWxDgW>$PJi!_g_#T|78kf4`oA z4IFD|Dt&f_+#@@tZhABU8(jWa0yZS`;|bUh;{Q1T8~WzuR6_!2POIpP>J_>T92@zy z`dNU7ygB!fJl~VAB)R0sdlkux9QtaK2R!*2lF#%P)<~Y`(ASc@*psg#`3!&I4I~db z^p8n8XSxbAG=3}rmrYk0@OKk%sRq730ln$==DQNmkz~MMPe4bf0q;*hmzM^7qkx#B zU4XY~=PP z&+YDz+oSf5%a%m4XA;nJGvaW3W={45ILWv@OOopv z4r;xYAI`vOze-~~fEnLk-$Z7|_dQ2cDSmF3-g%bNbGGZehg0@!Cwvd5#Pq>pq`Y|# zZ}fZWWxJjVO?poKcX)WC-&>Qd48I2-yQ0X}``~SNly+{B(li(1>g~9Pza0j#E@aF4 zrW5w2J^CF)K6}!3`3|BeKSRK!r9PxK^(Hp{78S0SsX2%?5$#Xm^@lW@MO_i3n#ml+ zv~Jl})DhErRO5i@-AV^c8+HSxwPG$}dWX^$xXPwsO4}Z@aa_TP9gTZxm3ttmKd0jD zh-sg6AOtyJTK6=+8!@eWFf56w=0KOHp&+9TbZHtYCIpHOXyyQ7WdNZBno!U$lM@NmghChE02dJzptL|K zNLBjZi8VY^wFF32Q;h^jwNhoAOv5LthXAQAs)7Ki8Y*3Y=^DsdrV4I&6)U`>p6p2% zOB{ncGbi!Wrbg zNGu(i#Co@M;((52VfD@vpCT!YJoSG%T8Wk($!_vvUTnOiV_u4OyF1s)mx+?oA=07rwMfB^KBUz8udW-0{17P`n zskmvv0kHex0k9Y709ZRFiWT7}hAa~gTN=*~_iJ4>r|G&G`apj2;41%RL|dM%O*$^t z^m4gnyBM+xVXVBqak#x$DLdQR+2UxskaZjuYBsM&6SWV^6E}}tSjhKq>!xv!rGE3; zL-K6Ze1a;%e^y015>TiI@MYDF@2zgf2@h2K@KeU?6I2*+5Gt%C?Nqo&NxcOf$@irb zAht}%R6Ayqsf?R1hXDB=0vxxkZaP(Xle#6_%qUq$jQQE5THD9zOggi)SSi^UEMvk9 z!KoUuSo+4{et{vS?TaJlyP8v4n1)OP+Xe*Fn*y-7HgF0HiHuY1{IvaE(Hv6hESxt` zNeirH{_ z+8A2yIqEj_ zYiQK4JlqauOPr1ROKi=K3&z%H(I6u^U;G7#$3UQV26ARqKV00TYG>Ns$=gA=fB~%9 zYDWZEwbhOYuxitefOoKATfF5qjmo6|9h@evqqniEnu_%Jm!t2j)D6$juB+cK4!6TE>c-CgWcT!C~ArwkC4R6jq+H%r>ht`?1L2 zmZXCD>4U(d4F`gr1#u z9VklIn^wDYcEZMqs}C#+D|P@Fg-0 z_)S%JJO+3gRyppGe*XUS=*lpJO(h$bvUPsxK`!t|Nobjv8{=rH2s>$L)X9e5*|^KD z9F`qh!%iQ0oKIRdemGp*fjHtNDpkJ}^oQQysEL#8OJs_=UsBRianOfp<;l^*wkgMg zq@z745eF>p>ao)W9w8sKQQf7Y9CxUk4O!R&>pOY7bJk;!c{!&O$XGe$2uYGLzZ|U6 zpY7^97-GjGk`MYB+Km5JGj_!-ZL_WKl(y^~xvc5@(nHRN?qNFIqlSDTGt{$gDqsTTH-W2L4!x8F1 zhEI#?%?zs1`@`NL@0;F3gy0wvreZfl6h`Thj*Yj`-*hH=S@ntLn-iollhJ;BAj)rF zokJd?d?{l3rBg9zS2H&qo;mx1{8VZ(gK7o~GR4nxH4lwS>P4=V^|_k6?bZ`l$XmA;EBaSv^u)w8 zJm(wQ93+C0`}U-8zXU^)Jkq5gIrvN@YM(o`GG@(>WDuCYkIZlvg$jsoP+lN*XUdS* zxIi_+E3KAlq|W3Uu><@RdBGkeKG8AG^)o(!Pm~FK(lR~?jO0Aks4#S0fA^7gtKIZ{ zlvAz`J3Ick9iLsGecGc}isP(K`qMKXxcW#1vvZCaQM`FYv9B!j-H3Xzun)yme+q1= z*r(Hyaitv2P8I4k8ZSTl>B5A*0btp@dawaNT;|n!0u)fEtYsA@ts}u@vb^eTC``^n zn>V2#?c2i_Tg^~e>l{e{*+WezOfGt$D2DB8otu`C=L zvv2%TNJtt^0?dc+5K|OjftYM78H6frRDDZiXE|@;Ohf_9a8yQ76WZ7-Gi#$E%_LP8 z=>oSFN1z3|I7_olA*bF;&7P$TxKbyBUpu6;Di$R3Mb)~_FtG_?7$-4ZP&g;G#7Sv* ztbR*!JnEZ(22(LcK_-hu2c~<}$#`P}$t0Y`Yz=24;Vi4>!_Yy;scqHQR%YROT%-!J&b(Gp~tkJ7>v+Tk1`TqiGAJ6qhX_?NQ2E z^-vz0Alm`JM;icZ<0l#bYviXAK--Nu;wX<4y%G^CPM#|0bLp#4(B~TfE9h?<04wN@ zq)(noK`&2Vnc0<9Z)gClpjR~j*5+3vK(in_MNwl9Ygpt!1`tA@ws;iNWYxVBs0NPzG}w;Tz)=>Hl;O&ZYm;J!MG$r+Zq_q0;GoN%u?j{j%-%H6 zKNjz;jx>6@iptQBGc_BO8?2g8f*B{$I_aJo#(hP>iWw(yOB(L2god#@g$0{`a4d+W z(4!$&8&HeX(>Cc7@8k;LH^lxi5oFb%vF62iLnbN@v>g!? zN|YGzwuNDaS%JyU4YpabbEU9oRL1;Vg>!v~3;Jl{nAPoTopNm;En#jU< z0L4$5u&219N!b)vkIGYV?vx0HIfZ9_R9+ICs&$l|>AOvQ51R_Xzp-7LfcYcd$D2>QjNUP1_z^8__5zvUCl~ckj7qZvOV-wmv@vaSm_4(28ajfnYALhK(xo zYBv*o6+u?~x&jp|EvjC2IC!9Cx22h0Jb%$JM;_**hiz7%h0l51k`NZ`qXuKMq9QdC z>=iFnVAyvumc_&Hk}-#V+SYt|^&ARCvG?S+RtCLli8;!J>RY8SC&O|#Wf_~YLq+Uv7O{gOIF_MX6;-aU7E0bBJcdcWMV3S{cgtG7 zljU~Y1dQQg`D&Z0Z;cKOB{oRdvmyh=BMO3#!6<@{tbUU{&1wwxe;Yj}zXcA3!HrM? z$4H#O#dqDXWmDaJGq3s$_H!ggdRB-&a#70OVueKh(n(LM5|UBwAW2@2@jN8QHgJSk zAera{UHVi`bD|DM5Nj(VE^&hchoi|BfpZa_>-XW??ZCOjV{$lU+upcOCk6o5!T`>} zwmr(VU|_tBH2LpSnqvcW(ZRG`RYpe&D)Ui!jxIYq+JC19`OlZ<3P|6CxAv7HF2Q!E z1@F7cxN4KA+{3N=Z03;eIVtLKJQz3hY=V+C7PktIFr7`AI+J}&Og5YwIGb8;F%6rQ zd&>L;1h|nf+EdkSn(AhrCA2~tYRNR346T|Jn8ey8w2pWmv?laf_kg!W;9O!jTf5Ax ztr4wSq!7_6d_=Swx)WM;I0}^!-i4;^j@F%y*08XU;{qIokrH+#v@WC#%z6pI4YaC8 zI^vvqs%Zyo>5cL-2#q=~b%sG`&iS?^$KDBaf`O;r;aC)69z?J3_xuZnxv1R`uJg+R z$sTmv#&|u4Q}Q9;TrLXDOt`%mIMrC1f>Vpbz_~ml!fV_%`_|AKy1>v&R)%&Rc0qB5 zc80l*Ss8rGpFEw+WmgP_SY94dTHnL`Ly5p);NA<3Ra9bepcE*KjQdE z+CjZtdJ`2^h-{EvC~5i}tFw9iT0KtTDtqFh?EbWVK3xs9v&c#m`xKON|!(4k!d?&Y1* zca$8L4+>FmbI1ypOkTD_gY9WtPQ12TW%hDqZg(ew~a3Igzjvdlm>OlE{=kL00aS5a3hoZCdW-D=I`E2vNH@gKD1%P7bZm zIA8&si7CI0kSEFxf(4{?%e{^?DiX4{92Pju%Ro5-rQ9PyBJGH((R7>9>SVVaXw>(W zzx~iFH={17pWzk7srcDFlmKIB-y~RK(jV_up8aw+XrgAjI0_I8mL(A@vwS+Dv*0~dx$+$6!)<_TDxDP2=8HHF0tGB(_OHn0C z#8Ivxt+zI0tTM?BWW>EuR4Nc!ABDBb1wzZCm{!SFha{l8YFa8{V*{loQ|n~$q^3zx zrgrUYGz!bB5bwzVn=HzTEBA|(q}EQ3S>dM(bLUVC8m$motTmI=G#V1mDzP@ib4slG z@r;t)WUt(GA-8?yULnXZws7r!4sGESOZ1@uRdyfXpoGN+#&Yn-3li;?3x@tgV12T2 zy&CbZ8a9mxC<;sqI}L>U_rkZ~CL!73(AsW8Q?d(^aiJ+79&0sX6wP~;4x(8bHRupL zUB*}w*6$HrJ6uBVbP2sbD#NkxIw|{nqtpdS4@hhy*@(sY7hkmH}#Lxw@2&ib)NondKbw8YFx>pBJ}$u8R*b+Sy1bZaUOItO+# z)a^4#Ci)xilO-0Gmc|o5E-IfDvRF#H7a`*;Mz&`pnnQ(`fcx(%!R5Sk*1@DN4<$W$ zang^6gMK8JrU~Ff7$Y7Tu3*X3z6@8eWNJUqnTQ2C3noCcM$cvf43Y`ZPbR=ZG68y< znE<)YvBR9t(T)=Dy&LzVdI;`+sp$takTWPxqD z^z2=E;kJIeH{a=IdC{8F>1h(xCZiWb`_V|HLLxwo4@52_Zozt_Xa|ec|vGE*}Y)M7@s?W!6pC2CAfS5 zU=Dar-!`1D<^eE5jYFMKiyMXvad<++Ltv{NNnvbHr&{ey$5|z|f?BLL-5W593Ubg| zC)JbEu?Kbduo29>RUcA$Lm(BE*3qH07ZM$9t!VkBP*AxMPKOIdCe>%DPz>HH%W^Jd z;uOdzAW`6&C{W{q2!UP;ga?CL2F+%t$y6FI6f4v-Fft~Taj>CjGSmp$Y-Ok{sD{Y7 z(Wus8Q#_4!LA0zn&PueHq^>d~Kwk=55<&!N_KMBk`~6Pvmy|vy_>paRlTL*Q{RRXX z4^wL+8ymd$EuLOIX`{fBihJY(g?vxU#q6hU_0Q{jGhx1?zBdErmUJJ6T_DFS4ro+E zVcluO6&x1s_3w>ES}ulVw9@IAnL*%E2@I;}C9rBl!%9esI#UzgNT@yr1AdD#m!OyV znjBbz-y?1^y3OiP&0>XV9AfiU2`iE*i!fvHL0KFp==~t>SqqqHPW1SULhI!5zj^d! z55N9%Kliq)EIf_57C9xC_{7|n_L|(JF~*$3hBhsyY?KonyErUM1-e^&poQifj?u9; zJ%yDT@4eK%z%x0^G2QG^#m%RCx>QR;rn{8o z8q_LHn-i~%tg2(yy+3>2pLw%CG5z@#J7!~lwpmB4<1YgVPjx0c{UL_+By}eBp6W?q zq*x(i-m30<2Ym>Vv(X*us_J%IZ6LBxH`|Y{PLFXF_H4D>;nrv@kJyIJk1^Qg+~T16 zxnEYEmyTZNWDv>W_uBbXnk)U-G-UUGo)eaY}e1qL*b{0k@E?Ly^2p z7K9#1P>5Sbi}#bDis+{~Y_dtFni3%#kyHvB=Z5JAt*U8Bf-za6GDokGrGyGm)FM1% ziySc9TVXa$>jsULG-uJ*)bT-yY$b4+XoZT+x*{Bn(QHaK_JYmVN=1tWDerLWdJ!pI zI;ie00;v-Eozs)v)Vt!2BzeVt-an@G9>|Kj3hTx>@jK0wJZ#Z($iqImL@GIaZ*?90 zyxD%#W@lW`4Jv-_0rlo4Lk8Kn?)cLtQ2jBc9M&q@rmTb`6mv}(Ql3L)# zi6Lo;#lh%xdN&(HntD$=Ux+j{N+hL4Gd;wgrinDQL_5uV= z$BWRngKV%!`cKM+RTloQ>~lI=zb9L^JvYx*>oTl6GWl#K5j81^#9_@S^x`EatF^A? z;XK+c6n|nUQ>eeNTSK$XOU5z?)?2=k4ggOSFOR)jj*ML;GUqovg685iV`MatMZs<5I89cSy;L~kwx z{vYn%J=&7%uJ5d>bIyI7$GxW?>b|#Ms&l$qx@}9S!9r4ELvD4fS8T6{EG@==%*ym1 z{zI!JGP0LoJhN=;PTV#PF>=S4AeQZ+6AV&73Yr)~2aH$a2+|l~ni!a#j3G^UjE5L# zz$A*}#Pj+7etYk#I``gI%Lp)$*6pg=XVND)Zy)!dE^$4p_db-Ua+bJf+c_Doy{=3e&KinE0Wf2L-j3pE3k z-%BH0Wye*I!&c1OXN+HsC{h8i%5tYeF7p<(&##lDI9Z(PezIHKE1^8;1KvenY4i@# zC0@``mQNIhsAmg9RBI!>zJ33|d+VJq+vaKpg44cQ!O}uu6+vc5F)UdF*7$7WIc*9{ zkfN{`-LZAizKSv<)@BH#;f9eiLT6cnALkCs`xv?#r zOe`DTCtZfD<$8M6)dfemrgvysX3(N2Qr-<0#VHz2+$1({NHQ%k%;&V7oBI5XST{!r_;r!;vqR-;PD8e)W87a1!1VCVu z5B%ZU21t;_rbQRBYyzgB63l}Vx0t$R*sfAk0!fP_?NU^NMZ+gk1i%}dJK1ij1nfIT zlg0GUtn)!6dnt6@r_{xseL;2kf(DvQIIqhWL(|I7x5uDdwfw8a0!F+Dsmnhs`nTJsjhTDN(l~ii402= zkAFz&)jocb*WfKS_ZAiHlRi*o(~yw z=o?zmC!~A8-p=dF@B#JH#2{V?suS`t!Cq<+d@X{}rUdv))jKm&Y#7z4HfD+qrO3L? z?gv-n;Q3@~WGu{u`2Uk3I`5~kxp@3;f7Gcgdi?u653&2AKW_9SieH;^CQPS#ckk3% zhW*d&xBD%^wfYBsOZvU){eHVlP(i0U$0j15lfD4>zv9Bsgj>ihL)L^nSzwoIs=QF) z1aks2zBGdx=H0E?7s>tl2kJUIp)d#PJkuV%AYMa~DuD~s6}X<3rOT{g!)Z^`5l5hj`hd{&Ui zQTx?Yqd|$+rjc*(^v_wLh{g;3lN4e!Nu%d3(#{Ui&W`k@nre2y zdlDFTNcKe#?r4HUs7K(=ngF0rLdOsyO@ zxl3RDpMhFm!igkHCL z@trmHai|PWTfmQ5)i4ZzpRjnxGjQTU;sBEP0}BbXE&B9$8WF!nt%{5`j8E&eZ)tx8)y4t)|~-ZC}t>Y?m8azHvr$oflPzj`yY9R13Ko;fb+wt6q;7 zg;tWiFVagQ@+ANr2)`0I^@r&mrMiv?@7PSMt5c((Yu;k)Opnai{h$_ z*8s?IVc9w=tk5KDuJ{-9_O{ENag^dMbcmZMZt4(FsW>}8RDK!BcAN6)f>(V*RetIDWFDotB>OyUa0;zm<$$N^eG}!P1>V1>k2k$Q2|9igJ`6B!{GSk<5)#X z?}HYl&CN1nV2?0FTapzaI@jVuhZAQ8jaWRv88x4 z6_Ra~kQWg1(Cy6)RxSJ%3w=RqRbZi}aRnACWh`p^Ywn*)iaq^jtf~J&*GCCy6`34p z@Jiw@l$~4OgTsAESAh58f{`nFmPoazHtfg@=ScoUP^ekC#wAaSv-3LK{wpKvnv@$9 zemK$dkwnNx69wP24e8QVpJV=o=p*S$yQq5(Hj260SR0*B10|20M}B{`4o8DIZ4#io zIr4ooD_fG&Ey@N`xZ&AA92Fou*CLJx{4bzApB6U)0i``ZYPY65f2)_uWV=rS{KW+% zxNKV1-ODM=@kW?q33Hsl9J5gu(}xI#*wxU{Llo${Ne@9%TR~Dk_Jx9^Ca;Eqwz6@$ zmhz7#A^)vO#@}ZmK8SX+yK*>z{DncnXOpf3xOpT@P|FD+$bvU!r^6N|7@3i|!|g3@ z-8jKSbYT@+70?A_oV^6=&qxuItQnvO_qwAvr@%r>2S88+t^zu1PW?50!TOH8jT*8L zlT~g;v*zu94k=(+^NvhEBQfEW60%wZMaV95F?Ar@1xtkW2F)wXikZBy8FU2c{T5~o z$2N@^nVzP?tl`2nfPgi@v1O7!7U@&SeL5ukvifQAF#2HdnhZXGFS*<)Vl)dn>9T}M z`+zy-N(0uk)JF9V+~;9sZaJ%-{3VDk&SQ z^FU4*r=j6v^+kr-6FvUHu*PuS`k|%ig$8gM{ws*spdeS()Ma+hmJ{X_62s<}LCo#t z;CiWl$>%$}oZuTj7!xTy>IH=GEnhpB)7k+E(jLRD$dM4N9b^c23Ru5q?I0I6g|!2O zzt#@seCoa|^{ zpe@MZXRJq}FgLgR8E{+Xm(?0SCG_F`xJe2909@l6DmC`dbZA&zGnpw(4BbktRZ0`z zHwl9%IqqMx?~I?;Cxu<&AW!F0GERS!=^)bJSu)U+U0_ya_{gMUp5;|}jv^^X=eeSd zR3GQs=lVge0{n-$GL15uCZi6GE0?WwK8;uHa9djo`VHkzN3ZEOZev`CzlRpZ33gFv zDse8OVmpw6Wn!uNe+J#~Az%XVXX|(@uf>@+eL1 z5Geda`s8${fK8*9%qBEflEu@*JvEptC9fL0H@`o5g#S!6Y$PVBKk^vHsVm8DNu8Ya@Ums2^pB3;H1ryzv>(LtGrDj8!V6$&1(SQUuvf1E}MP^Zsf|!xqyvwmAW1f?GkPR$~ZW9 ztjo^Q@~LX-ulPI5Hq{9^FY(1IMIjcmLtuq=ynBA^m$Z>D(4le%o*d2vOQ+V19n;Wh zI%N#zg!LSwF|GE_YlO?q&VjHXN|WqhS|U5J#K`W0LI7b=O?C;Za>vhQT2;@%DVA9~ zPJbVJ;@3kon4u3~nHgfjF5ci1;MVv@oRzN?AM8v}xYZbezJ`C+YyaG8O(Po}wmWG& z(?gtrR<1@GSuPKit8AK}S3vN9Ah@qVBd5LDbM|2XJN|L$WqgPd#-bUr&!6i+oq3yd z4$^d!bQo1+h=Ow(mD9{>c_2k_F`kdwD)nljnsT4IcCdaP@og2&bB!I|DGCXcCKItS zpD!`-*D>3Os;`FGW|nQXU9 zg#}*sERMfjnkk6HOk^M#Sh|5myVYE6Vi6kGncP-xopD%D5N)y1_3pRP9Q+SQV{9|N zfBcjy8Rl%4et~Q>vyUI1aVpUfIfM7ku(3PD~{saeQG5r$|JOC$+vIwlo*Ul-SOa3;KikFa|HAl^~vgMG!4bO}}A zbd!x-QlR_nq>r+M(;)_d$Z}&s%{yaW!=ZhGSI;~}G?hh2cyt6Hvl%RK0+ju41d|GR z{bieA`(VJx8j;bW52+FuVQJKh3eA9A1y3p1xlwmThD%4mEA~m$A4X;IF&YHMPe+3b zW5DK_^W+L?4DiD^ikSguT3v^ShHY4j|3v!n%gjo<15f;MM z=r4V(4S-1Jfu}`AV8y1&8#8Ma(?XcWRD8~?4+mW;6!rU@G{7q+;DwEO5HCOt&uTsd z7kF9xVDKk@4!bTs_W2L}^HzNR8oeBA$_)j4Ug;^0&cDLDE)d=;ViLl`Ep}Z*1zz$n z*SNEZaJw|jpWTKbVNMwIb#B7|9h(}wEx$+AoF2XOwv1m}=xAF;+HP|-OMWh+Eu_Kq z%l0P<$@c4z!BD(Q{-Md=nwI34#R(wr_yPx_L7CE=8*qpfm<8Lb8W0DI`G8d!W;Rz zg*bo+wCSOnl81cbfglbQt=STXz#vHz-s{>I2>OijM8Fgr=z9={s4??N9O@^<|8haT z$(_mFP;oioz-sey%)2ZM702@AwFDu7q88<<-lIn%2;WykLCC?WNf3JP1p>DP2x1SC z+`FzJw>ysH*A&s6rXa-fuLWV~YUrc&wKEuf!}~o;g&(l0oO(gTZpIF!u5)$FbsK03}7vC3Q!4U zMo?>!pdhZh?qo-Y5tDD_xL#r!e4rsr>djts!8N)1_>Snj6k8PNb$kcvKrZz@gPm%I zC34d<^bmLa*zYJbabFP60zKM2uw)`dJ2FXX20YfPB$_`TTHz?tunP-C!M;rJgsEeu zRb@)fPAo;RsN;xT;mzx|R7c6mO4GC}$;L(6TO~ zP%p)Pc(+QKDl6V8Q9l)echzP>l@j+G!~48z#_I!lx*i$%+BmFTeYsQ2*Fo}UvEp*C zQs!kAmks1FDt*O(gH9Y-={&>(=yGz$X)6uNB@`mi+J;oG$V4?%KCB{BW1s=?O}Mm4 zNA7f;k1hoc197*z6!w6HIc!~0U?b-fm*M$VDQsS{lCk+I>Ta8j72Oalz%9@_t;4w; zW7ESUN9WWAO<@L&LgOJghLj8%=A*RW_#OAPV4po z+hAZu1^k)O)F05i<>jJS>_Q!T4>Jv)C}QkAc-(BfEOZEuFc8y)=F`vmp)5k|{n>_X z7hB{kl~_7prSk*xg^tz<8zrtF?Rx3I+3qpgwf>_*7(_KA+YeWU}D=!bkM34D5nOpaf%y2F;D}OU|7_oNNT&f z47*TOYbTh;5AdVxNFP(sr|mS8Fs4)_JwdgStqcuwIFssYtjkZ~~ z{vR)US_8V>TY^aA5Z2h~M%V6|7Bg;VUgL{*6n8=8s*w7Q%C5d2r&qz@%+I$YnzOmCwD}I%>zEwHuqj>n?0pA$;X-EP|I4ch#>Ker%a?2WB>mzd6=rf2+pqGSmgEM4+llKzyu;&JU;h6&>fuB&5UTK3g4mRD0 z<%Ts>fQzZ1GLEAXw}@!n5q|n+DW;??{HV@}mELVR7aXlSy0DW9wAO$ET1#Xll;-OW zjRs0nck32W+0_DPS|u5H=UjPEC;c>8nhKaT&wrw1G|9l4D!#r%wnQZQ0pP z+~2!UM+nJa>^AXLlVvjAR5yW_XMLH;HL>n^A@&^gHiU>!Mc5KmyI92JMD5Rt?sCzS znlwF;SrrmWXE>gSg(YASJqq0eEZ@VPALJtv7&U)}%k$e>@#bkh!=I(&h+5vvI~RBd zEQ0?~(+7e_7E!S74O-s=v!=>}V4fOg|ERrN%7FB*#FW(hybf0D2Vu2@d0IZl8);51 zF>7-u1SJEX>RR!7YZM*>>+@AX3Lo+ho}4HmD@eq7M|s2i2S9mIKR*SWk7G*SV>oXb zk%r5DQ{>NkoeAl~Z*k?;*Ous+$-an0Ja;{*unBvF7Xyndk(WV7170Yj^3|G4^2E&l z1t0@m`0ouF8WUbz--OFwBKOLs2~Vqt7C8}T_FD7WoWv;Vj!L^NJbpr0;`^tC6=<#z zC1%sRBx#pO*SI+->*)+2-6QbVvPrq{m{N>pjiV1ey-N(JiE?huS+aB?swGiZHXV)a z?;z^ZcN(IubWvv~FM&Z#Q5QK=20)w4%bpu3&2tcSa3eaVOcBteUg4f&A8To+%p)pu zX_pK?NjqHOye>zh@9m8gMs@9{M&*;SVt|r=%@M+cUMbYKUy{&+<^WAxnlia3&^XX^ zQJ7ic0Bz4^2MV8+86TW47Hhi#i@(>D3G~^Ro%AhP$;f>R9fiv_LPl**F)opkC7C&2 z(NtcBCyJ>K!L62U-+m0pM8)gl^s4r}>^u#%Y`@kW*&O!v7l)%gOUt`<-!R^}W8O16 z%=MJmK{*`oG))u{MC9az{6=(VO|e08SJHhGdpL*WJ(7?%jZXO*_EtNndNV8Z)uC@w z{=MR@avb4?J6i4Jmz$Kgf%GA()h?cnDiZ|0Ii)Jb*+iBq79z@+nH}-J?U*68HE4m6sJj$7~d5-M1CsJz6sO zmTJnvJ3~_(-KYT5h3bjIQ%5MmlL?jDi5L@}u^9s2Vo1Bg6H$x@6-iwIn1OalsM9Brn_UeAS++%00eoiUi_=jP1_MLl5(}L%c8&u;Pq8Ea6`GbS zf6~w7fYH2ktMf$38NXChDa($|x#t%?M90AQZuPvOBnz_sgS7?XqEURjuyk(Roi9Aq zPShe|f*pH?zeWyc&v3l7JyaSG#y0x<1OU(G+_6EP3C4zR9hgbEWBJ%jqd1SE2eYM9 zkjtV%3MLZF$2CX>6#P~;)|7LnTfHD9PM}60OFyiB#R@zW!3wn6!A96rL&GU4HH*jGRYGB zl#3H4kn!Co?kgC?2_?q_j*oKmhA5Mk?jEhdMFzur2jx;rCLyi97JfSz-Xm#+OnMb8 zXfV868T^n*eVRljvA6Wz(Hash$Rygnf4{zfOd5@Dg@+A>e^XlqkV)sEj9d9vQfUgO z9}G{xuAAfJFK__sTAgHbfe~KxUR;KN{z-4o)VmkQ7-j|(4zPg22=l8 zxm)vRPqVuU0eBR-GZ=mYU~#mAxekV}qe(5moRO7)KjKMUAuXb;yX7)b$y{lTv2J6~ zvi`2$`}BNSOJTMSWs+?=TFbJjqz01C;u+wXbOooDXdirMM>X>!%(p#&5P&|Z(dnu+ zH2YmlA$ThIEmN?I*thl(>UBNn=ksJvqFzN*N0df9!3wPlxrjjdJLOaDBCBigOtqH4 zCy18deNWVcIDA%GWwaO>;1&Q-ib@oMDO;#G{6bkyZmMnus()P*6(GYJTIi(>V%-L~ zSdM+&5O7VGgiM4nES5_G(>kILtv9I#Am1pVC`yoyM*FNyzgC^wm_mqU9gJXRhUJ6>kUD@O(mO=3S1znkq=W{Jh9j(YqIDCydMNcN23md(U#pt%-*NF4M z8a^J-rP0PtwBH;yy_?s+RPYYnA#1X$a}@7RPwcfQZ%9wi z@w6vBq584i!QaD_c;f_HM6{1$9C;#6wieHz+6!O?Qy{FBLJ0UUfBV8TtK7aCI00ZZ z{{Cy3I7xA1bMoX!lrpKXW{v`xRQss@Dr{BLs(k94f}QhR0ar|5YA;FpS%`nqC;2fh zH2x^YBphi{O=<6#Vj2t`97a%NzzV~3f6*{>`A(uxyV_y$cDkUb!t@P1v&Q=nJb)TH ztqZ;FgfI!Yy%>3vLOC3EUE5_qZj*rEyCf=7L*7@8OmZ z(c_j7tH5gJFc7&Vgygs-4syXQp_;fQbipkle8erG!DDIZf?MKe2lLusJLXTp2x()% zRa_KdlWnmshe5+ZQB)hI=xn{|c0(-Fs-zva#5$D-RsIRHR4DujudD?)xEtJxP>n6X zp;07hEP4nnP*{`la&GJGwfYUGjkXX8 zWZb4Lt@a*Vc~=O|5y1oryBke28T`QV7~wbK)hMbW>COX|h7ehAdjt2_{vwW05|ty; z2-o!4SuJ-*aH|b?@x`2UXmJ-B`=SC+JL%Xj`xvZHb7&qQI%o+i=^da9ox=BkII^~J zv>0f;I{z|EcOw<+nh~;UpcE+qb0Gmq3$*9aNU_M^Q-ejdfZ?u`FC_usGMzd`o+@_w z!6h5K0T0nD=D+5?zprv&g&=yVAit`LM*Zt##-J@L*S z=VW@qKHFPA(S${QfltSPtN5Pn4v0DtT>s9_ivcOTx1LXVAH)}W4=^-C;R!hG=gFK_ zJAhsH0id=+&FDh676t}WJEKZ_g(thHwL{KQ+qbx@Ug0?qy*RtnwF_84NEEEVITg6q%w`~_qw1iQHK_GPa5v&pXfvjO z1wGE&^5qVZ=Ge$dlxS=KDaK7~$tVbCzfw$XKcCh2mgGOHcMj@J-WRlNWJ3G%9th^8 z9wNsq*hW5%Fe67;oFc2i+mVminI+AQeEi@W`7(FO724q&-3c-8_WzLQF+IWsq5yLL z9kl*R$nXzNUr&pm=kT3ea?=|aytBw96EHcbliL&^`LAAV4cWrLsY z<@0e^SL)34rTiZBAx$dmz$P_QhrCm?r=G^V^@J{pt8^K1a;dZT#@VwR?a8O^r3M_N zj&jvYFR``8j`FBSm%8pk2Uw%i0L-PX1v&Z$23tePr7mw3&U*K#Yr*k#l7)yPE4GFZ zNUR^;uG92%bKLo++M>_Wue>jMrupbyx8Lb*?02jtE=$S;In@#RvrcudomA31xKg-E z`=bMf{ERy$h{xS+?^u6R@_GOm;y-n`t#ghOD z7{VL*ov!jP_-^j?c0VnwCz4Xs06{QYJ`=U3Mff1RL`uTJh6658XGfeU5YI0y6ywJ` zF~D=9-l|E{Xa?i=3(EznlW0<09vYuj$)qdzhd_@MA6RH=kZ&nmo4AwT^WEt3v74*i z(q$X|+j2UQirS2ZMH6;7nf7DoWXg{r5{q>#ei`cpbNl0es4l1t@5FH}Rf4G;OT6iD z3W@av2l}F4H2c6MJm^A3S9paKD^T0d4Yk3G8b|RZfWeE?rRFode!0=kNu0=1#Zc%%Ia?rdYG|VZGfegHew#O;!nitVLxh-NXiIS6wBJx9*Me|EZ0a;Fp zlBpu=QpNlW)19j6O;1UrAwjJ+r=+tMlQdwI_OPf#8-S~{SFE9vdYze8Q435K7B+|i zLd=b@z)VyEAFv&(_5c&G-KzFr4AH))FC41p6lzTA6rm7BqSJ{vn)7`Y&`mW7wZPyH2IAV~GsHa%3=0m83L4b}chN5$VJ!L5j zc)k&>SdsLSck_>TmPdxq(<41fJATo#$U@RpFz^U6W4$G__$~DK+rS|9`qTb z%~Q+m8UEnr8J1Qs1?z)!X}4d*_6aHm-T3IXShr0Rn+5Sb1a*2d#&;blB@CjVLKm>qS;w8HSi^Ll^ta z)Dr5*P}MT}h`%NNmid!XyMw=-{O#gT$CKZ{pN_5G%ijurtNiWbZ$Ezr_&dnoA^vXU zujFsS-;}?@{2k%%D1SHcSMYZ;V%d=M1l~dL7h8NkThuOy$yt}no1wDKqqfyw7KPX5 zMrKF`YZEJV%5%@Hm4VHX8e=^sq_{fNE1A@!oB4Ro-+Zx77gX5!d#psh^AVEka{RS_ z8;5FE{ku$O7O=vQRX5t*+*{%Cb8qAMZ|M20Y`f?FH|lDKW~zN-sJ2M8U$3hjoT>H= zp<176gu%p*9+;{2x=>AC)&HliwtuGDYeTgm)&6Z=ZQo3_zaFZMsP=!?)mCS!{k2ey zlNF@j$G)x1RJ$uwBWY;$f7R9Y&Q!ZIRMQDKzgAbbr_I07!4OIK(y4sGJYF`_w?V%cW zQ|#M#rrPmPZ7Q|-1;jk6J}PuJC!W~zNnsJ2SAU#zQ*W~$v9s_A?bR_bHl zhBMV}3Dx#f?HB55gPCft4%H4&?NfEN{!F!3g=z<>_VabM#hGfyLbXFwV?So>+rmt> zwNULws{QM_+Wbtln?tpdYCl(3o13Y2Q>Zqf+RxV2?97sBP4!1ZwJFt}ud8)uT00V| z9j4m9s;hNosvQp1j!^BBb+uxq+B8%rZjbuyZ*hCXZ*`#FVZZ$y zZl`|xyWCFv_W$L!^xMyId!yg}f7~AO+u!5%px^!nZV&ja&gI+hx4+NrKEM3~Zdd*G z54m0OTb3`&y?*;g-0tz)Kj!uZzm>HnlFU`Fff z2*&?eR{;D)U4ia@(G}2sNmt*+(s=7x<%KG2%gT4f+Gt1Xy)k8+2`o zT3yj8=%l#rtn6ms{&{C#8fPq>&Ec7c27IRaqBh<&W?0fzt z(`Me9I5z5=+kziN7i2+tiKPbKn%dT62~vIlNpH{erLKw=I%z98eXG|bS88P zCqc(ONBXoj&RnwozA!ft1^{1Ge39+>^@y%6P63rlmHL4`MjMcjni7_TP5RX@BH zSG6~k{u$h?O?+G57x_uC?*FTk3+|NSZbJCX3#w@mWond*54VW!>-( z)NtuSnpVcYEoOuR;gmBSS%&d$9Pd=H5W59(*rx?MwG#5d``2HvNe8CqI)8^f_}SPB zCY{6{SfgPBjVH|ZIi(islnS(+gT!|0hs%_)7-nDiiqSR>7aIqjuUskZXL1R^sb(?|*8vbZEB z?hd86(ONG&FAjy(O&p*aXM&I@#wwUEn@HG&Z@vlqB0`m@J-qhj-)X|kU@oLH)*sz{ zGh61f@fWnNBUur!$39iP|5-}$OR6K`bJzOHR^AzStasb{sh((1O<{$bNV~^0&(nnm zIU^t@T5n?;p1(A;o9VNd*$E0p@FAzufOdd)EN5g5o*7&!7vA|7jZ4maoIf;iDccg4 zKs7e|)VMTPx^vQS$<|L_HZD0En8Bs%#w2DF;KJK9tB65_BShlzMQZ|~IMniI3MFtZ z*EHcYWO#9^dTvws1)?M_8fP+puC`lch+w-U^(sr^6PoTu0&bA{mI{^D;h6#!Iq@AD zX3nZnAdBeIH%&m3f2J<*36Wt`m=RYCr;Z>3HgufDjBK5KPO^661?ndS`OKx})2uRm z?wY@De7f=O*_ED$<26F^F4Twg7VDB6rb0+RyS9pb##C%u?g6q-T2fCj7qX|D2F4=I zoYs#y;ejJas6t#1|9%+Q{B}fdeX#j|$cLc7Tz{di%JW%7DvBK|iKzje>F60XZ~b9i z2QNQ;U=LcQunaclPUF|4^Oo7e3SDAH17yVzHDG1%Fs8e11*kE&rt+i_vL!3$cbN8NU$1xC0s>M*!DdUJtMO?+5WZ!4i=cto$3>4{18ZXll?}>M)5jC;(d&=%ZmB->o)$-e~_oF)3n)*+6nmw`1 zp;YD&1Us^N*5KJVjab@Q|LS$JVv1hMnWQ*L|fxsFtl6HA}@^@Q_u}ZG>aZ-5x&%8@xm#J-QnKN z@y~#T{2JNEi#bbd)ZHk?&uW~Eil;9*4b`@m;eo~p@Op`!y6V1BTS9MPi)}{oWz~E8nbd0=1HLvhNyg%7^#>(Q`(!$*f zz^uZs!%Q@)+sJ}VY9!1|%;Og%HOH{X#wDt+(Ro zG=@qpCo$B1_2vAn&Q3dljmA`dSXK8r<4l$G#T7LuzS62^j8ZXc%tUNb0VmFx`+>b$ zlg1Y9&SM~2;23`~$PZ!QjBo4AT=ijDX%&Pn3{47{f^@|qgEi8iSA-kW75{h4*xJ(t z*_~iV>PKOvUXAnpYPNa~FUtpIUD8iOS%dW{|F&fI?Mw)Z(ka#pAv85;tT{;qsJ?OO`*r>_4K;T@W zYun{Tl@qA5K(r!zCv-a)>G(3#`vv2WO1W#99k{SrnejD#iQh|*3h;vo|62^=VhJ=a>KeuQj ze4eNkjbHE8E|3|{Dv205t5*!1b>>Y&g@{k?@-gWGRxkr!X(-Z%4GRUl*jSu9!r&H9 z9RU;@*;Zb;>av9nT@h^zjv%&aNe*MjEJ{JR;j<L8(Z zH!MgfbR)V7)D65q))5?z;ehN8JNa{-8cXxpcso@_-U%t|Jpm-e4sq zC<%lS2Zg)KK7^UM-VfR=Fw{?o4xyTGpz7}|Fr=c+sjndH+~GodS5UaX2t$R;U1KM! zxQb^#*RB|^ijowVS}uNfQUSd9Q}}W0Y1_(nV{yHy+1N|B5zxncb?Ye}(Y_Pqx+1v@ zkF6i;cXmz|>;8Wj*OnfZFi7=TW0#jjec$W=WNhm|KK$GU(bheR&};)p9g81x0G-I6 zLfB!}oyeX-j?UuXEROQB#ZZoa&g9}Y9g3e4`(EqV(Tlq=_E0mriB@h<0 zlmXA$=U?)eyT$|lu1{fikjSy(^+It6=q$uuUI+by38i`>Fx2GUQ+`$|$J;W5Iaw?v zneeqjoWMgzCC`Jr4%3WL?o2Ae1hMqQGTGygB{{2}m zD&j_7Cy7MN?~8e9E`$qQs|(nu-P&<*F_$H}R$SoBUeQbZKL{IEVB|m$bH@a0Y9aJl zS_sO&uS;1!8d`|DC2%OtmyA4Gg6eCouqx=d@#kNo1DV{)rNh| zcR&roQUb9VPMiZLWSujJE%5nI&;+1~kg!m$Rnx2(2Ssljbqi)Y z*zy5_tXY$vgvL5CLo%{F*WL#BQTzg@zOx@kdvfZ0$U~kiA9Amx4IM9qKu4{6mMuQy zgIZQPsFxVJQ3zw$41wozJ}vSJ5;#IR*wu0$TDm2SdZMM=AB6#^bc=Co3|fY5jbY<- z+8gtHZayf!ILH5n=*a~I3>`CoFp6x`0cHC-;-)RS686AgwUIVbdtd}qdIF-Dn}ln` z23#gma~9i&#kD#r`I`J{J~U3)rWr4wkSzyZ7LV~ z1lH7?09aFuYq#HLSyKxQoi)+WIZcB1CI&UBYtf_?EzH7deM~KF@iFX=Wqn6G zoAhCSPotsWTD^N+qj!W{9xF_Yh3X8??*VS}r2gqjI50V>6l10z5fc;t>y*79!P$kb2bj>dz8M4~{* zAo!M}q40?BeLA0;gA&a5Pr*FGA-cx=Z132H(;A2fvFfx`lItX-crKs9PF2X_J?che ztVY;o@?{VTne%WS&5%-Gq}0bTS;*JSrfl_v>vQ=;r`oR-KbAvqjvE+)@tgVuB;;^Q z6eowBiq7TJfmr)|=mB3fLpQN=mZZw}ij_S((OOash(-LMFOT%ucQ%GA(n@0&YIKWI zb}8y2CFusEu`{bnr{wW5#%NY;+4TJBe}*nurSQLhoY%?a$I0hF{KON{NwpwDQNXdm za*f=qSWkl2f0Bm)oRQ!)B;@Bb#q7sY8w+;Kk0V@9LfAD3$o+`9R}dHy7o6r*kNJPH z4eH?x6>=RHp=#=*F^e&-(G9--^~H)>;0koN={eAi$z#jT;7^J?mxXy>%{t*LqMcs2MLrcKp#(@6PbQ!~M7QhL{tSu7jE=Vpu5^%=bTjl2dr zzOGK3euqNq5Q(yc`G`*^9Z6$Io8{H55|yf02VQXItqr}73_Uiox#LWYsqU%q#|&#w zQA>GWbKu!IRvhu%!^Q$T4KE8YM!;c$z*xcb=1;S9_A~eQ{G`8b?U^_`pO8zP{mc2k zWD}tBFrWhV-Vhz}-j%YmG?#S?&JrX3n-EEYModa)RX?Ul@KU_TxMixH?NSWN9;N$I zDG!A|Tr)CKH1Jy76bM;1F+XPxekubW=z}=V^2FI}S$M1z)+AT+4W3y!o zNhtc%&wc zevq)3@3foW3Y6OqI1DBn(yHX0Mz7$#*wt1z1dF&eI}R`GunK$+tM#1<|Ful!&b=D^ zt=ZSgMifPokvQ-LNbDO#u?|LYpBDluw)u~sM$CQ(o#(`Ff9l6S^X^Z7_9p@d>Vd=r z$?G+-LuW&mU}s_l5S??o=+~I}pd#|?4>pvniyX9_J{k3TQ?ux+KDNe-7A>P~P&_?a z_G(6n!5Qh_mtYxY8F2@A)66!v04?X|VKRy<-62LU&N&oQuH)*G&;)nenkW;9s%bSIIGWE0kaR?U@jZ$PxgOg~hbn0X{jSWC|E8=#D{{9AwUp(tm3mLKIEv0kf{X80lV z0%`X78DbcJdsMg|nSi%z#X~Z#l$4S&sQGx90uLBZ_JiD3{jxqn0n3FG!sHtTa5%#h zfk3NlQBV_>tUYq9euL9JfKLv**bw=U5O@Ni2I2{8`mds7 z16V#LY>PQzSyB>)zYaOl<1JTVg>9bI#QwGF(l1au#`#8|!}&=Ia5~cFC3M2WJ{8Cl zA)jG1w`uoKV(9h@=-476W9)z*9{i`#of%gP@8N+2nKleB}R}CH237L*JT-Yh9x7aoi0kAWisxt zW0sObcVu_b0UfkynXYJL(tGL0_~)I$jNe_0Ni?ueg(s~9o|!#_IZO9z=EXD3*0wp%w3X+7;8#CGb zAl7?BXKvW<$Wb%kO-(oREKVZhjx0A$YUIcE9Hu=?da&SqT0vgensh4D?@-^G0ZtDE zU2w_{RzhEDMH^NJcOXl9F}qWZ1|ONQ5yx^92O?^6|TShnJ3y% z*6Cz<)6BDwz5LCio5-&?{|@p6j@~@FxjGk*k~8ubf{N*$4=9g*O-A}pNV7&HoY(aN zYMqZh?VFr_uD+vS~ zk$rHjcaA?2c&v&vuN?kjMbe?@Y^bbX#y_B{YTJx@+lIg`3-=YOoeXjL1v;I?U{Icr)ltz;cs!PAxeDlRtpD(rA zdG6PmH7~ZFW_NU6GS&4+N_FyNtM+VL9D06Mi4Fl3M<#G5;Tcaa~t;Hws__ub4YZCUV+sSCLKHeXHf@*gN8Hou zZrv{#Rq@dq^lFyjCo=VPXBl+Uc@?4tVU+4_m#4$!Zg)yXdxI;9l-aRq@=svaKuHR> zl8eikC4-GCvEq_)?3yAUloK#Bo|S9X%C-F_n{*dGQ^KdjKhn;6+ILPGNxukQ%BYg? zk~qaC!|VIaW3#23ezW0KtkbN2eJf)asJPzLsOK=*6nRTklc3ugg#YA6z_qQH4>tGf z8hrxf*Q3kjW$ryfZjV1?{Eu@*X3%)k^DObqJV&Vn>o;@-ZFKx5sO;Vidq&k&Lj*E~@Ar=$HxRF%PaIU})pmv-~u_A)kTrN=Cquu+u8+oKvZ`4|l4kwPYPa<`T)L z-Bm6EzawC8>Me#AXOpy$XKE)#=f*T6z`?dQAkAfGr45izV_t5XoS2uJZJ0JhdFWdF z3I{*KZW;L65N$mbUhDMD&^6+**x_ki!mDPhKYU!P2PyrxPE^L)2blH?*kK>z!4|O< zJe2^xfsa886!KuOTTbDa#;i39*I{{w)vDim;v@g^D_yN>e(*14wMsIn*mkwbL{&>n z;pjA+ltVWNi(xQ1ba{Zu)ztCR%u@LN4)=o;?JndODoeo|2H!70IzNDy%o`rX@1}8EWwHao!uTm>u zdrlMt&nyg1uvliJXjGAoLY2L$A_p?6e`eSe_W>cD%y%GZFPQ}4#j%$8tr@G0A;f}q zY&}vRjNL#Lvc20R6PNBpbZ;1hs?TX{aSyu?JG?T- zD+{9~d&M-Cu=qFP6?ldZT27JB2ctXfd0crHfrm;qv$yO%MK$(Fti-QK3AuYjUeLft z=kTR-nBVbw;ee%pSUGs^(K57@Y&{lVsBl*Wu=ySJm49G??6+^TR5)$8NjcU!l4eA& zTR@`tgko}<@SlOVa}poG?${^R)pGBNpep2yLxE2yR$7GoI@c6%e8~T?&gCxXxprQQ z0M^l}ItT%@H$C2kD$;Obo0>_bM9p^*KgMB(bR*6MdH=*q>wn~93ZQc zFw56wi@?}on8jbqj+(LEW;NWyt~V*?$2yEm6$qCpDoc~>FPQF4f8331RZR7^E=F}> zW}+Rl8KRw)RfSD$gm=`07I24AS|?gl4&t*{&{qE!eClAkdUwc^Hb9jaUf(kQocoRx z$PZj$O%sBHZfrlygfE1 z3{uweM-vPtafJ;w39dFn4yJjVGOGu{m9-jmIP3^kj-=ThS$|{<@B_osWEs8*Rnmi+ zVt-f(!?8JLoC*UoJ=rEWe#$7yMq?b$TWT<{$gHcYp8^`m3v}j_&8I8B(tLXQ=bBGX zw)|OVnm)7f^X>r~|7^Ij)pG-n*l+wV-35fgo?0+$blIWpJQexFV4lZ(Q);jac}0i= z_BHnxDbuy&Py^6pMTk+X`~N_?`?r}xmQ#hO-ResmsAs6%txjWThFh~5?kJv7OIMz! zGo&oGHP}0fFX(zj(T(J0)#8=w5e|1gI?Sc72@?|7@{ZuzPj zhk3qzEM1+;N{SJ(p=cEJcwUkEoIz_lv?}(SWNA(qV3*C2XlJSc)V$sp@1w)+YGEoT zpu(efYxaeLlgwxzP=MEcu}yoe>b=dp?<0OW5Q=W$z(sDABS(jae~{}k*RxzXbh3IM zR~;gLhARS3IADj1Z*aYlXV7C(a-~xc)nuaCg6wUsVaQWisD}6?o;)0*U})H@Ais?#kqcGfJQKoz@1Jj6TEL4p+?kYwr2B& zQNLN%Q~ftl#umuD7D z^Rljzqs6j$FEim8%ND(?Q1ZuEW>=C<460oT3%3GUxebg0bnYFY77WTM`aCco!bUpR zv@(d?JJQL-JQ*xlbHeZ`U4^iQ*D)KYrWui4VlsOV&) z(P*x_L{{?!v_Ue5vDb@34Pi@jldL0ZmAwQ8O4upOP*C3OhhU#c=9|2ZioHVHCu~it z-i#NYt!N{lM$=lFBgG%ma-P`1P3~AV4zD@Wq@{wH@cXs?jX@ z7ladxj;(Xny_WzS{cUvzP0(In;Pu@v4R>DW7-x+J|EOTQ=&u7&8aOZmTbq>x!tN^v zLW7;bT>uZ07y;hX$+iyObebfSJC46gI0x7+c<;5{SkP->hBn8=+0S0NuG^%C?rnv8 zWutrZ-o4&mP2kSad+fls!UL3p2Gqf8!(zG|ULhn!GZ=EOOtbiF`wei3f0yI8Km3Sf`cF}iIZp;wtRi`lYlFPE&#>y6Vxr4ZY*F`Q;qwqa~qGx;ljc^ZTwx!2unb z(xNn=1B3DaM@rrTTYOt9a`g@zPhg2`CH%Isk~kk) zigs4+zk?JqnNHqbV`@8`^AdW7N_QK*dTl0M+IqkziG3c)#JGmGhn~`vs)sL-yJP6x z)8SLoel`9!SV_NH_%_t$p=FH0J8Jrw@pUQL(%P7Q*R#XCfxj9lLpLFZr|XLb6=iP$ z)@u#?ZV3LZ|4(f;fx*ha5~s4MchJRont# znFUS0^!y%g3_Mp9Kf1Y_$`u^K?=~H=(bynP(^i9q^|1w1iN4~b*%Z-Q!k z4bsQL;LA?%mXafYfF7&qtw8_)R+TJLOartC^ad&#FgSyqe#Xr&d;%Du4Ize~Ju!Z- zt6$HaSa|Pg<_KMfV?c*(GMRnyVUD%r%i<0>rW62oX)Yuhhx|cdyUT!@x60$-o1OF9+^DlTj_W17W5frW*e8FN7qDL6te-i`f_=OvDN&TB za~7>?0Qp3qaE~^2$Q$zD>I4_-S*o(5ZAcpYE2!odPpNTpQ-J zuyya4Z39#KSm!E-+S{~?ZK!ShKqK21KmY7$`9>^vni=4WRy;h-K{m3@@k`ko<8#&x zaKH_9MKM{0D+{m9zoeQpJ3eET_y|dL&Ev$))q+42t}hmxG$Rz!*B~blz%71pqdNf{ zM4kW@Kxv=QPU^^my-VZo44o;BGmXU3Kk+_TOm%yT%=u$`z9T-{Pyjt>?@OfgXoUw< zrYVro?AZJPDf8(7Acs_R;8fAKY0F(X0;7UGJw?hm8&a;Uhd-z%PRB`gAvD-jsQbgQ zE*lAM%bpH(`OIakc(Z=}i`)(ZyJzxl%dQp@L}G!BQVD_lYEi87K8(>)T`&O21moN; zu8y1<|04sHeiw5Q-iPt~?iikR0y~VsKyc#SaO&f}SzY4StO8Nw z^C3MIBXMsK0h4n6h^^q%*%@w8V|RsH)X;R;s^q$cUM|sJ_?!GNEMihXP5`ZDVvQ;l zJx6H|r59)}vFZRB`Y_WU6;e+!uliv26ye2Tb0wW~>=xY2${Web6BHzHtxe`Sx5mKv zk=c9L(NxFck|s}cD~?*+jT!c+DjpLS_-|W(s_RM*iShXq9~uZ;(jr`=j$=XflTxqF z$%fxs?r}8G_a|DJ8jwqR_o?YBLxM4RH|EW9_wNI;3YCX}f&nH~Xv{_qd#Fcl=J80@ zx_4*i35a^*f~}+N3X(^@T;t!Oz|)ZeDcLD_f{^eeue^d#x!IPoNHY?56v8v3Lx2saAB}C;BQ1uI5}LouUMZ(s(Y`tE@aQ9pRW0 zOsF_Hm>2;0*iC~GXyhZLlkYlJb>x4}#{X2G#io$x)3-GRR4C;4PVr%Zf(ft5V*(;7TJCWFre{lO#~uo0kuy#O_kGA}>{8ADq{ zKGN_@fyS9{12pBq^1%HN;G&_V)UlTwB&32pb4YBB!Oh3P3D9coZ;uu*eh$eL(gjm! z2N(F&&0J7+CzC@1A=y{!|K*{jW8J}Uw6r`fcQ4Loc`?`NE%f(IriYIlz3Jw)T|0Li zx?#`Wl>@8$58g-wbFaFBIU#!h4#p7QXq>sq(eC{$(Hs*P4RAVm!+vIbKsq}F`!`f0 z>b^k>hbYS5P%ZQHw=iEFX_?2@(BPrr{S-}v9f*D;GnUn5UchyBTstLg6`@u9>ftRx zeQp)sGQ2eikP!=?P9!Ae5+(-3U9(xb+d1;==SH_xi*)Aov@yE9+R5$TYKns>9T^Z-Ni6 zsgCkQpK5%#8Hf0x;cK?Thh4+nns`>nS`)uCRM^cX>{-_GKM1?&r_qt>Mm}?!X8P6D z8n^7Z>lz@B4v)ij0KKtN;D4)rYfU|T^q$ezR5$S2tNk@l?VeFt?V;pVHubkud$~X6 zQ%_^<$>F3SA=(W@|b53zLv0%ZD40Tef8OdPYw zS8uHL@%v5EM4fj+IO3i84DT%W8|PFv_w&NhBufk{9k0Z{gDi1|xtktVVrYj41~3@& zZk{mU1wKTio^JG~L;iG7UZ6w61M&$S8t&IJ+o9n;e_HjY6@S|6PkRQ&Pj2w1-SRUX z8t#(U>CkYeUv@Z;WirKT$z0XvvNWj1Tt?lbCz1$BrdBFuy zu#^SWs(4>0V(d5Yg+P5+`kJ!IK5DvBpt=%L%=~1(A>8C3_?nk1wv2ZW)lf)adH2AL z`|%+F5R=DRePbIJ3fxpF1tkzA&&MB-+{S&+{j|>yLL2bP*3TJ4*?XAh@egSzQX_6P zx0*0ZDJj$ySslTCnnNjYw;M*2`^Z*J6uWnf#)K_&t81N!{piO|T*vprS;&0fEk=ER z+s~?pvJ(LiSb~;N?q}S#7P8Mkxp^j}FV&@Xnv*Fm3^J{=IH9Y7pb^0^WXG~Kmbs`E z#ajeq^u+|SW$zG56~;hVL`hmAb5C#OjY27fIQOE2gIIo-qtl|HmP;}2eQvtb}zBv9jLLQzrx~GnCy8+TH1JrU)>X9rL5L3R9WMc|e(WaT|R==e98*{2W z9bF*cpVxIK2{~oK>J4PB76V7soMs@d)l2(l%+|advGUAZ(3e>|cMaK=(+P+Q#xrZ| z(|)~moQ_bi7^^s`DH{`0n=s{Ld+0kSiPvM*~MX zi0oVvXtw1+BtSs7s}`+~lUbz4vb{wX=(f-8k9nQ_fgK%;>`2$s9T}Hv#fLkxH_5Wu znFxj-^<)q@+zE=3gM09Bi7~;3BHRRkba1~p{_@9^?S}ssIX;dsi~CfnDA`_^IF>8$ z3exo+V1*~WVZTRmLKy+qD7BnMqZs13-#rQujqy$=^j?CaMy$74dYVk4;)ILdJ;7%-B&=vD%_`)&^kj+(Ps53A(IQzid zDgMk`wqmv`{ya2`_3HPpzk31&Jv%u}4GY!o8>1`dqZ>dL@ylAoP7IIrj`Hy7$&i*U z4Qx8zrdz#8%#20JIRn5II5Z#W42`GLFz8!+UYMWa~b{)c+&}(F2M?%xujtEWS zihpHT{$n$i?cU2<9x{S^LcQQ2Qvz2}hj2@gKgQp{NeJL#F7gorP?A~-w&R10RX$XS zOvM74vp0)AU{{G(qlDlMd;ZSMkGF5DKeUjb`$%w_Er~S&jxw5>&EnZ!dAL1t!(PJS(hC6u| z&@TR+T)KK8+*Whp1(UZca#~37W(7_@I`z!-fhr@R%0D!TallS^k+L^G(df*-J(cH; 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 C`O3%u literal 260135 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 diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index a140e6ccee928..388d107fe74c1 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -21,12 +21,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(alloc))] -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; -#[cfg(feature = "std")] -extern crate serde; - extern crate substrate_runtime_std as rstd; extern crate substrate_primitives as primitives; extern crate substrate_runtime_primitives as runtime_primitives; @@ -36,51 +30,5 @@ extern crate substrate_serializer; extern crate substrate_codec as codec; pub mod parachain; +use runtime_primitives::generic; -/// Virtual account ID that represents the idea of a dispatch/statement being signed by everybody -/// (who matters). Essentially this means that a majority of validators have decided it is -/// "correct". -pub const EVERYBODY: AccountId = [255u8; 32]; - -/// Something that identifies a block. -pub use primitives::block::Id as BlockId; - -/// The type of digest item. -pub use primitives::block::Log as Log; - -/// An index to a block. -/// 32-bits will allow for 136 years of blocks assuming 1 block per second. -/// TODO: switch to u32 -pub type BlockNumber = u64; - -/// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost -/// certainly continue to be the same as the substrate's `AuthorityId`. -pub type AccountId = primitives::AuthorityId; - -/// The Ed25519 pub key of an session that belongs to an authority of the relay chain. This is -/// exactly equivalent to what the substrate calls an "authority". -pub type SessionKey = primitives::AuthorityId; - -/// Indentifier for a chain. 32-bit should be plenty. -pub type ChainId = u32; - -/// Index of a transaction in the relay chain. 32-bit should be plenty. -pub type Index = u32; - -/// A hash of some data used by the relay chain. -pub type Hash = primitives::H256; - -/// Alias to 512-bit hash when used in the context of a signature on the relay chain. -pub type Signature = runtime_primitives::Ed25519Signature; - -/// A timestamp: seconds since the unix epoch. -pub type Timestamp = u64; - -/// The balance of an account. -/// 128-bits (or 38 significant decimal figures) will allow for 10m currency (10^7) at a resolution -/// to all for one second's worth of an annualised 50% reward be paid to a unit holder (10^11 unit -/// denomination), or 10^18 total atomic units, to grow at 50%/year for 51 years (10^9 multiplier) -/// for an eventual total of 10^27 units (27 significant decimal figures). -/// We round denomination to 10^12 (12 sdf), and leave the other redundancy at the upper end so -/// that 32 bits may be multiplied with a balance in 128 bits without worrying about overflow. -pub type Balance = u128; diff --git a/polkadot/primitives/src/parachain.rs b/polkadot/primitives/src/parachain.rs index 3a87b1faa2d11..92691ff1bf8aa 100644 --- a/polkadot/primitives/src/parachain.rs +++ b/polkadot/primitives/src/parachain.rs @@ -24,322 +24,6 @@ use rstd::cmp::{PartialOrd, Ord, Ordering}; use rstd::vec::Vec; use ::Hash; -/// Unique identifier of a parachain. -#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct Id(u32); - -impl From for u32 { - fn from(x: Id) -> Self { x.0 } -} - -impl From for Id { - fn from(x: u32) -> Self { Id(x) } -} - -impl Id { - /// Convert this Id into its inner representation. - pub fn into_inner(self) -> u32 { - self.0 - } -} - -impl Slicable for Id { - fn decode(input: &mut I) -> Option { - u32::decode(input).map(Id) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } -} - -/// Identifier for a chain, either one of a number of parachains or the relay chain. -#[derive(Copy, Clone, PartialEq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum Chain { - /// The relay chain. - Relay, - /// A parachain of the given index. - Parachain(Id), -} - -impl Slicable for Chain { - fn decode(input: &mut I) -> Option { - let disc = input.read_byte()?; - - match disc { - 0 => Some(Chain::Relay), - 1 => Some(Chain::Parachain(Slicable::decode(input)?)), - _ => None, - } - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Chain::Relay => { v.push(0); } - Chain::Parachain(id) => { - v.push(1u8); - id.using_encoded(|s| v.extend(s)); - } - } - - v - } - - fn using_encoded R>(&self, f: F) -> R { - f(&self.encode().as_slice()) - } -} - -/// The duty roster specifying what jobs each validator must do. -#[derive(Clone, PartialEq)] -#[cfg_attr(feature = "std", derive(Default, Debug))] -pub struct DutyRoster { - /// Lookup from validator index to chain on which that validator has a duty to validate. - pub validator_duty: Vec, - /// Lookup from validator index to chain on which that validator has a duty to guarantee - /// availability. - pub guarantor_duty: Vec, -} - -impl Slicable for DutyRoster { - fn decode(input: &mut I) -> Option { - Some(DutyRoster { - validator_duty: Slicable::decode(input)?, - guarantor_duty: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - v.extend(self.validator_duty.encode()); - v.extend(self.guarantor_duty.encode()); - - v - } - - fn using_encoded R>(&self, f: F) -> R { - f(&self.encode().as_slice()) - } -} - -/// Extrinsic data for a parachain. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Extrinsic; - -/// Candidate parachain block. -/// -/// https://github.com/w3f/polkadot-spec/blob/master/spec.md#candidate-para-chain-block -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Candidate { - /// The ID of the parachain this is a proposal for. - pub parachain_index: Id, - /// Collator's signature - pub collator_signature: ::Signature, - /// Unprocessed ingress queue. - /// - /// Ordered by parachain ID and block number. - pub unprocessed_ingress: ConsolidatedIngress, - /// Block data - pub block: BlockData, -} - -/// Candidate receipt type. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct CandidateReceipt { - /// The ID of the parachain this is a candidate for. - pub parachain_index: Id, - /// The collator's relay-chain account ID - pub collator: ::AccountId, - /// The head-data - pub head_data: HeadData, - /// Balance uploads to the relay chain. - pub balance_uploads: Vec<(::AccountId, u64)>, - /// Egress queue roots. - pub egress_queue_roots: Vec<(Id, primitives::H256)>, - /// Fees paid from the chain to the relay chain validators - pub fees: u64, -} - -impl Slicable for CandidateReceipt { - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - self.parachain_index.using_encoded(|s| v.extend(s)); - self.collator.using_encoded(|s| v.extend(s)); - self.head_data.0.using_encoded(|s| v.extend(s)); - self.balance_uploads.using_encoded(|s| v.extend(s)); - self.egress_queue_roots.using_encoded(|s| v.extend(s)); - self.fees.using_encoded(|s| v.extend(s)); - - v - } - - fn decode(input: &mut I) -> Option { - Some(CandidateReceipt { - parachain_index: Slicable::decode(input)?, - collator: Slicable::decode(input)?, - head_data: Slicable::decode(input).map(HeadData)?, - balance_uploads: Slicable::decode(input)?, - egress_queue_roots: Slicable::decode(input)?, - fees: Slicable::decode(input)?, - }) - } -} - -impl CandidateReceipt { - /// Get the blake2_256 hash - #[cfg(feature = "std")] - pub fn hash(&self) -> Hash { - let encoded = self.encode(); - primitives::hashing::blake2_256(&encoded).into() - } -} - -impl PartialOrd for CandidateReceipt { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for CandidateReceipt { - fn cmp(&self, other: &Self) -> Ordering { - // TODO: compare signatures or something more sane - self.parachain_index.cmp(&other.parachain_index) - .then_with(|| self.head_data.cmp(&other.head_data)) - } -} - -/// Parachain ingress queue message. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct Message(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -/// Consolidated ingress queue data. -/// -/// This is just an ordered vector of other parachains' egress queues, -/// obtained according to the routing rules. -#[derive(Default, PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct ConsolidatedIngress(pub Vec<(Id, Vec)>); - -/// Parachain block data. -/// -/// contains everything required to validate para-block, may contain block and witness data -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -/// Parachain header raw bytes wrapper type. -#[derive(PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct Header(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -/// Parachain head data included in the chain. -#[derive(PartialEq, Eq, Clone, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -/// Parachain validation code. -#[derive(PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -/// Activitiy bit field -#[derive(PartialEq, Eq, Clone, Default)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct Activity(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -impl Slicable for Activity { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Activity) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } -} - -#[derive(Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -#[repr(u8)] -enum StatementKind { - Candidate = 1, - Valid = 2, - Invalid = 3, - Available = 4, -} - -/// Statements which can be made about parachain candidates. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum Statement { - /// Proposal of a parachain candidate. - Candidate(CandidateReceipt), - /// State that a parachain candidate is valid. - Valid(Hash), - /// Vote to commit to a candidate. - Invalid(Hash), - /// Vote to advance round after inactive primary. - Available(Hash), -} - -impl Slicable for Statement { - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Statement::Candidate(ref candidate) => { - v.push(StatementKind::Candidate as u8); - candidate.using_encoded(|s| v.extend(s)); - } - Statement::Valid(ref hash) => { - v.push(StatementKind::Valid as u8); - hash.using_encoded(|s| v.extend(s)); - } - Statement::Invalid(ref hash) => { - v.push(StatementKind::Invalid as u8); - hash.using_encoded(|s| v.extend(s)); - } - Statement::Available(ref hash) => { - v.push(StatementKind::Available as u8); - hash.using_encoded(|s| v.extend(s)); - } - } - - v - } - - fn decode(value: &mut I) -> Option { - match value.read_byte() { - Some(x) if x == StatementKind::Candidate as u8 => { - Slicable::decode(value).map(Statement::Candidate) - } - Some(x) if x == StatementKind::Valid as u8 => { - Slicable::decode(value).map(Statement::Valid) - } - Some(x) if x == StatementKind::Invalid as u8 => { - Slicable::decode(value).map(Statement::Invalid) - } - Some(x) if x == StatementKind::Available as u8 => { - Slicable::decode(value).map(Statement::Available) - } - _ => None, - } - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/polkadot/runtime/Cargo.toml b/polkadot/runtime/Cargo.toml index 95044242fef1b..6962ba42b24a7 100644 --- a/polkadot/runtime/Cargo.toml +++ b/polkadot/runtime/Cargo.toml @@ -25,7 +25,6 @@ substrate-runtime-session = { path = "../../substrate/runtime/session" } substrate-runtime-staking = { path = "../../substrate/runtime/staking" } substrate-runtime-system = { path = "../../substrate/runtime/system" } substrate-runtime-timestamp = { path = "../../substrate/runtime/timestamp" } -polkadot-primitives = { path = "../primitives" } [dev-dependencies] hex-literal = "0.1.0" @@ -47,7 +46,6 @@ std = [ "substrate-runtime-staking/std", "substrate-runtime-system/std", "substrate-runtime-timestamp/std", - "polkadot-primitives/std", "serde_derive", "serde/std", "log", diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index 2b382820bb47b..f217a19e8fc15 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -18,6 +18,12 @@ #![cfg_attr(not(feature = "std"), no_std)] +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; +#[cfg(feature = "std")] +extern crate serde; + #[macro_use] extern crate substrate_runtime_io as runtime_io; @@ -47,12 +53,12 @@ extern crate substrate_runtime_session as session; extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; extern crate substrate_runtime_timestamp as timestamp; -extern crate polkadot_primitives; +pub mod primitives; mod parachains; -use polkadot_primitives::{AccountId, Balance, BlockNumber, Hash, Index, Log, SessionKey, Signature}; -use runtime_primitives::generic; +use primitives::{AccountId, Balance, BlockNumber, Hash, Index, Log, SessionKey}; +use runtime_primitives::{generic, traits::{HasPublicAux, BlakeTwo256, Convert}}; #[cfg(feature = "std")] pub use runtime_primitives::BuildExternalities; @@ -60,14 +66,12 @@ pub use runtime_primitives::BuildExternalities; pub use consensus::Call as ConsensusCall; pub use timestamp::Call as TimestampCall; pub use parachains::Call as ParachainsCall; - +pub use primitives::{Header, Block, UncheckedExtrinsic, Extrinsic}; /// The position of the timestamp set extrinsic. pub const TIMESTAMP_SET_POSITION: u32 = 0; /// The position of the parachains set extrinsic. pub const PARACHAINS_SET_POSITION: u32 = 1; -/// Block header type as expected by this runtime. -pub type Header = generic::Header; /// Concrete runtime type used to parameterize the various modules. pub struct Concrete; @@ -102,8 +106,16 @@ impl timestamp::Trait for Concrete { /// Timestamp module for this concrete runtime. pub type Timestamp = timestamp::Module; +/// Session key conversion. +pub struct SessionKeyConversion; +impl Convert for SessionKeyConversion { + fn convert(a: AccountId) -> SessionKey { + a.0 + } +} + impl session::Trait for Concrete { - type ConvertAccountIdToSessionKey = Identity; + type ConvertAccountIdToSessionKey = SessionKeyConversion; } /// Session module for this concrete runtime. pub type Session = session::Module; @@ -156,12 +168,6 @@ impl_outer_dispatch! { } } -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type as expected by this runtime. -pub type Extrinsic = generic::Extrinsic; /// Executive: handles dispatch to the various modules. pub type Executive = executive::Executive; diff --git a/polkadot/runtime/src/parachains.rs b/polkadot/runtime/src/parachains.rs index 2c1c7eb47554d..07a4101b24a1d 100644 --- a/polkadot/runtime/src/parachains.rs +++ b/polkadot/runtime/src/parachains.rs @@ -16,13 +16,13 @@ //! Main parachains logic. For now this is just the determination of which validators do what. -use polkadot_primitives; +use primitives; use rstd::prelude::*; use codec::{Slicable, Joiner}; use runtime_support::Hashable; use runtime_primitives::traits::{Executable, RefInto, MaybeEmpty}; -use polkadot_primitives::parachain::{Id, Chain, DutyRoster, CandidateReceipt}; +use primitives::parachain::{Id, Chain, DutyRoster, CandidateReceipt}; use {system, session}; use runtime_support::{StorageValue, StorageMap}; @@ -33,7 +33,7 @@ use rstd::marker::PhantomData; #[cfg(any(feature = "std", test))] use {runtime_io, runtime_primitives}; -pub trait Trait: system::Trait + session::Trait { +pub trait Trait: system::Trait + session::Trait { /// The position of the set_heads call in the block. const SET_POSITION: u32; diff --git a/polkadot/runtime/src/primitives.rs b/polkadot/runtime/src/primitives.rs new file mode 100644 index 0000000000000..34445a8c85227 --- /dev/null +++ b/polkadot/runtime/src/primitives.rs @@ -0,0 +1,413 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Primitive types for the polkadot runtime. + +use codec::{Slicable, Input}; +use rstd::prelude::*; +use rstd::cmp::Ordering; +use substrate_primitives; +use runtime_primitives::{self, generic, traits::BlakeTwo256}; +use super::Call; + +#[cfg(feature = "std")] +use substrate_primitives::bytes; + +/// Block header type as expected by this runtime. +pub type Header = generic::Header; +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Extrinsic type as expected by this runtime. +pub type Extrinsic = generic::Extrinsic; + +/// Something that identifies a block. +pub type BlockId = generic::BlockId; + +/// A log entry in the block. +#[derive(PartialEq, Eq, Clone, Default)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + +impl Slicable for Log { + fn decode(input: &mut I) -> Option { + Vec::::decode(input).map(Log) + } + + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } +} + +/// An index to a block. +/// 32-bits will allow for 136 years of blocks assuming 1 block per second. +/// TODO: switch to u32 +pub type BlockNumber = u64; + +/// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost +/// certainly continue to be the same as the substrate's `AuthorityId`. +pub type AccountId = substrate_primitives::hash::H256; + +/// The Ed25519 pub key of an session that belongs to an authority of the relay chain. This is +/// exactly equivalent to what the substrate calls an "authority". +pub type SessionKey = substrate_primitives::AuthorityId; + +/// Indentifier for a chain. 32-bit should be plenty. +pub type ChainId = u32; + +/// Index of a transaction in the relay chain. 32-bit should be plenty. +pub type Index = u32; + +/// A hash of some data used by the relay chain. +pub type Hash = substrate_primitives::H256; + +/// Alias to 512-bit hash when used in the context of a signature on the relay chain. +/// Equipped with logic for possibly "unsigned" messages. +pub type Signature = runtime_primitives::MaybeUnsigned; + +/// A timestamp: seconds since the unix epoch. +pub type Timestamp = u64; + +/// The balance of an account. +/// 128-bits (or 38 significant decimal figures) will allow for 10m currency (10^7) at a resolution +/// to all for one second's worth of an annualised 50% reward be paid to a unit holder (10^11 unit +/// denomination), or 10^18 total atomic units, to grow at 50%/year for 51 years (10^9 multiplier) +/// for an eventual total of 10^27 units (27 significant decimal figures). +/// We round denomination to 10^12 (12 sdf), and leave the other redundancy at the upper end so +/// that 32 bits may be multiplied with a balance in 128 bits without worrying about overflow. +pub type Balance = u128; + +/// Parachain data types. +pub mod parachain { + use super::*; + + /// Unique identifier of a parachain. + #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + pub struct Id(u32); + + impl From for u32 { + fn from(x: Id) -> Self { x.0 } + } + + impl From for Id { + fn from(x: u32) -> Self { Id(x) } + } + + impl Id { + /// Convert this Id into its inner representation. + pub fn into_inner(self) -> u32 { + self.0 + } + } + + impl Slicable for Id { + fn decode(input: &mut I) -> Option { + u32::decode(input).map(Id) + } + + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } + } + + /// Identifier for a chain, either one of a number of parachains or the relay chain. + #[derive(Copy, Clone, PartialEq)] + #[cfg_attr(feature = "std", derive(Debug))] + pub enum Chain { + /// The relay chain. + Relay, + /// A parachain of the given index. + Parachain(Id), + } + + impl Slicable for Chain { + fn decode(input: &mut I) -> Option { + let disc = input.read_byte()?; + + match disc { + 0 => Some(Chain::Relay), + 1 => Some(Chain::Parachain(Slicable::decode(input)?)), + _ => None, + } + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Chain::Relay => { v.push(0); } + Chain::Parachain(id) => { + v.push(1u8); + id.using_encoded(|s| v.extend(s)); + } + } + + v + } + + fn using_encoded R>(&self, f: F) -> R { + f(&self.encode().as_slice()) + } + } + + /// The duty roster specifying what jobs each validator must do. + #[derive(Clone, PartialEq)] + #[cfg_attr(feature = "std", derive(Default, Debug))] + pub struct DutyRoster { + /// Lookup from validator index to chain on which that validator has a duty to validate. + pub validator_duty: Vec, + /// Lookup from validator index to chain on which that validator has a duty to guarantee + /// availability. + pub guarantor_duty: Vec, + } + + impl Slicable for DutyRoster { + fn decode(input: &mut I) -> Option { + Some(DutyRoster { + validator_duty: Slicable::decode(input)?, + guarantor_duty: Slicable::decode(input)?, + }) + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + v.extend(self.validator_duty.encode()); + v.extend(self.guarantor_duty.encode()); + + v + } + + fn using_encoded R>(&self, f: F) -> R { + f(&self.encode().as_slice()) + } + } + + /// Extrinsic data for a parachain. + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] + #[cfg_attr(feature = "std", serde(deny_unknown_fields))] + pub struct Extrinsic; + + /// Candidate parachain block. + /// + /// https://github.com/w3f/polkadot-spec/blob/master/spec.md#candidate-para-chain-block + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] + #[cfg_attr(feature = "std", serde(deny_unknown_fields))] + pub struct Candidate { + /// The ID of the parachain this is a proposal for. + pub parachain_index: Id, + /// Collator's signature + pub collator_signature: runtime_primitives::Ed25519Signature, + /// Unprocessed ingress queue. + /// + /// Ordered by parachain ID and block number. + pub unprocessed_ingress: ConsolidatedIngress, + /// Block data + pub block: BlockData, + } + + /// Candidate receipt type. + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Debug, Serialize))] + #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] + #[cfg_attr(feature = "std", serde(deny_unknown_fields))] + pub struct CandidateReceipt { + /// The ID of the parachain this is a candidate for. + pub parachain_index: Id, + /// The collator's relay-chain account ID + pub collator: super::AccountId, + /// The head-data + pub head_data: HeadData, + /// Balance uploads to the relay chain. + pub balance_uploads: Vec<(super::AccountId, u64)>, + /// Egress queue roots. + pub egress_queue_roots: Vec<(Id, Hash)>, + /// Fees paid from the chain to the relay chain validators + pub fees: u64, + } + + impl Slicable for CandidateReceipt { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + self.parachain_index.using_encoded(|s| v.extend(s)); + self.collator.using_encoded(|s| v.extend(s)); + self.head_data.0.using_encoded(|s| v.extend(s)); + self.balance_uploads.using_encoded(|s| v.extend(s)); + self.egress_queue_roots.using_encoded(|s| v.extend(s)); + self.fees.using_encoded(|s| v.extend(s)); + + v + } + + fn decode(input: &mut I) -> Option { + Some(CandidateReceipt { + parachain_index: Slicable::decode(input)?, + collator: Slicable::decode(input)?, + head_data: Slicable::decode(input).map(HeadData)?, + balance_uploads: Slicable::decode(input)?, + egress_queue_roots: Slicable::decode(input)?, + fees: Slicable::decode(input)?, + }) + } + } + + impl CandidateReceipt { + /// Get the blake2_256 hash + #[cfg(feature = "std")] + pub fn hash(&self) -> Hash { + use runtime_primitives::traits::Hashing; + BlakeTwo256::hash_of(self) + } + } + + impl PartialOrd for CandidateReceipt { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } + } + + impl Ord for CandidateReceipt { + fn cmp(&self, other: &Self) -> Ordering { + // TODO: compare signatures or something more sane + self.parachain_index.cmp(&other.parachain_index) + .then_with(|| self.head_data.cmp(&other.head_data)) + } + } + + /// Parachain ingress queue message. + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + pub struct Message(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + /// Consolidated ingress queue data. + /// + /// This is just an ordered vector of other parachains' egress queues, + /// obtained according to the routing rules. + #[derive(Default, PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + pub struct ConsolidatedIngress(pub Vec<(Id, Vec)>); + + /// Parachain block data. + /// + /// contains everything required to validate para-block, may contain block and witness data + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + /// Parachain header raw bytes wrapper type. + #[derive(PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + pub struct Header(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + /// Parachain head data included in the chain. + #[derive(PartialEq, Eq, Clone, PartialOrd, Ord)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + /// Parachain validation code. + #[derive(PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + /// Activitiy bit field + #[derive(PartialEq, Eq, Clone, Default)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + pub struct Activity(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + + impl Slicable for Activity { + fn decode(input: &mut I) -> Option { + Vec::::decode(input).map(Activity) + } + + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } + } + + #[derive(Clone, Copy, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug))] + #[repr(u8)] + enum StatementKind { + Candidate = 1, + Valid = 2, + Invalid = 3, + Available = 4, + } + + /// Statements which can be made about parachain candidates. + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug))] + pub enum Statement { + /// Proposal of a parachain candidate. + Candidate(CandidateReceipt), + /// State that a parachain candidate is valid. + Valid(Hash), + /// Vote to commit to a candidate. + Invalid(Hash), + /// Vote to advance round after inactive primary. + Available(Hash), + } + + impl Slicable for Statement { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + match *self { + Statement::Candidate(ref candidate) => { + v.push(StatementKind::Candidate as u8); + candidate.using_encoded(|s| v.extend(s)); + } + Statement::Valid(ref hash) => { + v.push(StatementKind::Valid as u8); + hash.using_encoded(|s| v.extend(s)); + } + Statement::Invalid(ref hash) => { + v.push(StatementKind::Invalid as u8); + hash.using_encoded(|s| v.extend(s)); + } + Statement::Available(ref hash) => { + v.push(StatementKind::Available as u8); + hash.using_encoded(|s| v.extend(s)); + } + } + + v + } + + fn decode(value: &mut I) -> Option { + match value.read_byte() { + Some(x) if x == StatementKind::Candidate as u8 => { + Slicable::decode(value).map(Statement::Candidate) + } + Some(x) if x == StatementKind::Valid as u8 => { + Slicable::decode(value).map(Statement::Valid) + } + Some(x) if x == StatementKind::Invalid as u8 => { + Slicable::decode(value).map(Statement::Invalid) + } + Some(x) if x == StatementKind::Available as u8 => { + Slicable::decode(value).map(Statement::Available) + } + _ => None, + } + } + } +} diff --git a/polkadot/runtime/wasm/Cargo.lock b/polkadot/runtime/wasm/Cargo.lock index 6d34f9623c567..39b6df26b9ef0 100644 --- a/polkadot/runtime/wasm/Cargo.lock +++ b/polkadot/runtime/wasm/Cargo.lock @@ -7,18 +7,13 @@ dependencies = [ ] [[package]] -name = "bigint" -version = "4.2.0" +name = "base58" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "bitflags" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -32,32 +27,54 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.4" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "coco" -version = "0.1.1" +name = "constant_time_eq" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crossbeam-deque" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "constant_time_eq" -version = "0.1.3" +name = "crossbeam-utils" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "crunchy" @@ -68,17 +85,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "ed25519" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "either" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "elastic-array" version = "0.10.0" @@ -96,11 +110,33 @@ name = "ethbloom" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ethereum-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ethereum-types-serialize" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -118,7 +154,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -128,7 +164,7 @@ name = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -152,16 +188,16 @@ dependencies = [ [[package]] name = "hex-literal" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -177,9 +213,9 @@ name = "keccak-hash" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -189,12 +225,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "lazy_static" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.36" +version = "0.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -210,9 +246,14 @@ name = "log" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memoffset" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memory_units" version = "0.3.0" @@ -233,7 +274,7 @@ name = "num_cpus" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -249,9 +290,9 @@ name = "parity-wasm" version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -259,55 +300,34 @@ name = "parity-wasm" version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot_core" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "plain_hasher" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "polkadot-primitives" -version = "0.1.0" -dependencies = [ - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-codec 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-primitives 0.1.0", - "substrate-runtime-std 0.1.0", -] - [[package]] name = "polkadot-runtime" version = "0.1.0" dependencies = [ "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", - "polkadot-primitives 0.1.0", "safe-mix 0.1.0", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", @@ -338,12 +358,20 @@ name = "proc-macro-hack-impl" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "proc-macro2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pwasm-alloc" version = "0.1.0" dependencies = [ "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -355,15 +383,18 @@ name = "pwasm-utils" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quote" -version = "0.3.15" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "rand" @@ -371,7 +402,7 @@ version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -381,7 +412,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -390,19 +421,19 @@ name = "rayon" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -412,7 +443,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -422,7 +453,7 @@ name = "rlp" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -440,17 +471,17 @@ source = "git+https://github.com/rphmeier/rustc-hex.git#ee2ec40b9062ac7769ccb9dc [[package]] name = "rustc_version" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "safe-mix" version = "0.1.0" dependencies = [ - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -460,7 +491,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "semver" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -473,31 +504,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.27" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_derive_internals" -version = "0.19.0" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "smallvec" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -514,8 +536,8 @@ name = "substrate-keyring" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -523,25 +545,25 @@ name = "substrate-primitives" version = "0.1.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", "rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-std 0.1.0", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", - "wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-runtime-consensus" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -555,10 +577,10 @@ dependencies = [ name = "substrate-runtime-council" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -577,9 +599,9 @@ dependencies = [ name = "substrate-runtime-democracy" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", @@ -596,8 +618,8 @@ dependencies = [ name = "substrate-runtime-executive" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -612,7 +634,7 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "environmental 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-std 0.1.0", @@ -626,8 +648,8 @@ version = "0.1.0" dependencies = [ "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -639,21 +661,21 @@ dependencies = [ name = "substrate-runtime-sandbox" version = "0.1.0" dependencies = [ - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", - "wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-runtime-session" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -669,11 +691,11 @@ dependencies = [ name = "substrate-runtime-staking" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -693,7 +715,7 @@ version = "0.1.0" dependencies = [ "pwasm-alloc 0.1.0", "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -701,9 +723,9 @@ name = "substrate-runtime-support" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -714,9 +736,9 @@ dependencies = [ name = "substrate-runtime-system" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -729,8 +751,8 @@ dependencies = [ name = "substrate-runtime-timestamp" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -744,35 +766,30 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "syn" -version = "0.11.11" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "synom" -version = "0.11.3" +name = "tiny-keccak" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tiny-keccak" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "triehash" version = "0.1.2" @@ -797,14 +814,25 @@ name = "uint" version = "0.1.2" source = "git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm#8dc457899afdaf968ff7f16140b03d1e37b01d71" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "uint" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-xid" -version = "0.0.4" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -814,10 +842,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -843,32 +871,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" -"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" +"checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" +"checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" -"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" -"checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" -"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" -"checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd" +"checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" +"checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" +"checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" +"checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" +"checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" -"checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" -"checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" +"checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" +"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" +"checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6" +"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" "checksum fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" "checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" -"checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" -"checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" +"checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" +"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" "checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" -"checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" +"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" -"checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" +"checksum libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)" = "ac8ebf8343a981e2fa97042b14768f02ed3e1d602eac06cae6166df3c8ced206" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" +"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775393e285254d2f5004596d69bb8bc1149754570dcc08cf30cabeba67955e28" @@ -876,40 +909,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4dc02a80a0315b109e48992c46942c79bcdb8fac416dd575d330ed9ced6cbd" "checksum parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41083957b80abb8a01fac4d2773d5f92653aed8f0b740c8d3da1da62c7857abe" -"checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd" -"checksum parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f35048d735bb93dd115a0030498785971aab3234d311fbe273d020084d26bd8" -"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995" +"checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" +"checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" +"checksum proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1fa93823f53cfd0f5ac117b189aed6cfdfb2cfc0a9d82e956dd7927595ed7d46" "checksum pwasm-utils 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3a822d2a1624b10c46572c231c149575bcc261c37d84fd3f1a2f5ae1f65515" -"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" +"checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" -"checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" +"checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" "checksum rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "89db7f8dfdd5eb7ab3ac3ece7a07fd273a680b4b224cb231181280e8996f9f0b" "checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" "checksum rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)" = "" -"checksum rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9743a7670d88d5d52950408ecdb7c71d8986251ab604d4689dd2ca25c9bca69" +"checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526" -"checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0" -"checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5" -"checksum smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44db0ecb22921ef790d17ae13a3f6d15784183ff5f2a01aa32098c7498d2b4b9" +"checksum serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "fba5be06346c5200249c8c8ca4ccba4a09e8747c71c16e420bd359a0db4d8f91" +"checksum serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "79e4620ba6fbe051fc7506fab6f84205823564d55da18d55b695160fb3479cd8" +"checksum smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03dab98ab5ded3a8b43b2c80751194608d0b2aa0f1d46cf95d1c35e192844aa7" "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b" -"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e9241752647ca572f12c9b520a5d360d9099360c527770647e694001646a1d0" +"checksum syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6dfd71b2be5a58ee30a6f8ea355ba8290d397131c00dfa55c3d34e6e13db5101" +"checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" "checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" -"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" -"checksum wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26b20dbeb7caee04597a5d2c93e2b3e64872c6ea2af732d7ad49dbec44067c35" +"checksum wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19da510b59247935ad5f598357b3cc739912666d75d3d28318026478d95bbdb" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/polkadot/runtime/wasm/Cargo.toml b/polkadot/runtime/wasm/Cargo.toml index a75bd649adff0..c48c2b3e50107 100644 --- a/polkadot/runtime/wasm/Cargo.toml +++ b/polkadot/runtime/wasm/Cargo.toml @@ -23,7 +23,6 @@ substrate-runtime-session = { path = "../../../substrate/runtime/session", defau substrate-runtime-staking = { path = "../../../substrate/runtime/staking", default-features = false } substrate-runtime-system = { path = "../../../substrate/runtime/system", default-features = false } substrate-runtime-timestamp = { path = "../../../substrate/runtime/timestamp", default-features = false } -polkadot-primitives = { path = "../../primitives", default-features = false } [features] default = [] @@ -43,7 +42,6 @@ std = [ "substrate-runtime-staking/std", "substrate-runtime-system/std", "substrate-runtime-timestamp/std", - "polkadot-primitives/std", ] [profile.release] diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index ec751e3eb6e9584d9f65c6077ecdd01b5b915329..b09894cbae746126300c291fd44d7c0aa86795e4 100644 GIT binary patch literal 419575 zcmeFa3A|iKb?1MV-rl?2@3o|-#gc5_Zp*f0Tb8^@^6o2;WMLEA;DD2ucoo=^yhwgF z5Wo`H7{b0Lge@c?hyt?uwqJ|`I;dDQ=JRXxg|;P!xD<45&r zji2qo$9aYPNX07G;D7xd{djFnyzl-;TKirxf7?qB@7osydY#kj%l6IR_R#zThwpgV zzT57-fBu0W(ofU+>ApJ-9(>@gAXdg2W$e5E;rsR-zGHsh-M7sjzIWekhaY%gK1lTQ zjDCLbFcsYP@cc`61feoJgG@dQI)jS$-FMf6uM8SP8TUQtG7@Wg-+lKz@W{U5A`k7G zcNuLJnSc2Muej}k3wH!{RWqwB3gmrpV3i=aXWuIvR9!3Sdu%;0WGqwmT?hBwak!|$ zI$=G#^WYr^_FZ_}g_mq|tu0sKeRp4Y$t4$DdfOxW4&VFIR|cyD#wx4)j{EPv6X5RK zci#htUwPa8`(7S2_2arRKhD$O-4DF{em5ek%O&o;|DpLi?w`LGdtOHb|PE2$O~*q9|B)_~D1)^~e;56I^rz8(iheozwdfzCUyA-I`qk*yqv_AQef3{NKNy9zBhfYa-!#}91pP2; z9?F`#J3-1YX_Uh#t|e)Z)%I_Uf_}8C6GzwZ+P2qlmkMUT6&&ovS`E*sdha8D;P z(E6e3JtehAr9?;x51Nu5G^?ey-`5iGLyJBP*OL5k7)FM$G~k!M?|i(cLq(f|n%Y;D zqhG3g&B_}FD5n;z>0SO4L&U5w@t)Q8uG`;lY>QesZPBebi=R)2qK(nke)GwGYv;N*9_!T7 z*3SA9$N22X^&RREHsWs7pXx;2b%90}2m}a3umLc$us4-JV9jk&jmMPxkutQDHiZy_ zi9S!eRCj+bfiOj!?f9B>dS|db4${OutSqC|@vnN&T?UY@)>7ZWG;PqqnRLcFIFqHM z(!J}_hIKJe7s)wYooi>|{$87wyZga=e>R=o6kCIq)7{_irb#)6wwI-yJSUAd#ap+> zU8o)`LGlcGcRjTk(f2Gj=uNf594|Dig6j4Zvxt%&P3aWquFvlWYU=E64+0=uvp=0x zQ})u`pLUCv*8X&ve^Fz68}9GN!fiWk?sZh7ih}KAiN14~hQ_9QYLIkK3zA0AJr)MZ z6Y%1KyYQ9cAAZgpJ$kfzhym9;>P4WuG2hp?(-*i0BO8-fpNGckX?)$f?wM;rg*Z(( z-wQ!Nb~JRQnF>AOBdrM*wUUOUW)qQ5_e;Q054z{&|9`Sx7m?Tb7e7OUzH{rN(0b}< zeG!D-IuW6ZOmixS-pf=TiI8`s_Sl+Emx;M+#2kW2%~qH+scwas!)(@Os%E!l2Ls=0 z8FBVzhNcb#J?o~<@C+Ji(M_L0izzLZrVnr9rcPy|(9$wTz06*lOaL}}f~k|{WV-07 zv-Kd%KW%M~TQI*Fag55m2(yiT0`VLD@e{~i@_D8gH~pB>i<(G1NVgv(k81{rzQtnn zx0ppH8lvpagM$pAaZZ~^Oq#(Q;svO;9<(_Wx;YdxhoWK*eKwy%3(lWEsmz~GM`2U* zCUx>bB&Z1tXA+-YlSVs3@h=-7=3;k)_!I9NqcweIX1opF!~ABJT4_-ilbv6Uk$7YU z)>T9S_*3om_?k?R!a5?pW_nX24MlT#L!lZH&!xW5$*6`{m^eY&Fc|vH{b_x35L_k* zHb!$jveO#XgEE5>4#Ha>-qs`weuHRAL*N9Qv>{-cVzG5`cz9BF1P(clGpZKr4MZV{ zB|h|Bx!yokIU{6v4y4fy>SP)ro6~S_KkS5AAPLA2^=nL9a+#!n!uT=L!L=Qu1wMO*uecVwTm z)8d^8D>cc#8+8bqbx}v0Q-|Ihb;P2MI@A$+>M#Lp)FDpL3)4n+JG#L*>QF6J>Uf{i zydq7ktz#$FMx*yQg~(G>lYC320byop%b?2(hgaw7?Sw5={q7SVv0*c$T4Wc+Dx0m!8GI8 zH|+tHabuKt5$lH8uQUproJLVs%bdBMFDR$3U+m3RD(}=|D;mw2|*I} z)`NFS1#6`70Z~XO^)2V2X-(WNaH9fJipo;c-fBFItW3eQ0f`_Az{5vn$wMAXt{ zxH~z!J1CiwY)vg{ogiunzoKlDdg>oC!XD)GwC+JRFdB>uLrtZ&WKBW)pl>3^)`0C! z1=&Zx7<8`*lAr3twIj7hLyh#&@IcQ9Jnz=%GYvNf8<~0Wp)Ay5JGmRe*yT zW+($I{PV+lEpB&p>g^ds0#aEe^Z{a16CQ#fmsOq~?S5UA^6^8~eOp*iHO<(Bbs7J4ORU20|>W`y4rekSfym$dWyP_X2sK z*?wt(8q_Uxj4~R`awF^sn`%y9jtm`H)sZ8sI&fr-AGcN;J}VtKi=_ zvpy>PC{^~S2Dz2~30H^?=CvzgNI{hP+Igi5)2RcYAYu#=S}NGUhM5_!Y=kt{fH+;e z09n0w0o%3wMMG-Kjbcb`ly9_ZZIr=SX;3{)2r~n^aCD=*673jmxtW?bCS>L_+U1Fa z%GDdq(3~q(v|!mrj6;oBw$bcRJ2~MEHwA~Luj-iTqeI;WT~>Pue5=+*p@80cWFt{z zS%=8VnUkz}1=|=$b!d0TqdK_vGfH)Cp9$^W+aG-EYzGX z;cq0X_{}AfKY2l|hA@_C1?lx!tcURi1j@ht9ghLY?m!F3TK4_nb)ByvOr^D%PlUnL zs!sU*;j!=&;df&lnf<=7)?NJ_;pJ<3FRE{Bd{1~Zd~yG6;fKPHhnuFCy*51O!{JB6 zW^~1sw_NoN-}v@0POd)Xn{K`4b>U0SIQN?$3tP+2+q`1!JHmH{8{Qv&XZXG0Z66EQ zeIUGj{T*{33BM~m^IhSccePh$JI_D$-Qj6>Z+TDn-th5o>**JKFnrF1`=0yKm)*1L z_2KS&FM1+;LwNDGh2I{YwddMP-WTrQd-fZ{1J677t>L!qJ1)KMzWX0|Q~2iavbTiS zKmV=agNF`3H2?6|J#xd#Z@lRhFL>p*yz132e9g^l-fHC#cDJt7rHk zf=XH;%AZoK4YMn{TaZUv;ovNpw<7W4O~D1*<5VecHmlhh=j=4z9Bl13vbB3U->2mk z-yqW}-wc(FvbDQAe-fe&BMsB-fl?-BO);jSv$YB`8k*YO`C?dr2|GjqkFs9~x?5OD zMg97&&X=WvH}!$ou@plrd2Z*SUptVsZV*&jBKM`lcm6a?TV{Mfg?C!LDbC8?)%iuS zMTY~HIMk0>g!&sSmt-tKJ$7~nY|-ssG9<18iGQ>p63;mqBz}AmNc_V|k@)%WIAEUl zbc6W^lY;rVu>FS%V)OE+8_eII6wIFw+karg|Jx8^`}YL#=76O+)Dw9icYfu6{>$II zeGQZs&p)~IzlD#z@fefhf^ie6JdJE>dQA?$x!$Oq40Ms`S(ixb{U(srvRJ3wG?drbm#yo zamMZmaX2!dzd0#ZekyGLmik{bXLN-nH(R!-R%_zM-_2%{SH zJeer_u0;_2uT2W(kB9AF2h1q@9Z~wPTJral{1r?7wUWPV$$wB%BBo$0vG2uF7z^_4 zppmi&Ds zKX1uDQ}T0`{7WT&-je^U8w}{*#hFXvzPg$?vt~hm`!NB|oa<_mC{}yE9IR%n|m=dUdi@)muZ~ z+&GDOvpUau}`UX0zirKz%ab>2Qk^P=vtn%6swq}X-Y(*Cd|e?`d;S@J(A`9Vwmqmm!6 zzRi-KQu3{q{81&}V#yy<^39g~X(iue$)8d3TP-Qb-$-ga zqu+EgF4n%dS8j6-#DJ4mA$L; z3V3M6)u|rlu7?Ya)<`Km})WM>}u3BEUp%-s}5^eM1cDl6n ztd!u8D*){c+j21_?6lK4xid+sPpR)$>Y!4eQ0jnEpHynUQco&%uTnpt)ICc5 zkWw#G>PM7%sZyU-YM)X+uGHO1{e)6?DfN>|-Ko@1DRqZZpHb>|rG8ea+m!k_rM`I~ z9)AAGu*a(==ix7zP%pW5VGy@J%^==7A&7h0FA+X}RW$WYO8u5n->B5TDD@3WJuYnD zqSPCeda+X9s?>{=daqJnuhe%ab+c06t<(#Z`W~fTpw#y&b(2ybSL()vM(=`?LCuAe zkKPRvqUJIO;$XAm^B@GDGuuzNQJl-%I7dxo2QoZ-E`(DM{$a+lo5nINa(8u}3py&| z?MB%3n4N@O!rUKdOrEdQA1ZadQh%$|bxQp|Ndi@N%&d35kn_5!5*$s3Qov zaKhG4Ra<3CitX{_+k!*8=!d|bX>Xad=$iKVlNMdw-aK5? zj45OLxT<~LaM6X)v9f*cq($f2=S*63MSIhvMVGfXPFi$X`|L@JcH3u7T6DI3=A=bu z+8fHWGdJmX?RJ0CqDi}VQcX-vPRXtIX_G?JY@b?&X2qo6)!XYPEm~`@O~!4;wI^;Y zYOk5Jv9P^*vZ8xBs|ul1$k&y*GJ#QHAYBK%WO-q#fHJhsuNo`7JI-LuZ46HiJ9zlZ zHODWz+ufq3WfRu4IdB0_uBKuE-|iGO;S4?zObgXCUDRZzfC+lHF$moH!Fp$r5;DlN zi6o5<{l|NRyP4bVc{2IUQv0aIL0SZ zluASB4NRDkmVzOAh9WZ`xyZj% z*eQ%h;`S(){g|dq!R=dsIsOguWDfV@L``Udf@z5mN$Z4aG!zX%u53p>APtjF!!7X? z_{@t?m^PgKjc5(?YNtkY-298W^881nOz4;i$pXxr_dePsZp5B?1fHjU#hm9od|ec_ zju^RHB%#GpX#Vu->Y|VSqvN5XJ7mWM{-dGHl^j;^NWZzRj0_jW=K{k9XrSm`{P4|& zHpPdmG(p3Z&_J%LmR~yIv{T>!w>HJK@M2zVQw|3Zhx%*f%!1~N5?6<<(&nfc&}4Ni z^;z*CZsI9`xrt)mRDgpciUAJ(b!e0=zE59XeF%O1a2k?aGoP(_7=VX*E6UW+%eSgJ z^q^itkKt~f<+viL8}yk77Y)4yf8eobhuN2~_xxNZACj z;2jkxqXF;70SgjI5Lv}!v?(#@{V&v_&XDtPs@0N+S0O3&tVR#^E4YY2r(P>3d_7Zq z95rce)zxD_8AE%EuzQnAZ8g@`YOKRbOk*`obWRp48pakxHa=T|;PQ~re=_?sSod}l zei(z%jL^*4G%3o)Tf(iEhi?7234$S3Urj3%%i&)=BzkO1*uEU5!=jL&`{L`F%L4g| zcDF|t8))`1%esrmY>Vq#?0?7jKdx1z#C43t8LFfg&=tD;?YKfNlg;#|v z#h?VFSU;vS+(TLY(H)h9PLIoY@@i-zNvMNaff;|WbW|v*F;VASm(m#xq+`(XvEv(! zRQ4bd4=xHtM^EGsWv>8yp*L}0B_*&J>mg?NYSFY>7EH{TX&&mX;;C}5z+JwQ^{M3j zchu#EuDCFZ?*G5W5#7f7Yto^-Je3!dc8=)NYZIK%kKv5|(Xij1!x4Suy7!0AS%1cJ z>)V>&9e!(gc*EPmkKl;DvDJA~xcx)8mp7svyB^v-zXwP3nQK=){Kyrr4_|)frdPZ< zoSHr7+!d?e8-81O*0+Zr4nG!tske5&6G!y)9pNj#W!dt*&pYpw_l2ju zWb-@2cZF{W&p-Xr4~AE6`R41czwP$tzv}B=z4fi(6X6B#4!kb`=hT`^qJaT?ilE|FYcq_g_)H$&clEbf=$ ztRCa6J`Cxz!Ers#5VAw)U&x6)&dwPwxp+i>yyPr(B1AtG4()Mv`7;UfQ{mhmXXibW zATQR@eVju@oL%xvg8X}-lg%d#7x`@1{(S^_oc(rX-kHBSdP8VNY~oGI^lwx>-nDky zIDRr>vcvIx%z_P=U0}=cefGUGd;uILuBQ~Z-&qQ9KNGfp7lh^;3W@^nj)4!oa{=Bv zf-8KvSbiq7$bj+Ww{1~Cj4=m)bP;?BC-=!f_5lNN_Ju0>{iadn?^LsY!?ORn zn*HmR{rA;uIn~G6KUA}S)v|xDnk~2T!MGWDvFgp1Eednx;j_4c4;OI-zk2+*0z6;k zRN=NtagrbB;GyhY#CR18FE&WsQjN;TZkG;wg|h%U>E4)V|D{Ps_EVwx=EvDDR?#eo z;_UaU+43ikvp=h5f5Ecs`-&C^|6%c1{ zt!lw?Z;!Lt;Xby1n%wbBaN}@EzV#uS!-|$^*$VqFPiBjAdB-A{;7?78yYCH;1M=2q z66Bwp6y%SF7Ecgozg`_F1r)^DA62szTo7mPsSe;mfd+AQ@lyN!)^G_% zl=pm`{cbh;Qbjzv;R`fmg9Y#{kLkiobco9e^#@9z_Q;^MfH=G z{ibTR9QEVu9o6hlSoZs?*>d2Ivkz3W<;)*vAFO77ob2%v@!X}3?$Jez?y*U!`dy*L zB8&%l$1@4?$0h~&ouS1{j0gG3XA8OE7eLATM%deTFw55Wxu^z$#+`zyQ|p>1cSY^ zrx*|MRnH*A@0%3j$3lzxC{)nTR_M((=h%w?1#GU!G@ftGl+Ih&(|Ne0@-x2URDNae z>bzl$%1_;6Ret$!3zg1;J5CtYj5RwPiIy{(%4Hp~9@YW7<#`(xE?MGM8* zv1<04E&GS6*@_~HvrkpC6?GA3KU&QeCC1s0RkIcF5NAJK&3?kNKU2*nB7@RDQ_UvW zfb2i5BK9%M{)=k1!VzLZ3o7_lXhKX(K_y#Z3NZl&m25&5VnPfmxr8sogd0?H31x^0 zGpOVe)({hDP{}34AV@+Kz6qte=)%6+1mdxvu0Rn5I! zx$mv!5~&jtXH=;dRL8`JRC0+ziHQ}dk5_YvQ;CU7s+1*WC1x+Zl1uzbOms^n zmspmV2$o7NaV;@1ER|ehTw-EZD!IhFjGuAm4;SRyMb0>sOMNoQjJtV4GP_#gIpe|I z{tSZq!U@5>N-;z+kx0X^DT*j2Dyfo7L{Us!QYCkR=%P5gV7Q<|_JW%dV>n_d(&$9% zfRl_ginGsGI{8(NI*N%f8b+ETkYZwtD!D`>#l#y`a<5Y^ht3V{RVhj-CiRJd~v*)JF-lD&V+8ZKGnTVj`%9VRO+`qoF5pwt2YV;yY0aCOXmhTs~nZ z&JwsW@j1h=DSjsp3F{P7Le71zW4c7gT=oWjIIcSi4;zL}b4Dw0T{+;7e6;YeUPLI? z!r@`5|}JJ>_Wj*^0#XbeEjHM?o^i}0WZ=LuefX&gAN^w zks>|!$s{DYW5UrrqkXAH_siAM9g4)lnR8K~mq*fUTT710inEIr1;H5BRf^CWCcjZr z+@d11V!7j%T`ClmqR#WfjDi?)HF7z3MNUp~`OQN`*i2QAcFb=NT3EW;u>cY9$ zSc%zK;Rc$pN0YK(84UVol+;|!+Z{uE)U}aMK^IbnIe6dMHcB}L0;r) zOC=B4azS2%7h&zQATJ9G8Vd5ti^h3$7o`dDsYG|_c1VL1LK3iR4Ke|)a7942o+*69 zNBKOLD~*U|`?pxHAo;&L*6UMIICZ>eKNL?LRTdfH6X5qSBpouH5A{Pksw}dj$|8;| zV_t!BQBUM=!)<_h5d1o z8KH7qV>uiis0dN+rd4?0RLYBONlv@jla#^(r!;kZQRXutXU1qPN-*J5g2LDbV7&sP zG63{*2-|9~uxpMB5B!S<;;ADs*IjYHhQFPc&RBFDlV2A$*{N%E=CVN7BJNO3T4whj zMwrfvBsu5t^OwHBl}}s{suEZ5_``FzY08qCWBPJ|94Xx%bS+Q2fn~@3?q#GuALve) zRN+|`!<%xI%bM-M<@UkVZu!d%1Y`$0EcR9rD+(AjNI$wAQ`#UQoZN z@tuT1?-@B8AmM39s z;x2G2CcT0`jn_=?-xT@_;JV8Cm01aCZ=znm4?CHD z3R7Zn?HWGMi3GV+7^k&ZT(aFg;@u{W$W0gI4d#tzjd^yCOc#^g1#L2` zG<^mnc@-_YgOiJvPio2%cC-|dWWNkR@JWM*kl>_doEk{DbD9g#$9y%<1eRp17#t13&_&G`s>yaM&~(QY73_(+(e5 z7yagBAbeMJLY$03`0v!bJlRT}tA}fBF|SRxP$Y2Rf4A<&u>ZCb>{iX z1b+#huSmF^fG6&9OGWDIpBki|v;bdX`|Rt2hxvqf5S|Yu_y+OBv2Uq(dEHkTFH3Bn zh!^niK!OJd&-)WB55O8^nJ_HWZ)kO zjF%?3nDX40WEb+dJHcs$=UoYL7(DMx@B!v|M}qq?Pr0(C^*x=303IX4b{;3G>25!P zrYo7*6OQKWcpb^%HA;Dl2+GNpV9n*>94fK59-yoz6}7mqC~OJmE;ow;*S6R4D)I#c z5m$8Wo0IJC^?XT!D=yDl6a4Uaep7-+AJ1=0vUltG4GG?LJn@n%4dCKs)4|1yrgDQP zC1nmSjbc8ie&Z}>Byd1CN)km))(aEd5P7~JAs&b4O$lDdJa0_!N#=P&f(s_kuS;;- zO^EpAd2Nz?yWaOCc+m6Qon#-=`>q5xO`gw9 zaJc9BoCKe0o;wqQb9iP6E{Qy^NpM)?d3A!vG|#INoG5u-nGiI}^NIx5E1s7pcy;r{ z)1x$`CxzjgmV{x4*_-U*D?{>40Q7&(Jo|kid0T=nEYC}l?DzD3agy!eaZ!?8%;Ul& zyPU@bNp=a3tqGpDJhvox%JMuvA!L~6<^+d(p64amKkNP6gdkF$=Oo$N_1u&Y|G;x& zl5OX4c0!Z{&$AMo>UeT!ryu8&(^H_Bq-TNy!j*=m`{BC)$sD@Uj*Iygdkd;>k^{Z zd9E#p=A`wo?Mp-6mjuR|giA4au1>JC^IVk>0?cz|f+XfSmk|BJb45ao63^ucaq~Rw zFwkP`7cZ{1EM8o(r9i{835PxKv@=8t08VNOY+f4vep_I)6E2SANfg&odHuOd0_UsT zJl0pR&?>NSrNQI&jqQLW8dNqvnkc-5%KIugF^7tWz3NO)PBWvz`~GtnX)+Q5OYWZbWFcB8gB$I=I?ePK3Bn`L_>MoaAYqRF$t z1;+4FmD+bGo61W7P4DWk_`|<7Je0AVA&mnB|LfS%0R**dN(W2Uvsc{Exe?tA|B0K3 zkg9776It3a<9oIhgc8?RqN7Q`J!_HR9xZ`O8gTi47~H2Bf+GWb9Z~y7p4sLf9W?)_ znt$|}ZT>Zb=3k@cUo+f%MtrclfT|F2lTg8#i=={A4WM|Hpm^0V6zo5{lYZS!GSU&usJagXZVe{QNW9{6mB0A5!xVJ+sXp9yEVg%^!Ydn?E#Y{*anK zRB673HO{0X{xF%7jyp{{$`wWjG1%5LM~H7m*srV#dw=?c-$T!qGnol|UgT`*Epjs7 zKj_l^>eBtk>C!c>OPO`)0=m@ByVTY-kG*7Plgkv_$J~+Y96yd5*tr$6?j#~0U1T2) z4*EbC_^!^uN&BE-Y36-sn)}>T*2F)e>APTuzMrE@2PYodb51<8iyhO`7Kx902l%*G z__()%k42KyVw=Bb(EL4W{+>$nwXE)D$*XVZ43X4EhC^2eXqIGKAb;?_NLWu@B&uFI zfc2$<^`*nGX3K!$&P7A9evwezJ%HkFL2>sm6pKZ|Vw=Bf(EMF${;p@X`8x;A->K&B z9Bv-JR2{Jp&G(zTI%hC7BQD{6a%c2JKRM=ZW!RD?JJUBF%Yr?fEvYV7nCWa#G%=E#i&y5BzU2Z=8D& zKG{pMjW9%(g1tfIJylNlA%41fp|f3~bWkW&q0|bo3uHB|a)nMG6gpjnh{dBOj!v*b zYh0nz28B*jq0_7oCn;E=o-1_fpwOu*bgC87Nd*GD?+UFS6k4xB>#Y#y1L(+DIJ^0( zZpDQkU)2lDSJiu}hArR zXq6TEI$vm$E3|S@Xr&6Rv_eGdTXW~QLUV&cb1F1vg$UlaLMvUN6@x-6RA_}2B9`9@ zt#gHz4+i-g4+^zasBMLG zXn@A##gs;Y;{}%Bj^zG9=eSVx=jl~x6)U)er$CfI&QM@(4FU?+q@8T>wR@+ zjIGW?$IUh#I^8V;?k-pex-)!r=Zvk+L&xn)9y$*EkX`Jeg`hjfS9ihK>O6Fq**tVy zc_Zj9SqQode04jE^MvA|OXN{(bhm@* zYI{4E8gzMeI!F#*+gkbi>zNPDCwE@$YR7^|WD4`B-r1#n5Ma`h$tZf-)r`m?nxxY& zY8Hn!Bf15;WKEXBhq<|E2CnXJc|sik&P(;7tIY^{S_IAM73%g`)HdxS6Z~?_^!{wd z*S2y<`}ehZ*q~<*+a?FwISawI($}{BIItNx8*G~$Z08$n=b;4WOU0}MO(C(a@9gBU z-c?FUsB7`WR{OH-p8bwj?CtDiyFNP?b22K^w6^kVy&00NBtp%0*FB*{)wv(H2WzAi z+@W==^|==RY49eBwTGaiyo2qtf?ln19mqEP$SKaU!-$h6}VP(Z7#n7 zpyGsPq|*0lVq4_wMK;E^+#kV_;q#eh=5`JRC zG{}rHxS){ByQCo6e!6Yj*jAt2Z)Xt_30p>LFejNv255zxous$eNWd9YDcUTn_t;DF z9W!U`(XNT&HEGA}4Xr8s#ft5vVUV8=hXfzWVGeF>I#5&WIznW4=c-+RW{QYMWpYoT z=%zG4`1FG;K9s?&H4a26hEnj?WFJ_WprAV368+@o;37GHZRL7<^1jDi$Xtp4j+ogAdTAV6Y9yt*5wS z?slt-!G`$s@hcI>qBt3)d`^e4Z1x&$9iCue;4BJTGWFsQx&l?U9@e@ ze>O?P1KkYLHcOtBhHeJYlsPND<%_Od_eVmF4BM5ty9raTS(pApgCm7S@L1I7e~c;x12ypd8hCIxt+Z-?=>wO*V+=dVaHzPR?*qiHmtC zq>~6wQm4~r0y#%p;)k*Y>g(AL9%Ll2w?z|zv2}Y-L6FCBhEhXC!*LwH^>@( zub9pmE2ATg?d2#lT16FMpIHTtwuagy$5%rOTsxv7wf&hL&r$%U&!XyQK{exOZ78QC zuZ*w%c|B~3Ds*Wf(^9C=-IqBXh!?n}|1h=WZxYj$;8o^MF%qa`7RZWbso-kv_$1;1 zDS{A8>$_RKnOzubf@y9@Mre zSC2G%V?sGdp?V?$E!3PETu8$&VH#wdfFwud{8Wh|pSwuP`Ec5KLk&l2R7aTis-z!M zpvL?@EcxLg229$LNErZQB6yYzE;}9U0bg7&3%Vf3HscT}3EnsG5Qo@k(|i`T;CRIj zQeq+&#hE$=ajqD|8eeQDsMxxII{;*aC)Q2XvwU zl&#BAY0bJXg~QQ`CXI%(f{0W?96+eBs-7f9WBP8|rJw~50bsWUguqw3k|7&{WID+H z^@~CGN0DtL|G_6WN1?mYw|k%;qGtq~qHd21oRw(F?TpBQ?=ixJWj(LE?%^YZ{RC%R$Cw=ypWUPVC{pF&rh!ngTi(SDSz}_r7MD`5au_)mX$*||8imBwM(YNz?<3-b?`N!! zY!K=DX0?yzGBW66oMNwi)!R2VPznLDn%&zyOB)v{fBq(Ik^yV&lIs>1!&0Nf~iWDOowj2Iryg+~wtH;A5TOhEi1HU)?E2 z8ktBXm{-A;@SAS{+u(aY;nlVmA!%*9(~+ITWhH6%7U6-C7lyay=H+G8K(`nuZ4S;YXrGGy{9`mTGI>2?-aDMJ=Zkl3yDVz&&1f;Oav-piW%FZJ)fPAwtxz5o z3j(pLf_Y6$Q;hV3pHr{>QW!^^R<=qC{hwpcFk&1~*4IMH4rsHvl69`@XfD-eW`awy zE8~kV+Hqd}+^Du$6a~W-gO-uQv1-{|<}6Q}Js2JA&YCP_FvKi5B^>cXf+cav7-~=& z+hgtA)>%{V13ImhV}d`A+;~%PlNKPP^b=gb)PB5AHU~E%>elY*oK8d2v>=mdn}4i9 z*)L;$@o$!YEHZmt{w?EQ#J}bITfx6MqI-eXRB%lkC(2BWxub1GI3YKJa~w0pWlk+R zAl-SYyN8z94%^i^kIT9OVm6EFR*-U)%oY{nkx)6>S%^@lFk0AZm9^2fh;WRZ;r8fe zYmEIgE5dQ>v*}E>9x;o_YICr)&!OCV*xsL!ABX>`zbw0Ze{W?vYYb1jf8yiI<>pXx z1`N7cb0%tJYRz|8W-Et;HYpeRq@&-ry3mvY0P8%q=K4>AxuObz2p>ySnpJst)y)0Pv6Y4>$doh$~h5+qcrpvT9Stp=T zA6=An=X*G{YzZ#ttxCICO|3fCSEjYy zHYV0f?S~TmIH01{1r=#`!!)fP4mlYH-qLC16Ht*pDj|1Dw9`vh$dzUVx?67!LXO~W z9HPI!zuXhfbQZ~MxLoXiCSC4n1P>j};(yk#sY?71^bTF%bfl59%2~#{_1e`;6ej0x zRF0f%+=qP8Uncq#t96s0Kdbi^GQ)%!r&6}|;()@up6}z7!{0WlMq8G2a)o%-|0+G%MV54E-rix~)T-tC!t<`ax1g&a#ZI_6l)CP>uyQ~;q4YZq#Go;Mu4E>9l z09sEC0AP9W?TVP$U7ai0-T%kWefkp(9ZX3n?f8h1Amh61ru9v5ucBWJ>S`WXZdRtt zY`?q1ez*3T#5@x=`o$pU__vaf+yb0A146(GY)6Zlm{Y^xkmCk(L5}8UGZTG6Yp85uL*V^K`Yfg|STa0heSh_ww?Db}JLPzRT| zi>KC^oE!(w5*RA)xEZ!)Ueb=^X7IL&xEaoFWlAt+jpmpx6Bk;BVr52E>7@qYG`kZ+ zKoK0qszsm97v5MDb@P zElQ)5RrMtA*kL$|RaGuU8TqB4fNN)T?e2bU9bCT4yeH9R;=)qb;TEIc98B9*hwSC$4yNSMnozQY#+ zxV()!9P0oMNfMJbd&D&4!Nl?!qJRWjd;wKOA`L27Eo?YgC0f=g27NiD`!z(0B+UNZ zohgN6=QNA77tJmo7LmCkBQ-|V4g~#jZ7R*d*D>8OjHVW7OTtDC4d*0AZTV9)YRG?4 z%9v4`cB`Kiol|tgf?!6Z;n8N8SRt3EVd`V$H0XzXM;$Yxn5a+OZyfcp2wKw2rdlI4 z%)X_5n7zPk4+H9x5AO;DDhDof$|Gw7Vx-{*+jfg;ctya|9O=Ns_n4yND9AX6xvWWT9lgSpnUayCJ=OXcC#~uyP%{)gu=zxsYQ5ZQGNfoqN;i^ZWU~a5(y$fOFB`)6vH`|TWa;+GMIn9ot18~@*O_#gq2A`b z90OVYAs$SN--=oi^j7+Tka~h5h%biu*?8bn2fUNeU^-o9!W+MlbVVV?<%c_?U0##W z{O^}0-QAE6{OLxH&V`2|^f$4uX>G6ZDv{cEYLePj;TLMnfkv|>xC!!hx{tXix({!* zSqm|*7wUPgQKyjThYfOv@&VMW@XAC!Q%1S1ofeJq@>f-qYqGL2Cr+FH)p9bRi_6mv z+;*n75;BJC?q=g=PSz-1^JS&XwkV3y-kiE%8Vc%w-pq#x6iD+zy0Z$jj^$I)X0Mxy zrf9Heb8AE2KVLE9VKdWD=a$tmZPOVGvyd}o)4B5T6eBS;n9&+w(E|1bhCoWcC}7oC z3Mh>~i!+%&R>G?2P?u#(!%vQ z=hxsys}_p81(%YxILzfNGS(|!1NFe5kS>5G8A{}ufQJx;W>FzQB&LCnP@x}gG&%`U zwJNyBbYae5QWsXLSHlXAbpcv%B4-g@SgBg)ME-dfsNB?H(;Jv`0&11bCw{5Unbm_i zGc+xce$cDff%vpdPbQ{Zpftf5b{l@PIi+Owx<$h5T?&PQ}!Ejp*i8uP8QD{XV%gK7GRqMBCgp-gcW*aPtKP668kp8(@?;zt z8EancN>?71dgoZbC{T+Z8v{sZQ|~HoQ>_za@dvTGR9qkUqtmb+9$9a(l6uk zW;+zKlfBS{dvVtiS2~0#GsOA3iHJ4@I6v52vpos39JnnB^R;2%TJ!1jVF?+esYp?a zXjvd-eJraE5%022$}*W-B?FFuqrKQJlNjIfN)tD>-oqp)-I-;d<7_2mUWP7PnV?-V ztX~Uj8kUQ!D@B_OJlduF8pH}TOrDX!Wkf!(gq!s{D8AgrM;Dv0F%<8|^wE99z2KJ6 zl?B8P4vSr^CZPJbL&0f!H1;glK}9fSLNXI~TY+aoYv$=OWRVOOXvahAv_mTv9go)O zGFp==S~YKm(Aw?|h!g{eh*Xl@#BYU2rDtHLE{OD5zJ!}gmudMa7L1NR8If`Fzia)?izCzk2n->!Lz~UU4xqnfv6q;TJvu~zUElU^u$bD;^?jjh>vX&d@sR*0B zOnd|{VB#}}i-cwU3a{nrcfERpixqY-VV^QUUM-unz>w#LU*EerO|*BVwO}Yj+n8aY z(Z{DbN@v)v!2&hRvsR|7OZ;I4FtG_>s`d%X8FVsJvIQ78dliO!D5n68rNSPwSOMC= zVg+zuR5RK3EATlOf|BtkM-(CRt7@0drIE3ohh~juVL&Uk%`ErvEde*aY^AXmA@Cgrp^MkX~wy0$@0r{UXcFDDA2q}JFNp6`?wfZi=C zl_d_vja7vM(pD-sR-jz9r)(+4%EjKDy-*7U(;sevd~^9);Qr>`ipaT&NX;W@#Gy{I zCYI9)&3uyW4qY>5-oGW|af>KJrj9V`K@uzmiJ1ros=mM;HC|R}pco*)u&HZ?6OEdd z1~fyyNfFT&2q;uy4ZPf5jKG1Y1fySQ2}WD}lnvZeHvrLSB1~8IPGzsK#)<_`<^~6B zLdaV08%TBwSP34C&@Ag$=7q7&+Gq7PE;}-p$%LAFZ5T>h4yCODN;Tz<3$YtYuQxl3 z>kxW0sPe{^gkb91ej1!op4qK@XVv;9><~<36zw!d-4i**$ZinZHq#_X;u6MA&XzPQ z{g&MfX^gw5mq9-|kP<0?oMQ{4Kb>-q+}U7>9Xnal^uCU*YIf|%)dI$EtFnm{(I8gF zvna$1`)fF;xlKFS7+DVFMa``3OC$T1X_H(#gs6Jvp)D|al&7)%%wmA%90%#XbP_%s zfFTnAT4$0j2x~C3A>^o^rgUN=1cs+IU;DAWxcXU~A=9^5DT^V{2YF;tJO~4f<+E}< zzxl`{duO@g)-x^^iBHMc0+iSC%oi|Rio|;7W@kdW5nqKmJmyqKT8@ZpQ`S6cSX4PF z1(kX!g#lA?N!v|Y%&8l4{L0b5B+z_Ws@a(4BrmDeOvPqBHi8#*u7b-qk}h{%B4WA0 zmLK3Auug3zF9dhw;MU&9ao}bL$E`t6a-I+1#x&~ybX$NO|W0+mfD>(5r0}` zN~~F8Bt`s6D|g-ZL~oY=AYEBq5v(lhuq&!70(saBtq6D@(P7(taVMuxkrJt*BWbbk z?EQwhudcaYeJHe7(lbtjExdxV)`+&sE(Mzt3wiNKTlJ0svL#%Qdo;PF5fKf+>5Q2v zuFfps$~$o&ZeH0HQRK~66Ga|9;?l6Nh0PY~)YwIQPADiTECV*$Wa*OHU@7I9ctu(F zvAgD$WkFczFS!H7a#C(TMQ#&rc&15tr!*8otrjW{6CR?WwZ)BYZE-WdAvWvB`rek` zy(E`@C-WQ{P%}Q7JxgpJrF7uRWc$9>a*0l~h%s8g%r35EzsoJl(^2ue)O=OR=2G`! zy1YVy7HI$%BV2S?fmXMw%ke2~vxeGLAKfcf`5pTU{qSNG16qi5R69O&n#Z8aE0V(1 zP>*LZZfbvFr9^IIFWK!{1I#*`qi7h7N0E}##V~Thm61TPoI4rBkNXCNr+LUZG&Zh- z@lQh~V$sWhx;E1cqPSLXG%?-DaS2WE#q57s=xa{E{Zj=nR(2z3)SuPXfjxv~DloOr zLUeEE7A)B4J~fu5dS6Ee(S69ZLy|O$*Q20Beau}irUWl|F5tW16d%-Doo??Tco7ho zH`1aYc=1>W$h8BXh9G#+cnCOe-$U^AKw$QZMM3bQu@I1JhgS_j@b%*%;06Fe0FrLT zH^IV=3kcQ=>-i=JqhOPTwL`^*Ab8<;2)LZVP{5xj^o&&N?U2in(ypcsk&s3J<}JKwzhFEDC~~ z#zH`@9XdBei8qdiKo@za+?*DFKBZ%hT%I<~m0G2p1D~2JQsTa@oQ(G_wOWfRBRq~T zqx;SRz-HvlsZgo_e<*l=I)`>EGwi9xTT}{#&9PgFG%o`jFPD+EkOrK%C!Q>AwJIpi zazA02wV$@j<+f}(E^67`Z?9v8P*3OJ{3&T&_e}>bRvOmK(+qB@Qp*N0jhG_o1InSA+uvFtt@*dvrUpWkST6vRFQ- z%X>PBNz)4a;@XvR(;D4sKgX1t8r@Q8rDMvqwA`%LCm~m9*KQB0lpA$)9@~VOdn=!g z1I2l8S5Pnplz7}CZcMo`@h1@3NI@H96X53dQ4FukN+U%%Y4GJ_jv5X`q&)3(+tNW zme#{7cJ(5DmJ;PBgxhEGZ)O`)ubjbj`K~lNO#i6?_Z64d1|`a~ZD35R&P3*YMPdS( z$|ka@s)>wnkrSK9C?iu^z`x~~%XoD3-;Dli=|65B!$_~4h1>u#2so1&Ww5V`+FsdL zMJ?p_2~1V&XW07PB3`wmc1qcD^Nw^&Y-jxxe`Eo#jU{>OVzlYnRwbS}TY?$wiP>%o zdxV>VHfAf^xU6Lz+eAZ=lQj7LBe~U#sxiVWAiKD@yEJ902ph|CbLYYzp9plzb=+eU$dQfvxLATHdt!4!n!H<}%l*q)Ev z)ktujho-0B*H|*frnI~%0x--r2OQ3XzQToFxF{0aWQ~zfUAJF09#;JLMbR?+kHETQ zbAJKrz}!E8RaV0;x&nK(px0c-AWYGxCTi6T*a1MpBfVjx=GlVr8N48wPtNm(-oV#$ z64Az9KD|M)XuxyslvS%^%S<`%%jD*lUZCerl`Weym3S)u#9MPm|4716`elAOif%nZIELjT;%u9=t68gyO3sq)3kQ3gEUXFbju<#vSfoK+Kab~f! zUbFKe4VX5>J!_5-ed_JNNI&>3ZXP}gzaxB<#&GNK zY*PEkN53^DrUqnirY z%4%g0>H7)=pqYb-_Dd0?^z?WEXawuJ0JJHur2>H0$P8DZsNz}f&nXRW!AZ++U7Qj? z&4L_mx#MvDwBi^cT~<6tyfq`L9NC+dVP;f=)PcDJ4N}J+l#f2hr`rS?q*NU303rMq z`s*fvg=ZqdP2n;fQUj=Ijatc7ROZ-aZbhs;HOrZUq&5c%Q{jQPgYr3XPLGnHN6g(gO}Txc*w@7C6M;8yw<$q2mR4 zp)=FzjKiVWRL*WArF>Cr%;?e%hdBR$LmDgNPypy>;jpH)gbVRyedK7scJhX4U_AV% zJNR`@6VL(wtfPSe{0f&d_)nvRC_wPfI{2k+4Z-h=8VwM*AR0I!{5F7drS%R%X^5v5 z1G<}VMmcoYY9l4h1u>>qD^1||E^UhC*zgj=D}vCN6v1)M;;SG4Qv}=2-&CVaRiUz- z&=#+iM-lI4IwG7}PCrnk{7X>Pl2Ln%59PLSIt6?~bQU{KBh-@zVQcX>S!1-qaS-5p z#G*6Ok~4D|Ntl(yRC;UDBDfaSCW6IWV=P8ND9O1LfDbF6-gRc+{ypS6v#P3qO7XO% zeZsZk)cPzJUM}EjpeGM$oDyFAlYoo(r%0F;TsB`wnt>KNe3S$md?zbubd@Q6S%WnbaOv$gETn9p z+%=BjLT-AUW7dv7SjcwF-2=-+U@?9spJ+n2JH76SqdHtBp3k}uDT*Zr+kJ}!962Y& z6yJgLS}y6e&MCSb3?D>q!nr!)T;vvz)*ZZ24h8Lz{Fl`tBFA z5DF~4N=If9V_X9mPh2OJH7sl%X_T+S9cmz^vVm4m7X-rKObe75$GtfJz$@n<$HD-_ zDJN|ot~Fs~l@9?La4ihOgUG6Om1}8%IiggO7x8ZfR~BgDS}oRzHP`H0yod?WCMh@D zjOo~iVq3&oNZI4!AKR+QDa%CPvwln@Fof^i2vdv+c^a=mxR|mvwA|DPR4rSa76C6G zSC*rki>)6@*;J$c6{1|BO5@>IA)tC#zH^&Fn8M5p0~4}hFjHF9nWDZFGo@^jSyRx_ zVA-XWJX3ISbfk|QDYRJ%Zakha%q7g=S&~_piX}4gO5A3%)?xB!aOQol8REC;cu{r> zf%0NVwk)f;ND%p0xg$VuNvyG4*9^gSo*g#3KYQlcAxp`}I3MD*DN#OHCpmN=g}NqsZ41ZKKXa$F$SOYJxJh9U){7@4V{gY$ zXisT?r*SD@s!gRjWQx?pPT<3%>A8RJ>O%2Vq5`2CW|J1UgKY;$!TtPS+NY~qP zEZ8Gb%jwY>yD;ep?Wh7QEVKx-0E~^fDxjrFp$d>IQ;^xRx+dQlt+R!nVO2nj7%A17 zN7{ND0XzroEI{KNMcL*S1S>3ob@o`W$kkeY7%T;ai~&oBUI{F%a!0^&Kb6m=D+YFb z4)U23fXvFTz~otDK_*wLk71C{91pT$-L%&-ZTq+`B}Krcu*pf$Vj$23W^zR4IwCT~TwHA@56#=K3O+a_*Py9gdsH2H}?bAXHk zb-4poq{DO^1$9pc+f>b13@34HWVJ7oC0-KwSW0ysGD|EpHN1_-rbeM94^54-mRwAY zwc`ggU*DTK*kc4O`J^$z>b)$%iox8?;U=t;8|hkvlr-Z87AMHYv}A7D)0LyA=pZl` zxtVL0ke0M!tw;(v=+94E4NEiqvb3-_R-dnO#B`nAPdjU+#lGM9rcL~&-NJukNo%&i zl2z#%Zm?~yVu9?I^eC)Bt|(*f(Spk@rUuPuQ>@gCVu;AGX4E9Vm7Agd)Rz1(=)Ak$ zjxlRk0!2blPaPewd$t=6gUAllGZHMnYWO>GeEd9N`J;{}t41vitL#Lx^623SO5C3f z%NSpiRii#6t47^BR@sJKrB+d0B@3m#l9deiMtirW2)IMj^09bIhJ1~kt*4W>bpm(E zCURVzX_eEN2CEB>dl~3Vs|%f}!C4z@7D)#*oyn9z{bz0vri+^|gtX=Ynm5gM@Us~aPJC&w@8d(HZftQo=C74ohnSx)n?d<#PPo%TiiuIi{yxmH= zKuh76GSov{DT?47m$cpum4Q%oE~*Q6=Vq-#Qmhn=kD`S^hJ(vIf?PQphM@|W%_`%^ zN6FDf(CT%l<$|cz`J_3jjW^0XX;`g2HCQ!t79`}yQ|PoK1s%36B+fT$d*IxcItJC+ z(;e+0x(a8V7CkiZeL3sF#^O|;0WE1|>1fF_Z8h$NgAKKl%PlGXw!ox%-v>o!jRHZd z9Rs51X;DhE!FNzmTt-<#!-zbPX(S(_kq!(9d!z%v?EDqwXjuVN%dJsBkyNFbujFVM zWQzo34v;Otls-bXNRmV`29?l&)MlJnM}tIsxD0 zDo@4eE@))oHWqODMAT69c9K$_qd|k}2pNI>H zS_z_2Q438-3(ZMnWG;U#iQ2*>IfOhfMm_4BL^bwaqE;^{heho)a{y6`8qSsP9zi9E zI@AbkQ_{ybGF}kDHp_x&1l3ec&WMPQB zsMUy$idvktobI|n2ToGdju)e7xe`ns%#)K*&pJ^%ks$h-CjIf!4<)Tx;-gQMsMWQ% zV?`~Npi$26sFssxoYxU6-l(rj+wDXQ?i?x(w$w$)@Ia@Uah6S?2Po6*4<)n20%x-7 zgh7f+GnP-Ou~a#xcy9yV6=bhzQT7uo9$^bGhaZ=C}&FQiTtE=2xo~J!+KjX?j zm!R>a`K-jGuCE;FS_$^27?a_+=JGrZ`xs2-GBx?TcyOO9*FTXz6mvm_PK#r(YF!&TP_QA={;W$p&^!zv0iShVbgPX<-9sr}5ag zXKxQM8|sXXl-tWmQF*&x+)LlRm}-rVwZkY_%&x5)T-Bf>0~gFwvxAp)Rs#nwM;w@Y z4aP|W7>n#4;E77dTnApOI*1JXf8gx&B znBN>2$-j0gcj)EHasEsLnW93OqWooAA(v^n6DL|zGt-HJtqcrfD4hXAnH85C%V{j% z>AiO2Suij$g#tOqO-yZ)UhiGFHp+O#Kwo;rz!&$tpv35UA=?q?0+B6pJ%_d#;klsj zWrY;qXr2{CAEv3_bIaq`k6mJ+`sw@l5z$dH)-HC5O1rwSw`iBNXWp&x+0F6UjdHe) zfJ2TS0jpn^%$odh=Tt#LEx9{FZXlT7AF#Keo)?bxp6IKJyl$Ku^~GG|CwpVt7T5cxUM#i(zDJH%Ao z{I>fIvFdSwcUosp0q&-|zc7>5?7m5*%hXI*MKO(-^?mL|RqF%Nu;JkgBLt55cg)J4 z|ER)V|5Q1yI?5-rALRmk^EWO5?Ps$AZB?HX7+wHq&(5PsxXIIku7tAW4etq?4enlD zZnqJKk51{<%YQyvJJ64G2P@D?$0@GfrYp>H7gUh_wXP76cVU$M!yrk{dUEXC#9LH& zTXZXrKRkC^bUS)Z#LlK-43%0#>K^@el&CHqI9Xh#V4^P{HEyyo;s?~Lz_k)+!x&}D zb|b+ZTWE@B)L1@qe`)fF^AzE**S(?($pxpE+YPs6P*7`fqfBz0j_Mo#mkq3T(5%&? z)>I>jr?q=!$VkI3`W4C?D7lsERC(MY2LVNSgDWTKjZpOFB8OV-=M27neo?TmJpr^s z_aRQHXiprt>uL^t&AV}EwV_nmIwRE5X}0L?ItXrHY|2wWwGDDPki#6rTl-t_Aw5IKs`YTwPMjzEN30E?q* zpcV)1Ut0or|5gd%O8-M-Ij{p$imLxjF`=lhMJ> z0hILUB{g0;D=yehfZ6 zhbl<4Jg;&D?C$giP-+$x^NPWCBnr50)R}1uk!W7s9wIl3W<7~Aw?v{z8^@(FP);`L z>jqGs{HPCRKW=;r&3=N9U;(gS&HlPhoEihP^-)(DdX`n5P&qDiVP`S>nHFPE%XR4v zwcz-~sAVg}&GpiRGH7QM5V#PO3-G7`l$Q^n^aP*>!;gGd_!d$}Ojbby#!z!!igTNv zL+nlnuo7D`&p`2iE{kYiRsjxvjL_;MeGGke?5A#t;Z;9ba8iyq2Sv0gx^;VO zZqG=CsN<roEl>*+#aAy}E+O z@`ychr6ei-j{StqG|<4sO;_+*s2;MqfgNTB2{+wqm}@l^LgXQyaAfK`?z}&jd*IX9 zD`pNJBGS@?Ym`xDh_^6ZKtuxl3X7bdi!kxjAV+y!tjr{d1gGx-O-P)zY0HgpqeDuWyd1-Shi%1_*Z4w2J z*^GKvJn=u&8SZ7phO!I^iF%t5Sh5$lW)Iay-RsBHb)>JG$n#!nz8pwH9aT?lsINNt z<Tu{YSwJ={*hHi(0p31Ywxs6m0 zPh~una>_SwVh9zxs}4Vyg8KPF8|uOZuC?sO@5fDk&Z&@*9gzfQlTVk}+s5enJ$M{j ze)sF#i6WsK5^W`ws`rkr{DJgnb$UlR)Y$$*DNWXTvTSW-Y*2+vmCTSE0$58bz9N+t z%PiHdg_RpAtpa2!rg_nbcvqV<>b3s^;$RC}wQ}E^1$Zh}jSq~dh#s>KTt7KU2e)XP zp?#6nrrM{g(DGMO_iBCwjs8bduJLCa%yJW06m_@!GJM^uXcmssy;{x7KFP7Jy)cIG z%}Zf&OPk^m`ZaMVKDDC-i0(#++iki$tmD`Aw40p|l?{}29#WO%1S09h)^=`2H>)(- zf>x&5q4E|Zxhb9`Xk|-vZvL3W&ZS!p#C;(v1*b7y8U}4$YF>H9bS=J2))ffQf?YVq zL$WSRSBuLb93;xajOm6!#N0S##njD;6k-~uD_v@i6SZARw^1s!BAsU8>i}T1ryLm& z3T{KE>7}964hTb;9bspKcP0xP+eucln_ifxJz#drK^#!+{x!u(90v1=U2ERpT64Mo zD2ziRWxO`f6JAU8EOHQ65qCE*cs$v9A+g&GYL&u#E)#EtCuMt+zKIEq2-ySCchcP0 z-0_o5Z*#?4dAf}=Wt_;4@#mN?m~Ez?SZ8pTf%OoUAR1FAo~<TGJC z!^9u`>u%|G1CDfSA>63Q?Vh2sYG!kBwm6)Qx{3K`E>k?4NILOlzXSyF zJ+T}n$#{pcDfnb1a}XKkr5W==nLfPXZ01=yEX+`0)8_tuQ)*nsU8jZzcSM8XhY#ZJ z4MK+5n<8+4-X{%)2HO{C_Uigx!;#t*8Xa%2QNNaqrH#6~Uu9q<95eC^xwq4psX=5Q zn*u~&Hwz0~!YxhGC%T}Kn`hBBi4Ty5W24@0O6#s`G-q_3j+7e=ipD`K06}^%i~|LO z1Bi0&6dQL+#GSxm13bd;P}OIi?62FIK9R0_oX|Pc@AIT%%feA-$$MVXMw{jc5o3)r z90x5a*L1AWE?NQCW=Ol{xExHTh_jB*!4_eOEzhlcz>4$)J)9Xf`zte>F%QL9<=tQC z+rc-X5OeC(KwD-C2DfYvv`>ZTh_XNPd);CH`T7frLD!U4yfHPcIMs~M0WCQnMl)s# zdX|h5>yoUwxME1)^q`3BFL|Egf0`n$k!n{nL9Hy;5_xkZYqtDvLC4&PqUl{r*X`u~ z(W4JOmd;%g1sbmvP9?#uogds?Q0Y4iRoywJcp{_KcJmby?*RxGZ~9rr{+#IDKOq z4}2rGs~^^zfpNZ5B3NKFuFj$KqRW|dMMWz|0=c1shN(;Ey|S2rlnokN&X%f^e#QW! z60_XY-DRh`RncHdme#SMJ}k{g4}ncfmQldduWJ^{7xw7US06&XL@Ry7>~K=w?Q=Un z!>vjBcH@^Pl@*>uxMkkqZ31OZ>}Cu#h*TUJyO)^~1k%Xs*L$3MWcyS7q?f9MBTfN6 z)9Y!XAVt_|{fF#gy4gtSd~7Yax^=wAVvS%07JI3{bcM6gE(B z(U;dC*G?xpCA-I()t#)F9X)cGv*&cq)BgycPYo4xA+C-*WVS2Q3o7+8nOS@~L^D5i z^&$ZG`mB7ZHs!Vip_1;6X;Tzs4DZ?= zv4l)z4n~oQ&x8f5XAMl#ifOT8^eu%)Y{TY`$?|KNVF_2Q%=Atb2SJB60)u~wyLy!C zgcL`REpN~nQ2h>fGDpkt`y^en8N@fzQ}k%2YxSt7EA*HyQL>vD7*xQC7WS-4daGhD zMw|kGIYYa-Df)tro?&_zG3;R#>xnbW9wqP^K1dmQ$Z=$QJ7L=8^xvX1W*Cj^hgx9% zLoFv}cuMN%T|$UHJ7;SyA(#^Eo!JykXIwV(n^%*VE!7n@P0oM)$3 zJ4AMOn!(bU=@UUd+!2e*?HA>p2xknZrw-Kt?ugX>aOnA zxwl`{FLg_5b<28KeMm&5u#6Wtpjq(%8JHQ(j59;lVqkv%y}xtrx%KXr)KX?iTGi*A@1FBL z_P6)`_UqeUgxVw)gRCnaFEtY2b9y6RFjzZR8_7vrx8y+AFc<2hvnE$>9|gq7bbBg& zXX%o$8 ze|>ha_xCAD*HDu^hYdysb(?NEK+ZX zX{tM>TdSx9-f$L!DKL`KfVI1#C&5(2M8=G%Gdvs|HWa{M%SOp^ST&@2nM+E6gxOww zqUg44pYFDh`Y$XfyV1RD1(6#^OvSsxb(9W0ErvGu;GWjq^iB>(UoYw7aP)Ps?P3kGw{vsI_0eO1kf2(PsF7d9#5M^w5<9cT zlK@LBTq~XE{H!f%2-IIgy@k(1!-4cMY@*tjDBD=B8IzojLXoknlHpDCBmbNqY*|xS zw|2xZ!^O-h`m~rqLGQJhK}Gk9oemj8z?;kiDTfATu|TOY(tvHh5@G>4-L&-M4iT}T zyoele^qPm*VdIo+QaFcC6~uT9@Eg49s?M#v6J|%Dlr=?damRdFgG_u$wX!BLall?~ z4(`s_0#tm*58*rUHUk)18^#zj)8u1NZzkdw_11#j7d$Ig%2#1Babsi=w|0ln&TNr% z!fL zGYC`CLCxaAvg~cB!s36(m_>>}0SCcGJqh_SIZkVRFaw7`5Ilw$Hzd_z+@LOQWVJAJ zLjD&RIT7dt&$cT2b|X)-99ZJ&r1#gdhI(#AWS$G>5MmRQjH{p2uz^}mDx~;=@(R!P zU<8O7P6MAi_;2q1MCQc|ZOOGJpO-?KBZZ+sRF~4JUSdQCcV|HWHISBmFB$ zC|JBrH8mc|!fslRx$_ZhI5j5N)=FGftViAxuK_DqGTDFO(gQ z>a)2Ln{wJIr|g=RaO6vBDCf;J-H}PVbKyuV`&^R0&1hMi#U@gOz05=ko3^+DxNrzB{Uo?7BMGq}hP6a0=qi<5Nt=bp3Z)B0E#cld zQ}YYN06w-ogO{Y30-IQjTaOX}rCKUjPR)cJYZXOwLb%5wE)wEYBb`Gt?gV9V9~L_i zq#!h33Ho?qcn5O=Aqyf7vn1#S0oVf>YF31(8=g~prekKd7jeLnTx^o#Ajp0Q7A7e# z)?cxf>0FaiJbnO%j9hFk5*J(rl53WWV_#1eiwuIBAl9hJ#R;MS$?tB2C;-Sfo1!9o zXiD#hC2sUJBo6!iQE}A(0Su;L*|(?xGwoPlF>kuuK$LIIoa=nTiV#+c-q%q%D}zH0 z(&pE5ezJ37tD9uXPy_limO6T)pbl%Aa4*zvJ89BZlZ?tF=9wz;LN$$l~! z+N5dKmw<&aglo#;pi7PmMqq7`hMxBnG)#ZT-RT7{(n4Zp`qf`xSy=rAt;ef2fg|E6 ztf%rn;;Rab%$z?mfjDy(cU0JV%E1wYSinjwJi^?Yi$HArA5+}pOnhk)UXEYeR#fE+ z_DDTV713-2n!B+hBbrI}+6*o(*)>1U= zmDMvR*J?-ygjhA{i4~cy2bPPu3J_wh5~gI@Qv`^MaeYOeri(diU{uC7j``L;fqSv; zkBLeRqx*loU8-CGij(di^dECc65!wzhDgj75;FkkObba435Qpi9wCsaM39*U&x%(1t2GYv7F8W@n5=(E(OSn3i1p zV1ciY?%4N9L$Brli6F(6_8t^(>6hb+r}7a8`b1_^VCo5b0fZoH|6iH&ktHS6Iqh|t z(DYW<{w7lAi9+p?ja2|BmLhC$33Zsn*t^xRk<|9!ZmD^)jF#lZWnvPy{ zIg43fYb!3W0wk@5?wCL~(*Jj6V<_{!GCa!4kd$we1boSI{0inXTG3 zUDWD{0fGHXbbv*4Oc4N2m4QDSZQ(7HA-cxG`=l#L=2Iqjt2rZxF#NDKrpm<#pEZwZ zS4>-59?-UQ%Wk!D_NzzkwWg97rR@4-<3C%2^GwX}=@He4|-k^Q{D+``xyMY>VG* zC%M1Bmjy$$iI5VP-4etOsl`?xST#!3gf0K|>vlG*p;T3LHi)yPOx2@Gm5`(`E}0#2 zRRa?UjVu2#ux2Fu`Q21nHCW6gcL+0!<=+I6FxM+D|LdRYS0@(8jsr0kz5<2uLq4{2 zu!pDH$6w60AsPlZR0aLht;DHt#VDA=pk+X}R}QIJFow@eda zQCD2m26MJcwn{ly1A_-tn6>=e4YOVdpIKtvtjtAjc+P!E<-qRb$@|3RJF0}_eir?s zd)w4vOd_`cI5YHdk~N5~_u1-a`UBuG`&A{HVCcyF#=^jc4q>}=MgjrH#H7$XZPP~a z`xaK(EfyLWO6ZFDq{m#Fe+{O=ids#v`+vYoL~fh(Qg#Qg&2LxqAoBx!mp@ zGd|hw9XC0NwQ}%R1cYF%9-lP~w>uU18AtBwycI<`gsaJU`+98JStoYfk+q+Ac(I_MShULAx>^63x(!{5s=ZoDJ?p-tDC>6VRRR|rn zXym`FQ@0=~y#ZB$zvkBs5gkk1yM#|e4@LYU3awlh>2Mod!8GF$-!6!4Mi2L57}vGP zf1_h4p^!VuAO|Sgqp0!4KtnSAU<$XucQ~&3eXTBq362k~6SOnj@wN;dUANy?E@LF2 zQMu%r%wFpjN|>ynl4(JL*X;L|8G^m}@)Da!&vugqVHHdFT}+=c7`d^~_M3#D1(=;# zfs{LmH^p%9|v2@4{fOyfcc*>jS``2w)AI;Ued$Z&=%XbCkz z44h!*m2D-#hggu`Sb`;hZsp1r_p0Cl?f<79ca;3; zrK_%yE-D0gE!eW?2ey2 zJ$4yaCm9)1)e1H8FWY0#8VGaB(gk+lLCGoBbz;&Ph(UmkX_r^3U0#@K>15FdZ1b(l zS*l&>Y^x!5Q9ENXqxxPx;@pRO`6xvhvpsp_L&qP5=H8VjJM86SuMT_F6r2H(sxng% z?R^kMCrxP?CV!_8mU*$>u$ft&+e%7?a_R%s@TSQGMkXc`D7L4dDG0{O5>0vmbG(cn z1vX*Qhg!?0gaZM4xcrj6V>{8Gvs=nOVK?FvpVS?7P!rnxr^6Fho?f)Kp5;C?VlMNa z^5>6p5hg&Le7`^CwG+`#@WnD4&Scm+aie;iLADz_iSnlg(} z!4(sD@>e2%Tb5AtbDJHp9c|$Pk0!1C-nT~WPc~Be@cy{$hxaG5lyFJ@olF_P8oMyt z*J4sjPZs@Utb_#;f&oh-5@hB|KJ#Af)zP++I;XA(>0Ck1IA*qv&tYDB-+B;CBmc~1 zaYDA-nA?fh721Keqch0tBZhUc+q5sPX8rNhC_E}-YkRoJ>!DU_!`eE0IKk=Rf zOYvC#9!1gA0sMkFFOEEjU4))lh!ybpm+=LDAIm5G=R{A$EDLJZE_^-zDDNoB_KM;r z${!z6s6U5!D)9;(E?W*T;9dHLZvs)m-_V}8Q7FknwrBuICyNH~m=EBwC#?U^0o=s{ zK*Q7!Zt@{07t64hfKJ10iF-+NO zs)OKt1$oQhqAAhbfbY)Q;WgMRgx+F4la6RY8_k=L?&?d-UV%fHj|2<-(?mD$7hbNs zpqf#xpJv^BdYIg&{XMHutF`e&L9C+A8k+l%Vr`o?Tat`oQ>R$6EmtTuTMxlrUV~{I zU6X0dtim*2UKi8&n^F4{jd)Be_RCS3t#QZ}zyhKpnx46_Gw`S?1wARf+wVXgVnEz- zCTMX>$tnH#Ip$9$U7jD{B7RQv9d}3I-Y4zuB^hZI5oOvFCR^j-zhyBtcNhbYsodni z6Y>4_$#1eHIF3%ld#yY^cOuO&F?sR)ouPqX1T-6QfOJtcHREv~$;X2pf>(#M0tm!y;}# z9NLz#TtXR(5~>wM1#NrUE4;acY~2~fqF9N;X2iF|+y+HUInG_a*C%c>2{aHyB0)-2 zjzk{rSk9VW)_?~nFE^v~o#6Z9&3Y)S#^~*Pbl7*SMVRN2uo@pa-(bJ_i zlJ|4a@7FIG8dKZjOrPz*|b2R0#n=&_K9y5$Q5QfB$NmH%^eFlNzA{(vo#A|5YAYxsJ z&B$SNs(~+~F!f4xX-Nls?90gi77JzYGRT!ZhVm>kk1$)5_<_|HR@SRE#Nf^+adymBzzbzmbe$V>8cEjVzgK9d<P1dCQLAV{mxP_7n+x;7`c(XE0?9|2Pn-FQ8qO>PLgw;I zdcl=&-BI!hT}=h&hTD%eSqwhy_n+4Ni+bT%3G1rab#Ht6xCV9gTDlKgp$KRVTf>8T95GR&-5st3UU!FLu%6uBK@_%3sI%?kS5nw)8R z70&d9buHh2V{Ha;H6Gzjs2GcRlbnbviV?jbpYp}e7r9Y8!QYD7zgBZ8;+1tv5%)4j z6&b%`@da5P=SRaHh_w_Y zPM(N~Tj8xQ27&)(!>9P+6Y1PF$qgWsBnJunnDQ`aP*9V|uT_?0s_Z`?I@pDGdc=~i z?#~&UjJ=nj=zh$)h>$|*)I!ad($A)8S^ldz&L60}&Zftr@cH4_jNZM{=J0!1@^a&SQ-KiugJ1Mv$&i>fy0z%87s_df$(4M-jdqE^l6_8ZUE|FYuSVC^e3mCYUE2{$AM3;$%(0$c z9@KYBij}Kc=-xOI|6q!@PMTzfD@cbsqCuk6N?E|w+rUK29Vz!oI-4~w^U!;OfVhr( zS{nHwIi1Jz`V~C6yvvp6M*f2+#vQhx>XSO3Y(qa*`ey!-JdA41-eNuXhR^7LM5mO` zoUiC_b~4qZUX9&Fjg9ZgdQl;rTT4lr?x@6!9dama$ zrS8WDmQ4a7wchsOF!^VtjwxaXBLxuSO)P*PL7fNI(OpafJ)s$z=QnHTV=DTQ6k8ty z9drXU#`8~DQEy=|Sr+}Y70r)E4-{Zy&(} zz}{U-m?=#PWiRq?Gykpy-q)+-PuP?siuwX<(CIq4QZwuXog8_Dz->86Bjgt+f^vco@JZ13-IAdqZn5*CgC zh17#1Kp}zQ2v9Kh1)>--lBR&N*{3R9U=tt@Oqn>?C`@qpIZTX;G&SKZY;^fwByb48 zvK$j}WDHD%Q3NL90e^)VOPw4B##n%rag`}Gr_)p&G40`4*r*WYcZ3ZHk!UQCqcGH7 z+Z~EvsYMagR+kGV6qMXaQ70|hVX~86v;CFvctQ)ra|B*BMiz*%Bk{YSNLwGqw8chQ z{k2N8ga{ZViK$c>(|TE4p6vkg!)bF1c{jPXEdQp=qkq81P0eKMGG+d$) zwZ-x2tJ(kq9;LS!1RtSR_y*DLS+nH#?o5>RE8vbz4l}!y3 z%@xyv<;#ZKuxt?XJh&A4LnuXe<>? z%|8WyZ2xLHHwe}(BW{mP8xw|(YkK#<@|i$hS7%z{2bxJ3`$n=N8e?Y~fdP|dyNEX0 z6g7Q{+CDqPivt|Z4*1113FT~xhFloWy3KXKO?wB@!YEIJw61O%Q*9f5whH`g2K+QU z<<0O;z)TY#@E15{4w-3dh?xZN4ly&Pm%_}Lks4+ONogAdW*$h`fWb;kwZu!|WHDeH zTLmYFqb|5=$A%~{081Pbx`VC4%5{>F#@V6?1TK*lbS)GXrHBqeZC%wrezN`hA8-XU@^QP*}_pZA)Hv((E?@iU4?=O3^Dh}TeAJ9K2`?3}e z--vnoXxW>ejnjl9v5SCgmOMAvV9dO%_+OLVvE65u$Szg%0gFEW+X;^^%-5b7)WZ%@ zWDsrJ)(+9wBqvMHXA1~6A7oUlp7`lx0Kx*JfK|*Yv4^oV*k_GHIJ{*cEFs30Rav@G zn;4c5$Nq&RZb*$dYOy2vK2I*F7Ohn^DDf`JpZ(2<&|STN1eD~8vcR**wo^vQZ{J2h z_$xpA)Z-a4O(Xvbf}^3TjH9El?BzNwMp9@*|kc%?xwLiH!x<;v=q|J5)5?vV?G z9oGB2kENY@^u&b_Wzf(V(*0xAB`=t1oJeFCNgh zJ_dgur(`tJC&4eg@RTaF7mh9{PMI)?wnT&srx)^#a{d6})@54IX`R%L zcIM|3ga^fp(uxdiYML)}+{9SkB=8n>Z~QVzEaEIW932J!*++L~7GtuaPQhl`l-Y{F zf!~Uuu`!cqg1WYwb|dG@jNQp$3(@Uf>2@5^6Nqm>~~vLS{{dof6<$w#pu#tOs6R3qxzc6TYI_H)1y_@mg0 zO@H|w1%^PxmWk>sKT>Z4C1rP%#iTDWo#_HhR!}Hl(kft56gZIR`s5S&%MPT}fTUeB z1qeWmeEIn!6Ul1^f-%wDIzT|1>jZ&DUd#jbjtU&;Hct$D6b>LuQJ@^`pqE%q1wO^XY#{yU%Y1wDu)BdoxgruEMmfw72kDz)Wsgc0BwfcF&d{}t(u zMn4ce+Xn?QcnuXQ=@|E-vwE>WF_HR^)F$nzf?{PiidrX(9~8I&lzlat=`;CEe^}&% zW&(lDMN4QV4O|A3%(s*At5|{kgiVAK3xVX)ue4IxSIX=KaT_C2#U;nM4on&LOcq+} zTtUSJrZ0me%y%FItYD*TY|vIESeJZ-*D&B&PGj~{Irxs#nD;*?tT_xNkK3RB_IevR z_MWHG_os+5gA^$&&0oSm_Sh4HRK{lgpDX?_qzmSJpD53G_C%dodL(+Wepe)hdRRs+ z!$6T4FZQ?~K&1K4*(Nc5X0o&u(Y^JA{%Ylr!HO{`64nmu^B_z#jpRzeX{S*kB1hGiM=l zmz*qSkIkj(-stSZ$h)^%XP8M%-Qw2eUmt1R?8Zgw>YKGbrX*QorEHDFYi&CKj3mM)TL2*J z0)5AMJEhIKw~3t0js>l+MwkQIQ29Q&U{nO}`fd>cehi%?E9RueA@W;MgQF zC9Sm}J`@@EKE}c_mwbwCin_jtGNwcQS}ZZ+B2%SkN3oKdjV;)%tY_X410h4=9N|M8 zVp=e@PPeIy;fI{lYT$$_M|06{b+p;N4#nls{^-{`iu~0vN_zTCcw!$DPrn$Rv=3u{ z^mE~f+kdXx`Ja|?nse=yKtzYP7fm@7)znXpH1(sQ0&nVv!jm`k1L4V=dL}&4)L*to zoAO-cJAF_b3(7Vwb?(nbYWt&++Wufz+ZS~^|D$yLNh z9}u4;BnLbJal5I(m*o-RVm;x}ED+x$fY4wXwj_ooW6w*PFOL%QfTr9M?YA7r73&eu3*Qt}k)j&GmP< z?&10}*S%c7!WG*>{tDMQu3zQ4pX*h+c7W@%Tn}>n7}rBwzeM|ox&98m6J_%k^zszr^)U zu7ASyF0Oyh^=_^orXTlkeVXgrxqh7My~Yc4Vqz{2pfap=TwdU=Hh}Ie!Y{YiPU1cd ztEg7}lW;dXcB7+Tm;ay1t7B8skH%`CXY61^z!*QVCfQslBE#8rHPM;D92@Cdi|TCg zC%8mO+HBphv^)h83{Jby;?MN!jBh>J%I*ZMliPC3H#qBw1-IuLRJg;RcKWAm!_|on|HD>xF1;Q{Zv&VS`aXG97dAu%G)a5E$J!B z_PFzIueZC;+nw`v_j^wd~n;W?I61iJFF`*@<#~exXHMO4t-{9*S_}ZC8oH;()W(a~2J0 z@I6y(RH=AiHkI9Xxj&yN7o{rZXM_|&g6!;#%8&Zcf6-BUBcGMOP;P=%Bb#S87CXHi zk8A~I7~=|D^oA`3c@W$xoet}_b-JvTPO5iB&2UV%kRxm>zQLf&Ue<1hV>=ynV1(Kj zqY0H%RP4tp@XEJjr8%fV+!#dmS?pPwcKyJ#`+F8C^K5Dop5D5ea7zT0VU54Tz8Y4V z=QwIsOE@CiCpZL-+^+ejJ}bv=z4wnWQRhF`&OaaZen_`Ze=h2s)O0Yi%6N<^TC1Ah z?7plaF!gwe$pR-Z+)X>FY1+MQleDcbxjB@x@iT+oZ10Cz1P>!#8p0rLSyNeWR`X5| z)8{N*uqh_~v2kt%b-7R*L|RQXEln%recG0C-2NC=g+?2gdAjx9L8JF9Phc2PZuA-C zrn966%}y<3^W4h0exJ|JG^eg+t$t5=NEJResZVV>ePDF23fCV-SgMRe1Dsafytbt; zff7!f+8&#pe+TY|=rbnBN6AzPyUI{C$<*nysfJpBO{T+E0XC^?@|4foxRDf~1wn!D z0zh40XnOur#Q8I%XsKy^qZWn+>Z3_7&`;~^pi#~m%-TCGextz<08lhrRF1mDn6G!f zOtz~`8oBmkgeS1`F^;t*{-E|=r6e*e1}KA5z6~jzC)F)1+RITFH7%zk4o&OZt4aTC z2`u%xcV^HKjxCxUX(_^0VcFR*QzNr96>3>_mJAuE!t@!Ej?PkOc*>AFG&QBBrX|lQ zz|wHF0Hn{-DW4_p&0uPQET#7;+ISkyd8=Z0)PyKf^ul2#v_$K1M{7lq z(9{ydCLaa!eipXaV+Mr-;Y%p>yuL8BozBj>&IRgDiH7dyhg4kHmYu9|BqEIDITUq@ z2IEG&_?UvKaZ0sF+e5$tDfJ1|K%j?W*`|3ZJ7vu72sId3&=`v)O)w&Mh)+i7dkVrv ze-P*fUeC5v3SN4>z>@8opYxI?U5l&qp!TZeC1&I z%Dtnn9P(Fk!jY@uhSb}WXnuo}S#B7IRkmFm*u1``C+6r<0nDTqxxXR!CF-5lF3AcEM~F)^ul8QxmpN2O2+Zz737_H zf_lHIutIgNIXfVW^3mlSPrHqbWa28@3fRtX&*aGzKy7Zk8Q zJP9R@Ap=CtcRRy5I+_BQxz2tbY~Te2l}lLPKm>OGJ{U55g*be{e}h-S!b25lQH9JY z!z%8pRB@lG*dTlAUUjPOoifK+og~sdz6X+ZP6am$vV>`lS&Lc1h^~TljLDzO1A3 z$<~x@voCq#t5aA4M!y0GV3?}y(UBf~zF%}=UKzV%`4Vzl+XI{^XoA&2ks(k==AxXU zt@0*a(TFi>wzHj1YViHt+J-K?={*x$u_a5R#M0AneFZPDtrte>5;tGrlt-BXjOzR5 zULRtLm$PQI)Woz*bY@1iIQa@WheUseOk)U^bQVJ+O58GQAwylGY6Vp%f^pDj*{qi1Ki4B zBmyNBSvNFkFX1DLy zc~jOO?ApEWz~Q5}9e>;1_s*X_cj2K+?|jGCTzvR}2hZPs=Ini^PUiQ#{m#2i+;Qyo zTW-Di$iYK%`}gdP;;AI9)f=s`@wTxF6amcfb?rT4@dHtV>Lx_ z{5vqq)7^LEzoAKd7L5k?g?JCjtvDl#bal2*ci(B#-1#VPPV<6!C^%c4<@|qC4L=}1 zN&Xbg+rFq4-hkPRf6vSgaLRvwOtuW(`Uia7(rQG(Z>iuT6i7s14QxoyYhVxItc70p z5%}4~&iAV|3R9W(#8?jVFVR`2yI1P6!_tY@2o~6k$dV zU9Ckj$|Qv@&bLyd<((}RW{EyXz1p32DsNNccZXh3!_bgb5|CHPzpOo@_PB>hmv^!A z_jEk6+Xcq6`x#@G!tYX*!KMXswN5Q-Eis!`v9c~>(^8t3sWXEyvzG9nl^KCu(QZaX znq^=#w3b}VCusjWvD>=q+r}a2UCbx>;XBISqDH6Wld7EnHg!iv>EqeH{gzTn-_wLk z0Kk+%u-4}viD5bB_GgNpMi-*azpJS-o4SoT4A#Q8=FuE^~;El%gJJ(y2Z`t2o_K9z6c`AME-J1Tji>f6i@ zPw;s!%C~U)9?gl5L^BimcT3dmKfn(ZjdXnJt7cWJzGGmZr{7Kb(~F(|Qj+%7_dkKS zIx&w|jsH%5Xux^gFFXy+%{}w97j~YeIX2J=am`{H&>PjyQJ;-x#Ap;9!b}}{y0k+k z(}Beg(ya8@<}22B-s$}}un*ywcO{Iv zRi@!=N$~R%ReW_|{y3SM!KL2I?{x^$O=d?vN7-$TJS6?OY^RW^M# ze>=avt8E4an%v3LH@36F7Fe8BVV*jjzm0;g zYiA=?s?+(Mls?kVWPqWijHkbjb`=J9DnCI13-^fK>QsIQrC;05WRl^dK2Ps#XN3vt zzWjCyzNVdxShDWRk5l@NcIL*le8AJCcGeFq&F8mKz+y3C+nUdhQF^hRxfLwm#nVIW ztT1!s`7IPY*v>|*U3q>hr4O{T)84(^JY8sKg;ncheuRSi+u4Zy>tueE((~Ai{i8iR zooi=>wd`J^$1irywzCn7*uDA9l%8p4=l!F-Je@{;4`X_JevpDw?QFzG_I5n(7dt5G zZnn$!@igDg3Uk>#`F;xWb~a))yC*+D>B)BHcE@~hmb$vM3wsmY@ z+g69Y?flnNx<|*sU+nB|8`IzAPegQy<@NoNwT=95^2^S)QS}bLY;PNR&iZ9r+sJOK zUpSysbhO1Uo7=evWRqW}+lKkL2r~*dv<;=F{L*V1u1@-8qHRdn^-HIn3%iiyb!oM8 zp$!2lx)7Qze83~BOQUTQjpa`BjeANnnEEAY=fADNBZ~c7U9p-}-IJL`m6fj3UxGiv zbj89yJG^E0tFhxxlulFJsOB_%i8vhN_RhDZ6^^iMi9=|a@{$rCK~R8BnK z-|jZ8x5>VFLiT*)(EM9U5#0M~teXCDi~-CF5NMzZH;hu>Cu@UK$R~u_^=E?fS$tTs z-xE2;Nm=CByl#Fji;J+k8g4RdZG1EpKH{9U4li@j`3qER>Ml*Xvda!$lwIBcA0MXc zh`tXCu$}(H*QxPl4^MDxL1#RQlXR@sXtvlA5mYbvCM&8}Xd9=qwYt?#pSyx|&zPmCp{8IIPia|;x;nWUFbqw-}_XS+Qec`7hS?W(iJ zGv(MzQBoe3-`{-Yq-^l)mf-C0%LyvV|FD(c?k;%E7Fe&g=t;~4GSZXnaClf`q$kKo zzd=TVC1j*0$f(AJ$!>9BvYT8)M6zs#7#r?t1FR%we7;|}l+6=z?&!%~&k&8t>;oR1 zl80GKxOHE85_cPZNExaXvqWCm*M(-6I?JKirM1!Q z(g>PeS{2PM-54~xG(@vYhGrR2OFb1Xi(!|9VM_l~K`(uw({@KN>yl&ECC98wj#-x+ zvo1MiU2@F2yP=}fr1!Y7}Kd$mSqi+?fIi9?SC)#KK*mrP8)~WB-<5y$7 zEo&D&7?7sLNJ+69*>3BTQKCFadY3o<+};FeKAhcJlK3sts&rHDN7;`c!sJCuglE6{ zBE$=95yU$B-pD!%rm*@cOnb(twoY#lCDy{V1Un`Sm|ncco^gZN=s zw-k;oqL%GL#fae1ffp9R);h0&Qi+5&&#qHssY=E4OpcqongsK=}h_vmj_Rz4|93wM0yTsP|M|37WWIC{YIRp^qBHE z2cRLB{%K~v#`8WD&+axAPkC7L99E$Vi1%vB*p>N?+4Nw(W3J{q&VbP{Et|iH^%DuH zlEcl5aq*v~c$n}_N$-jzZkU*H*Uf-@%1cI~DF^+WU`fImPvaxso_zRBAY8v8T-BzhE8_g8Wm*JsKUF1#mbbUm%VA*{9frDrX(kS%wp zSm*f_HsT7H8@~>c`%0&vMA_-G8)vglwW+I#VS=HqR}X0$a%Iy!mPg+haTYAuLKiZ) zW44uLJcOdOcvk_p2LeeK^uH0DCi?*lApyW1o=cF9=2Z zh;LR1jQiv0{TDiD^OkuM{b&cO|Ao#r@j)M_aS>b+Myyatr$hYtni;$ zCt!Xai6eNN1f(6oP_hZirxCu|^E_OXHJ2~|z=gIui( zHW2Z6Y#_Q|1F3UCd24b(T%6#7^48&k@;1c<a-h}xG zPnvScYxAV-;HtD&7M8`CM=WqI!kPU;X{T-JWQ+)8wnhohe-C72LTdxDNc|Lv4wK1uz+)BfnErnKaOw)>->uv;Dq8Fl_2;&^z` z5Wyu=fSIW~kTWN-Nxby1vg#JCVOZJZupeXA)_*^2>lc=^^-=g}BFW}bV);>RM?Q`pI%_jkX*u-U=F9*8|4@ySKEHbMsUdGO} zXC*|$Wt`NQICKx=i_`K(+z{J%THMjs(wEDMawOVuSDaA}ENV~o z{wuUQEH(bjvTM@09K&$(BXM?Dq!WkGCe99U%X9Fid((~Gt3`}i67weEs-UQQl7|95 z`hl5iMk)M8JY_Yol^u~Xh#Ir*!gZLU7u|Psba! zjg5_M+c?$UGBZ8d?X)&;n&{O={;L=Njc;x6Uo$HItK61l+@xt5kN&r835CUby5+y{ zQL@s17$b#s4#1@MV}@558=BdCDEKzDfU?o+d>7TVL#&Q>4!Ai73!etqhsl>(2t-r7x1X|gHJ~5AfRs9v22!^a5$CG zCDhjhKk_c0?-Fw-S!D@Gr)51X(JSsVDSE=2hUxL;kjo8cy2(zs=#dj3NV|JU3~~zq6U`*trm&Q<-lk$r&SVT;+I8B*?5<)<22GPww@vEAeUufXNjH)>0$(012(nq8`fT| zfP$?9Y6zyd%Qj$967cn3S^Gd+frhMh>i%*hVJV}Q1;Od=c;|qIws=nWt}v&!`J75E z4GgE@whw`7EDvO?=>8!jvWXI=&FR%39{lAyAx{N08tscaCRlxY* ztAz0Z`M%akyZiBkR$3f;4nia5S?p2Ox zpW?ehUHe{TU3)t>uNyjh6iF8N>mJ%&4}YC^p4y+Xyc6r=pu6zy7316WD#tfKd@K4q zcpdwU#=34e-h@A{7~f6h_syUy%W zJ?|X4PxMWR7ellAhybz)$4xPrgb8_bBaKK?PKFoe*}sTh96}Q5J!q_a`mA1J9r?!nGEq5Ez*f2(M`K(Nz_12y3TW_7{ z?wH%w*}Q$vV8hh@1C80%cyI5Pef4RA(`xC=p@SPI@$JTkqqvVfqn~JfkH}7gMQgIH z7_jiuL4IOE4JU^Zd>G%JH2aPG0Ognrmz3|JoUpGY1g?p?n+V z7^TYU3b<{hoLG&roQ*Y!VmQiz;>Ep`Z?BXSXpqRyvgE~0l;b;DQof6F{2^f;5AlTQ zN$HOVwHF2rOX|uwpO(}$(H=$eFj**QB5PNIdW8#rvr==I`Kzct!McU{i@*sTK@4@^ z<0oPQI>A1MIg-## zPRiv435K^4^)^$EQ=u#;Tq2Q&U|7(mfMqHSJ>>~Y+3@Ek1(?~(f}+7W$}y2IDW9R7 zu<1};t)I00yaV^~mi^koYXb4&{thU|CcLD4H|1+lwx^0n_RI8YuA8p z?RvP1H%-0}HT_7@^e(*-lJDY{u%-tzy^E$NiHoAD-Fjuh{!ty|f+E?^Mt+~*z1?(m zPu8$K5xl!suUXJjcl6yZ@9yQ@eY`6#9PjF&1uk>?WR4A045_u^kboLt3hFv@?|CNo z>%*3y7WEH=uFuiTe!51~H;|0`2OWCKmP1pA^hGl}WLa%Fdb5An=IHQnjHM2dBGy)sMor+r>QKhMIZ%-Vca?v#y+ITrwy&h=r;l>OKmC}-$!Wrj%K5^Eci zto=7ze|>~;7~vsCcrzm;Zoo&#RioF2_ruway!&9cB~g&6y$&~pvFnpZ(#_x0u`em{e#8JVIsI0TnJZzfm1(WwHn)Ps%AX9&9+}nW#h%z zd@jo2)n1$7*|-c*Y+R0Unuf!~f`?(7OUZs_^Ot@b8TK*juMb<3tzqBBu#Yk9ah?s` zxe6J|K|jc#ZSn~K)Sz!yC1cs`VbEi5_CX)F{`#N~he6-YppP?X++!ny7EofR08g(8 zlLE<|1I((T?NkI1W^}(r|I7%=n-m+l*-vB(L{Vk<#eKG8VnW+k#>dCgTD#sDYmTe3 zvSL*`o^7Qbqz-l+G_!5mjkC?ygYBzvwvqJ!8HJ7O_Nh+4*yhZB|~gwV^{)*IwRL@dMr*tc~^ndntHy$O=#H8il*2IMSm z$gl#lBk7T(4WuZv9n!9l4-*C9X1|$bfn=GSCHLMjzd44mhTJuaG`-(%W)Kh%6C{`1 z>NmG!N4X&ibW?W3Z?s_W~ya?cc_|v>hPSznOc+(+7}!{O7g4RHEbjvA;24Hv5OcrzAwh2)%?lQYH=; zQ$EC`6_p890eb4|!@{=2@iWxzQ7fTt(;`-`o0`_Ou$aIYb|)0g+Cc0;IF%&GypGgX zZb@yte0R0{m>#_RXh8&tZ{SxNS*l^rim=}LzrmoRyo?*(*ab{f8eo889)_^NVeeUV z0`Sq*%ignqiI`W0KBF61;zA3bFIxz+`(-N#@WBL7wjlUu5v;(c%Bm2p-+0ls0=k#W zfd$b0Np)baEE<@W$?Cv{9G39|da&gURp2TE!wfTu6JM}K2IcXupgoBU4O-TV%c&2I5q?TEYCZ=u_4 ztKDXYVL$(h&9YGG~h5cY%0%mzEDmAaDV zT^sM!i8*~L50YCOvt)ldb0VG7F{4dtl#!I*kiigjvKl93a*29ZV}3D(S?6P#{WK*W zQVsK=LJbv8&&Cs#)K%%6jt123tD;SBQM@3^GvC59kWbjwCG}0mll7iv%NB3;k^88v zXu?-4v&NUR!9dt!L|a_KPTDX!Hv0;AMWK4b=A$`lnduy8@Yb|518vLk5nvuh+&8#njb~<%_@^YSt~Femr?6BNHA9Hj)6qai;$_);>sl z@YX5ffNp)Ki2v-)^e|q@SQPaIrzk`@S=PbxUS_s);*yOnbkWYLkdqR;pn#}yXN{yx z`SDm%8-{mb*d#BTjaz9=B4W_N#sw z?F2JsFzC@eesQ`C%{oDg$gBrxXgN6&om6hqG*7+pmURVoZGC8~4?@jkMkykAOJw(% zh|OQN-7STHC@{7Wb}Xk5Aw_e>UJQfb+xALv@FY*f7aE@tSt$HD3{HL+r(3qFF*wfl zX2?X7`~Uoy**a>QZher>P9b~>tmo}a7X*om3h3Q9AX$? zIggvJZ5};qEEz^cK`hCy>pX5+WvFmpO{5%C$=xWEoR&}-Z%}E_&^0ll&M@G(zwO!v zY$wE~$T~LQ%|76*uLt6;Fj#2KJmm;R8nE1K$+`Y^!(8Mhq3(|BM_o=17lgL^@Me8@ zJ8taoNLCQ{cWOX$$va)XiM7&dxV9zmI@qh7(j*Rp^inWXSk6+0%6h+;p%y&0Jk2-o zSlF)T;}~JHnffVlX=R@CvX6yRXXcVe`NF3^L7j`G5yL;N3TNz$7+`r8NjQ_iDgb z`ul7?gUTttE6>-nigbKF_xbSl`tas%?C>m-1Qk=m+ppnW#r0K8rmjYcgM(Rm891O7 z@gkzl;81?(TL*_Zm6VYmMnTmP^R?_?9$%4m!~f~|*}=^(%pZFH;K=iXG>^{l^ATml z%h}$`n=++JQqs8^gz;dDB19$Qfl8?VAQ@@W3$r>s;V1@Ii5_~{l$-FrL@gyY8ycI8P14!=sr`(;at;3TRIw5k?_@QXe$=2l3J_B3 z%peiD#2cCoe$*)AFj>T2Z0Q!Fu+MEodz=Q0;&)+&mRV^s+f@#sG%HEv^iM+dgJN8Y z3wRC2MgK!wfKvL=n)TmdsNu!^$`C9HWS93xK_>u3+&Rm#ewc-<9D?U;D0=&*nFR}Z z$$SX%$1()T2Dopri?Yi1V@H$aEZ$}pO%({@A#kNfgG%s7sV)#ZYs0oI_g~>SgxZGb87*Qz>SmL6z-_R0l}^g4~tR_ zhBDjYJIdzyHTSe7*q?+o3<5Kcl3j_-t1_jDi#;7PNrGf(=@YCL)TuE$G15MxdGfBA z^CY^JISO%NJEtd6m1wPR?|x=hLj68kJ~{zf*S>+gAJoJUlZ`bYlgcs$~j}_ zvSwA7Y7oZ_8lWo-FpZg`RT91s(q&^dp~gTFh2FzqR5UnSgSpDK(wf|!?ZWqQ=(AN7Q z#IvDRF_P*N=iwHrsN7qT2>}Cqjhb-+WN9_g3Wx_f;q5~T>K#+=sxd%JrR4#P9x3_a zXNZ+_5!99>5_}bYJ)0@!2PbE)*T~|is|q^atBiD?X9it5p~y)-t+a0`!jo~3WV6b5YU&pi#rTe$`x^~{>3HCB zNiA5JO=`t$Q3|kHHEPg{)v6>bW`ihd)qwyj)ylge9#S=!NL+koX>x2sMBTo2?qR?& zPY&!~a!Z^_5?DqklZ4&ZOUNvqGNc?=%X~paLzWX~jfUV>D>Y=TFDJ}LA~tmZ_O+-3 zup?kqbU@L#j6TeYa@H8}6+c@tobqQxj?tej?@jr$&>MrZTs6Ot@NjuzV( zA!LSGRj_Gb2?ZAkv)@5Xvf1~EwAohzCVbn@2gXx$fq~M-8k&$n5}_F^;G>Wp)n}g& zW|L}3i^NMaGiStx;$CvJ*$Yl)k%fkr0FDDzxKdaPJ&O1X(FRKw_$ zE=ux2mEtTTI!uN$vk8U|c^@$s=~taXKyaI3rBfeOIu{Z%sZ*Y}_t&SD`Nq2OE4nSa zk;Qf_DLI*yh1R8&Vr>7EYLq`#)p(lN|1MO6S&;$#LU{57IzJPheB3`7o_Os?b&Ewo z8<2hfaB7>0|KUX3m3sDK*j9&>L?{Vu{Z;&g$ECR7R6i2GOD9?9t$tIfor&OVOHOz_ z|0ieZ)_QA9yT-69#YEv0% z>iNqYPdzT}Ft1ZYBARe)6KbXC9%-y9MU6?-A3NJs zoNH6thRGp~e2m}z5vf>@*x|U!)TyQx{a|M;G%e8!iAmW2nzw%G0x;<9Pac*nTdRa{Pp%=5g;r3yU>s6 z_9M&%)_4La9-~0PV2R7es=Xc(<}0M>s2C%PPd)!53$Q@@ZU`AD_+$H5!)?7cj zsS}_>qxYmyg3c1*OgHTy_c>&pfyc>H$i&(f+rCsw<_?(qE6s)e1be2Nw!Pe!ptdfl zA9YMTx=$vQ_H|6;1W(Gw{D>c9vVjlThEA&fM@4(`!Ya1RTrcXgFpUR-+(399gz$_C z@Q5rJm<4`ShLVP%0FaH;jf1`Np!wdx@$fXcw4@qK*a=%EDIE;m`L?5O9)b=W$iPUW9Sc1C zc=9;RzyM%8K?Yr^@^$st*oug2%t!=CzH7h%Rpw?_UVNbwwp_i>WLvdjx%>k5Yxg}` zx;Lgz4XfUz)m1f<(8G9C!IEql(n`XC1qm0D%81dC4@OTMSfGm?SYQcO#I;!*^$KZE z+FVFJm2x2&$v77_VT^I%z=94JHgRs|!hr=7TsW{`nu{G+(A0qiLT?T%(4=x;fe;RB ztX^SN(|1TBKVOfQTi0N%tcsFEqWqtGTJ7atdn3!TXyT{h`=jcAvHnZbTCHAhG{(l7 z&GGRI9DIn5-t9i{;Kan_WUn_hwPC}?jnmVcHf`R#Wy{RW)~(yN&CYJ$zGKJEoj2W- zWe@fHgTcjJyLRt>c+Z}_d-v^|o7=ztz=2B#4<0&n`0&j)A31XL=q>7Wq)I-MTU6G{sy7EWq*6i{)T)Gr|fI(z0vl! zFV<4!i)&Wh^$Bvng=@g5hX3QSmPss6-#ci$K(4OA*z=^Nw~)WFVaQ(-kpXwB!u&V@ z03$(&(Dog_jk1`d!X?}*sgWW+P-bY8eE9iype<6EWaGh+9cRgcFC~&bjDfPLnGe|e zkjUPN4jp4|cpvJAZ5y#VsX|UwnfLl#9|ST_bC6sH$Sx#d?2uB})?p9HdAf{hbY(C> z-OX%*z(x`+ol~hSfJ#zG3}1t-B%N%6n%E&Nk%K?^scpEon3Zw!5a^9a1|~(=S-s^mwJN%!d^QKI zZ{ylvY199#0DE39ZrwKh24d1)sER zpjMk%;{o&W2$<>r%;Mq9W~}p@i5@beA7%`q3otjbe;uTQrT2a+mO%pK2FbDhD!#;Q z@g7l^I^CogM2fgrkeHFBGDz_%-`W%rj{|LBvFLDOds%4+#0Cq}%U)~yJoA|f_1Mhc zkFzd#oGyT^hHt9PLyPo^Y;;2Rj-aYWF*Aei^it@K%x@=8Sn?w>S&f127@BAc!?P|Pj#*#1# z&~~DHPx_HE?HJ3tj$LiA3w+{hnf2Dus;Hr8wY6-ktzoNJx=z!JWm|=7v|%dv8+nIB zISCuBlA0omct)7?XI(o$Rh0nu2FOY;tqXPptRPabK!B+5ovb0&hv^RR>F6hgjQ|^& zUqKLHGbz~UbnK)LUWx${M%e^16Tn53H))t4z6j;O>1n$m&ert^7gde6$(Dg^f@-V3 zE7VN2VYRH58;&T~Ryo_m#$3)UDv<+{g|y@9DE9d!NK2`@C~XzM=+Iy-KP~<*5LSm9 z#~6h>D7%=l8K^ot>77;ekj>~X)=hn)THyoOh^t>(cfkzCfL*eOD2wY4H-V)f5gQN# z!eCb8g4Gd*D&<+LmWS09Z1N{#*kH+fh`aG5eg!YnBqf?qTgPlU_GMThU)t?@9wte! zjQ%dn4vei(K$p!~W*jAl-1FLbi?WBEXt6bQUdteZN(2c|*86HUVhEJq=x*SdsP+v; z&`bQn92FY>8^pwawq)X8YQ_^)(Iw4yvlI&8DLw(l;XY0?T%_8aNt6+cUT;AcJ+VI- zIqd_>>3EeajshoqN;@^V5TND;aPZk;lXM}`qsR*IiGei=q#a)MLoWT{%LBu}T&{2{atJmoG7YVP&@mde)~zR*%;rQA zOf@3n#BfT0tZ?*9zAoQ@64p11yaVAZY(W@VY!y{_Zn3U#?4cNQo<1??SqN-$5*#N) zkhC&6G8gNwdYqZ3G#Us{22;M#JLHPtSupJZB#zSpNx4%n7Q!AWOW^=A?DHXhSbPYA zM32*oWZ!3<3m?V9k0dI}Z>wf7=ZER!0V#ydV99RV1eOHn+JHfzSFN1S*=rJLKF$n z7F&nZtyNcpQirl^nMbK^p_!JL=Y$` zkNP&J1y^9iS7Qsa7jJ;8_*6(kVyREWY%B~}@AX_ciSv7(;G-w+jBuGz-gsYr(-Zki zD&Xuj!vSa$&;4H^?f`pkix1dQ>>m^bUPI@73T%AYYe*f7^x}s1aW1;59jRo}p7>_8 z61q_okSq%0a5==n0sHXT3~UJ3!)2ETrU=|~ zd92|(#q7PhSV?#l5Eg5#RyLChLm!4&G3bNX1%2R zmN7V%?B}1sH|Vrhg~3Cxj)&T1k^m}WTrhVKmh}gj7B()*Rtr_{ z)W0o7#r5>&YCO`NbeZlXt8}NgR&Rd0?2XTldGA(((68dbV=q_5gBN^q?!gnxcDo19 zRGn=w!zz594R5aupD&g@S`U1BBj9N)10H5@#o4;LW^cZ9O}%-&ap(8S-uP^N&szBW zT)gINeSrxTfR>%Emx6nC<>~r&WtTp`P~rt{hzpmH)8p$(mq!v9V@XKAx`9 zmzO(hb>@F6JM#u9JV7{wZ#e{L1XJhvvV z{a@ciefi(ZzWidGCbsR_Wrk8>Kzj%hEo&am5lq&^!b>5POq;XlWid8vO%sN&+6(hX z-#@57??!Es))fva6GhyLA4Fck32_7&6_HoN$x9?!{8{PN%GuMeTl3U+koOuKK{^NugE=Q}7qFFCQnh=r$ zMl{)31vgA3sL&*8sT5GrB#Jt5Y@+a?E*fZ(w~Qu(wjVUm*MlbC0K8_?DYhLM;fSJY zxBnUNG%Y zo^j>zp)tzLz=_5rBaRF#u=2U6{pr=pVIr7Qp=;0E>NC#E+FQIK1bxe*k@Tl9|> zn}k=3CiX`)K`vNiI|XFqVFw`7!)JpWS!UM@xwM2FbWuW%-mC&S`eTr@xupX@a$S&f z=X3>fzn^&0+#86Yn4a9L2G|IOaJPHU_Ar=p2D~s73DC#mDYS#FFd1yO6PnZ*tmA_n z(<6M~@%2JWdDz#3mLV(55G^0Tyr^!<8sOyORutrykx3WF#l+T+GmvrAtH;Pe@qdA^ z^((R?mb@f6nKx98SPeL9$THtJp-nY)qq*p3Z!v_2z(DC5r+129 z$W?&-lEdYH{uUiB4|R&fEd^B zZ>x{7uDTq|B)!BwJqE}-`0}2kFZpw9_Rv~Mm$}piDf!kwbob;cKL=!i1zsShby^d9 zy`KL~RAz4+Ea5Os)6m$3?$+caXM8rJS~5FZZ*WfEqMnJr(;xG(o1BdG?()Eb5!5B1 zV<5)R%vp0*Ew^%r65c_H7<@TOBmf-P{9&-JJK?}-@y1_vjKPUuxYNkllBuKX_;fJ# z!aO3hB^T;$BHIw%)~S*j%#^tc#=9HXIizuEC(kHcE4{}uHxByI;EE&Q>^vWV;!U;y znEFI5B1Odi$KCq}*>zoYzUQ2K``+%`_jcdbZ>c5w+^cS>Wm}OP+md31L`M(DNhN;y zK`ND^<_}lB{E?C~Q-sP;d9Un5fMUcXWK@iY7%(6vVXP|bd1A&4hGYgYF@q)qFoA$F z&jWhkHzOdAF(iPQ3FLjgYwf+yxmPXu2hI$?X}kyP>y5HpBM;y zr<#4ifpqT~Q0qQE^;k-NlVfx08(n;X?h!~e0vJdMz~sFAe(|yQ>o|@f+BUf+=w6^- zTtFE6HKV%Jw>Jzre)*2de}As&2Ic)3^uZH2fW9RX&>0$tW7K>p@@sjB&F?n6Z4s zmhRQ?b4S6e;TQ7#^8~-*E%d2vH<~&V8d^L_W(lWHIP1RRQ;xL)#x*f*TwI@+iveCn zuW+|fCGAGlmk&z3-~v$=qd7AQyc|vi{^>+2vu(k-A#%1bU;4Db)ZYe1&mAh>!jE-K zlf<5|uIrwHypYg*gy22bM?!cH&R}7fEwE3Qz)pbdCDqkQb>S=H7s`sb(Teq_-bgUB za)BNI%8jh=ZjyVf3PBl(-(N*9P+Y6JQ9-C2bhytdDcUD#UaYP74qw`t@J?>E64vP* zQlCEBcO>WHyBeVAC|Ssb>xL8)*erPx{&H5JS2IM6tuRm_`uAu5%=V0PodI?IBCmcX zH(lO3plo^+J8)xk)?q#mXqU6?}Yh zod*?ftcR!!m|`cEP{sEj&EMlF^Iq6tniSwhl_w2=T5VVl1y5tD%7>{o^Nk5B-xrlC zuf91jbm$V{3G(O^s8AG4eIqVLz(rK^HYU(QnB|IlXl~#|>zH?d)$YFH7zJR4Cv&?J zmx_y1K4`k+1%j;C&8TG|-)~ks#(wY!(7U(DPsw01yn_2G+L9Vql9l2 zM`g|krIdv?wPHoijIx$GA!)$3dLxa?7YFOd9ksBes^GoMKaS~E^ILS&A2i_QNqLy-&;nBu z`$%{9XK!^y-upO{+Ptc(-WkX#$=CzgJ*mSYAUeEOyp7ZB)cO|Wg<)t9eYFKfveI(+ z5LyrNX9;00epJ%q=DcehG&fMzUtufMTajadW3v4Lgx+oIUZIt zl$voIGoETK#$m*176R~MVtn~ZJgelVN|88J1nj~(aJjwxBo(GD%pRi3n*JG z7_F#S8{X{;4(%z-*z%M9e5ivPK%96<`^%^86iLeXY5C{Cx42lyH3KJK`V zv4xts-{NFrdLTO#tklE;Ofx{{XwktEQ;yv{*qtU?i+gMjzh)#o=fl5dWu|CF2xl$) zRQFhck65=|H9&tdo-aQ%O(i93xF#M}rfVkH!kMA9RCmK$1Oj++SZtd1P z0Npf&V$=DGeKtGgqU$rIfFC-$0l;vo0a@)72Sx&XaNU|j7cF{>9p|770e`=i`*f@6 zgJa@92wVEq`G1#5g&ATm5)Fl8I&;#Q93)g99`rMm2fI9dspWP*lVQV@+A@eAF>E?8 zUT8j}o-8)%xwn+Rzkgb)dAjmp#fa=nEz-1Kpb{$OutOkF&!S!&Z6~s*dZ}EDSz;LX z5)++M5dDz1P!2VR+TjYBJ=GrM|)%XL${iutJtX~u+B`TrnuPyZ3w?;OZ~JgJXQ()EEhNk9mi=- ziHYFFDn(sPL>ouzLd5#svXD9bUY;}uP@x;X$XF}hi_M5nsM8j8kSoOv%m5H?OG;RM z5r9G$TQ3^6vBrgcw~k>DF2*P=OpzELH6Jez7w<_en!VUsr&i7|2+IZ)=5o^z@Zl6K zEGiaEOX?WC8E7c7B&TP%zMa*I?*W(2h=upm@E(i60*1IlanDD2j94EQVukt^!FbF` zIt|zJwi%3FR=+5UYtbX1I$zyOyqVywOTBMBj?ulKm34Wm)meLNh@2-;QweZ$8} z#WwgUi03woFDuskzYz)y@^}AP>52wHaqtF_N%R%YSb0N|xT7#M=nvILVZ8*QzC1pi z&yW!gly65niRD9Mmb!T6QEhkx>akQl1!$lGFmG{ zT$W54rg~C6Wc3KZc6(hY3!Dq!d|WXs9{DBrWPWOCW)2>kn{^RTpLHmh`zzoX$&XGJhg+8=q}$?1n0w^Z-c`DjBl5yFbrU&U3rzc4o@2*V`&1)JAtaHZ5eM%NeP3Cyf+ks1HerL+YGmQ=7 zbm=|Qvvk$;oCGw=H0WN2jWa<>Y8hu`hN3{D&yS;%UKC(W@mgZq zfbLMjAVAjy4fYM9VgvdJOU_$_MtikHe#vmU;BevqvcpZ!hQ<-C9ZsCLOBm>Ae4z=a zvsNmtqKcr*H!xWxrcwCQhSw(FwJG*?mT$%$u>8t5{2r-wHt1 z$66xHWl_U15K$Dy6j?@$qBvb{N}V?j5X_`R$DhU6?E@5xP{-lJC_s^iIkv!C>_u9s zMszW`WSl#FA+&-Ui6c70n0N!dfy;rnOuV6a;g++Z^d^X~vsP)!r515cSwiDjpwdW50I5rWTrknZEmOq~gO`+H>iv5SW*xXdHeWBP56l0et_HA~m*jgxdBgKBHF6L3aYXaOG zij@@m_jR$(RBd}gu@S|7u`V_Lh~Los~E z!Y$y&Lu`ws!D_~#*eb<-p{^~Ts%;dC?V;F(R7_p0J647=+L}43OOpe$L%W#y0ROc9 z0UGN2?mHpo_kW`c?2%4^$dF>@$=@Tn>dD_Hx#CG_b-O+J|BxJelEB;L$dd}WU3&5g z$s0ZS2PALs7)nAdcJAAY1uSr@cWnu`Ev`d+D0d<5mXM~Ebg-o|v(i&#I+zV4-2SK~nfd5aV z$N_s(=m7km>KUkiMZbXjtNI1rf2Lo6{pb1x(tn{}z>KEW5{&;+zX15Z=@;n!cl`p| zujv=K{*`_K>R;;@h<;tafb%5wWx?`0^$Q@sOTR$zlzsu>ck37UeMG+i??L?nx$n_0 zU^}f}VD`QG1z`V3zd-Aw`UO-U(=TxPKK%lukLwo*{bPQmuSf%JDv8zSUaVT@T7Xo$ zmX^N&aI&IbZ&Y**6^}2aakQ8n5yfPY!cP?9<0V@!mhqdya>gVNICza z3(d>S71V8$MW=TFGYIMeKua`9{yN*W6?1*5I-37Y1`la+;lN^J%Od&z33sGgfsAz$>de6*G1#SV)pSz7gSIH`W- zWCPrb9q*tQ35_+a@l>@&DYGqK_BM)&4$>I*0Ilb(sV8ab@|-P~Fsf6zjP4g%Qfs~R zc`dCq3STiVXWMi0V<&_&t~eZZ<89RJPwN5`M0!)ttGyRQIGPtUW7@4GC|&5faK z<;eY2u;!nY^&cQ1%P4qOa05LeZpYExC>}NgLNt))cvI^4- zP07Xq@S3w6T_q*}5T+1=rPi;i_>{TUaNu6gX1fWl@w|K1uGAxO*#ZYz6EpiG+-B;-*ARFTeird~=We2}PvzJqrJAg*}VThua?_+VzM0nbrUKg%G^Y z%u2p+kVryt-T9(J4W8gB&*GFA?)9V|4MFb1vsY{v~DT&hlN=SeEusjmuj!X z-Qm0tTLD58;TVH)7jKY9TLfW{<`5@Tz+xmj6;&%4t=Jog3;dWNll|Y8+|goSec@_U>+ef-*~32ZZz8Ky_v*(kHySB+MBt6 zkxaI#(`M?jLT*YDGpf##!J4lgi88d{Yj*R3{7PhN3v5N3{8*2L3A2Ql;Y38&pvUGB zi)V9@clhCtZocWWgX12DbrH#IE;ZVKF;{j#4-3R6np`#e zfr`EL<#OiRtMB}4F08^Ddl&?H8kW!jTll-y_JkM0lq%%GZ&B@FDAvg3@L}!nJv$S+ zagYjG@!pzY62LT={eEw>v23qpzuOya((`ZkMw|8g8@>b<1F|728q0Csp@tj!ov_2fm#K@JC=r`4nN$X4PNayXgHL&o_I_ z2{7yN_RwQ&9@gXKsUGhPJ>K;)0J-&QKw@;u9FPQgRex>>5WF$;XKUyW#BKcfTuy3Ae=I>h5?1h+EVc(t-_lx_+YhEvzq277Trg~Rn-#%=B!oHhmP1v_V z&tTupdItO0Vl(W!rR*5??U#!y*!L>tWsOyk{qv^r{4%%Z7)K?mdmkfsy|dH~$kt`V z2wjc%K)J^2C@Odrdo~zB|LPVn(00V`=mP7xaJDsaZ=TGBza1p^w#nRGC&ssud&F`x zm-!GDtGj1WzCOn<2J>t3nlT>8tu`gJlW{>a%O*4jP9T?H61E%fC+$^*<1z)olofo)8P@!5pJr))w2x=r|ja>ge7 zus{T29MLZb@fy7cK?HEgt{Y`APk8iNgY&^d*(Vn0?`sZc|CnF43=9VTf%^#wROOMw z*$=DS;n!uKjOBobmrGkO{yj4vn@n3ZGv$Fp*+*4Fm-UW*xkd_srkOS&dPY#I(eql! z3B?(5Iyo9@Mw028kKkJM`g;atxxajsamJbQmU5qQ#(m}OK}5VAl1zB(x%3`N zsqxlx4UsxE-g++BCeMU~w;hq9<83G4?O|ojk03_jE%Ph9T@z_$qeG(10`%<&Z(%F} znH2k%iX*ahq>m7Ac+w|kt2zNWxMQzHQU>egCxNDf~@0hFTDB>C5ZZ|eZ z7lpeNzeuRs_?g?4sarUarnqCPKPrz@x*Cbm4rt1ReY&;rZipo?(3RHzqY)IEdOxOe5U+yJ(h z%XbZSm&>fowhmTwQyA;|iM}FTq9!$a4NXeg*|jt&ImAvfv2|UZybugYvW&?^mN{8U zS5e9s81Qh+cI5;lkB%j}7)FhBx+Zu5q1>nm2nB+S=6&V zd8>F9O)V#av)V4=VRE_$B`k*_bjs}^#axG!l|0R`)SRn6NAv#})kpI7<-gS%?bGk? zNZ|APpQQ-2U!DJPPfFDRDF7(q`?D|hgnrc-R@iNIs*boQN=xBv_W@J zu8XEPYxGR%xEfK7#2_oiY$T<);Ft*C!1)m_yS!WZQ+T?ru=PR+A>dKBCYkH#%9|Qp zfwQI?a2i^YtkIG=52PW?jjYwsHKMUFw>htlu8>B^M39A4uf`tWCqE3$zhru7+Lj$A z#ln(8Q20VGfYeq(K_ztco|!idfQ5=_2wmOYISq2H+k%cK&cNc$R(j%NsC~A^5@$fy zsMlESdX0sa;XDkOF}n@_{Sl}S3y5A#z$w5K=5?f8MnxX)fBg8<*@wogS@3GwR`wrd zWe7WC8E_Xzk!5J=4L0jm(CJPa>t*J=q1 zZk*8tqSF=s4WV&}FiN5wTk1MQ)S?bF&lv|6MCKAxoC^@aSMiWdxrkW=e;Rrb!M`-Z zjr=R3TclslPcqf%8Z!3$BwE|mwW+yvH8lgm4af7*zW$M`!B~r%Yt!%@iH6~a4H_mt zN=5ODh*4UL=tLh#$y`c3HW{lm9_q18z8ws?!)`|aGguc&1VUfLYz|9AJhipLPZQt= zi!s#kl@OfEeW_&BJ)Vtj(k+Sz@BXXj1Np%k#R-BQ;oJc3D4{ixXOK-ggm|GekEc28 z8#xFG7a|kiSzXFsuRi5Z*69L*?rB-e4Z8NTH#7p^qRrzaa=@r=7+C8SJ4}OEBD$o;SHAjuQ%jENcK@0RQ^#>O)6TPgL&BMH22-e`@C@?jElW?4Oh!-)qt}Foz z=|zg9moOQ%NNP?-nq}ipK?6#wN7=w8CgWy3Hzp(6zOXFWWWd_vWQb9s9{3IxZi-Op zP=9Y4Z+9JdR5N&V-!L^gYauvnAL!(TTf6$@a=F!J2G3X!3M;`#KewS~%;@^t7hovH zPNpS4QtIZwN|;^e2sm-t>|)Kl2}TWdu*$a)GzKE?O_W&YR7#`sK#oIZ-+7p`FK-XM zCCGrqdlZL5G)~WNGOclRGXv z*=HaD{sfa~&o|>!u!eXcfFp&~AgNqx43731$K%aYE{hCd#g_>T2#AD zMH3kbm0?a>10QNIC)CxDxi#tN%j>FW4dxW-0elG7IHw1+M^nurJz&{1df0nSdeA*C zI_3pEY<2Bn8GZtHOhB*;EKKliMbQy^1@SdN%wxEm2~x|j*d9EIzo3HX*ecs2s>ea8 zT9oQ(QMuZnsZqJtXo|xfGG{8%MyJ20K}^jxYb~8^p6Xdr%GRqZPE50i*N!x=M3XPA zn%%LQHr1?LqZ(Oi!%oI_`h%r5;SF!? zSZad~LM8&v!3aJsP@ydu>=Pv;K6ZtK(szV+4Sehx5{7*GDE{RV5(ezTvc|_z8PRn) ztr@#v8NrglE022=UE|MMWw>>iXZSP36!4K-so9&@TXqc}_mthhpV{Bhc)E;q4h-VY z5K+d7WhcoIsubplpmzh1V4m2D0bT0-2(v^)L#@xE9o?%K2{i)_%CupP2?xgw9Nb&( z2{^cXN0A|h%k3PNyAAd1)iC7_Mjte76szTO|DobzJ${*J*4NhVnO?b{%gA|<>1y%B zXlF=nJTcl8lFKJXyD=Z>Alpjon13g-X)mXt4k7s``di}{kBveaeemUI|sEuq?`bRLMisq7PMwL90cY;>^Pg&sTFR_?xo zpB*wU2`guP#@Y z$FDAL;|FGj|E;itl9~y0A^p_$GEIlhK1e{QTrQno_~ejs_JcV?Uu}5&I8iEn!P(J* z(~i;1s$@8a%A)fChmN^{eRgzU9=#%1=r-uocpLk**IRD5izr9jOvK-IFh^a}R;10e zb?^nZ_k&rtRS>qkOcQee zmb7MpLVAZX`EYcP=7<`0(KD=#<>*kh$j`#zY$HGY*JbPsmp317i3BlN!H2&?t3zlA z4>jx$+6UQ6m3WvKPv2f{uyZrQ8f#8IHwUV$Jg_{v6UY=g5S?V$wGngsdWgxuZ=#~{ zO^@1c6-*BYGoj~!$B(Z>^yHGZfS&F_UKF2MvSl)L=<02xV<$YwQUm_i!$_}AD^EWe#{68!!PFL2FDRz zfJ1<14>P&~l61?x)_+&&Ampx2_SgYO8y1It?D(TS5Q@U&D-RnQ7%?gj7)I2U>mU~X z`sJSGkyJ!F15RxB1&zho(>lO-!31R>e4C_!r-%WfU+$x(@xDhvawC(O5{5Wmt_U(K z<&N^kKr3nAqr6FmGei+vTl}Kxz?WI4vK{AIZC5yD^Yt+{#`oxY8LKXVFqWRO+%9(QfJL+Lxc2qEY=MrP6qaYG`RL_7~OhD1*=ZFn9g5%_7! zlQ2NNL4eE-W{LWv*;ET#*J-UyoTT9|=bUT$RsHih{qt-5Q?9Bz@Y|l;XQZk|_LZO)1Fp|{xf%P~FQE_RFgYw=KCyIKk5MbUCw zAJ2e$tj-YfAHxp}-H}6iNGU|P*odo{>XdI?WZ)rU>S%rtG2;6T<*Rh8vR$s~_*R3RS#Xduh(4+H!wSY^p7XbFnlH0%+eRk*yJwcL>SbRSC2`wRS>5rIg2U zHPcVqY+jZYl(bzP#_?Di?5O_?j@e$XA`>-_LP2<8{{&oAj8oif!{ zCI3j0qzwe^SBAWV5{w|`C6v&UFz>zO9n3#mJHW*?x5a=?EPEg z+<|%3x`m#IRINA3Bhde@Id@#Ly=2A`+&lD)ZoC#fHS~-QeK761&s54X&y;nXJT5hy zJkDFWhS!NQz}dJ%K4Tl%kV90_JOf&YHZ~J)mtYN8l?=e(#C5H>UI?X2!u7gNBW&Q< zdJpH2V4rj65VmiE{mz|7a27Eo4`&iv56XiBDZjqc$en2L5Yd67X!QKP=5^Um>bH9c zjh|nfMLwZlVpIK?eh(kcKB?bV%DtobM!0tz1m?*tDKa>%IbODV2R;pQ@4(ALXmpi( zM??>CO7QNw?j6DPbQm2x^vqYcM_&y+gS~8Kgf(5qoE>QPPObON8_FCq+|2{Wn-}Zm z;a(juSvN~u)7v9@pqOffSaL5DkpA}crF>K%i#sMV;P-bnJ18X&j}hyvoNMt&!5;ns z-Xoej5nbx$^}I)JEf1M#fo;JNhZuI2yMhHd`cMwa-RNGj_jk*2c|%aXR)fq#iX_qG zd5me5frVjt9s^&kyW@Ef{Hk;zhvaH?&V6=P{Y3R-zI`tboHQgaZ*7GWpP`;|)oNt9 zx2hzEI$P)ZwB+oIgy7!jvU9qS-{`jTtyz_CG^>2;y7C*{{}hibs8$Wrk_UkG;Uay2 zLy|s_onAPaf2yyjxZgnG&OCkt6%&F4<)f|A@0Mi?=t@!3nurAz1_Zg_WM&vcIgmMT zG?MPg-#p7M^Ok0*+_j}LD!+ClEqv5otQA<%OgYPCQS$|;StKkZ1+D6`W9)MmNxmOV z7Zz&^WAymp@8#u43W?=$^jLu=^j3y1)agF`-HJKEPgcoQ(~nTFQlugbXSSrV<$y|R z+Z~HXxpkShT`h8N_5m_Zx4yV%##n}}h6zSHY1oPBSu`tSVAiSzxR|At@2!_W&>~ph z%t~WZIZFpo_o9`QL{jadg_JyyP^$%jTKc90rVudXIb*}jK`>~*3jGs6Pqn%&14_}} zKq&2bptls~i9Bl6oAT#mxuYbK8Hi2g1CJ>|MLd%oS-T2+MV%_t~ zL09o=Uzr*AdGa|i+qO+jUwbHT&796wim+JUo=E$lf0g96ho zu_6DaenB4J)3M|^;xFK+6je3+u7c1O3$nU{UZ+AXwo{LT2FO7Tdy~NHwXtf`(G3^f z>6=q%iAd~r<)Rx`23bO_D_VS@6&l0&RR3sxYC$ZZIHo)8b+!_7i%EYH6Ka5cEOCE^ z;hBi5y$#Rea|vLV(rA<+1txV!8DPlHi45j(SIT&V64qt!d$Y^Z4$m_2;*qCNG9H;P zhv0O%p~BBApO=@CWFoF+p#HuF>eEqaP=+r)s@R<7=L~~E0X4MoAtm=ofzvR>N0!Fr zQ$t}NV5}`nOvrD{kWWjm2nx%vK6+4FzPZJ4H2WBnJYKQuE-9#VHEC=ioF$`^JHs{JxiXo-o?~GA8#Ish3WDIEY(97pLX zEum-AI&K9)2f4I@@C)-`4nvS-QWc5SSt4?AUucL45jubydf?ES=6b>yzAxpcS^qdapKioQj39fv#7J|%CE9`st3tHV(?(Gb{mQ1mdKk3?PJ~aOWwRLolFR(31Z`=I8IzIo#HL zFvM^U7hL2%wpFffky}G6_*0PQ=9PlLrLcj-fpU`RD5K{>e-Jo@ zgW>}mF++&p!XUy?#v&YLB$~30GAhh^)>YIJ9c5%(I?4!VmaQ9JB|d{aCgC5=$)e=O z%0dJ>!$XXTfCNx5&2b=FSJK9LBw{_=DD2o4ES6{Mf3$OZmUZ5?mP60slxjf{6JoRl zSKcSO=6d@?_moA0Ks@!>m0KWbQ9nhCnqTRPDC9005VEOtlNB(YMh{I8G+^MH^mP-e z&(vaUXDFMpJm(fSR?<68PXnMK54qu{FoSBG@{|W?Jr9`_%4q^^{V8jlg1~Ns<{Zg) ztF(7aBNrS&oRH_T%ktPn_Hr(@EboZp*-!Lp713@B${>m9}+2U0K= z07Z!R6z;EOmQRa|8D-mkcrih2y6>;L#N{fEmH9$Q z1h|^H$S6e$Vj4m&fKUpBPQ8`by2PcV4D<~0DDv^VI?WThuJxPHWIRQr%&X_o$>I@; zyn2qONMhWm#Z$ySLTd38Luu#2VF}zzgl`1+7A8qc8iLh4($f7bOhxFDIY}tqj|$48 zB7>Q=TJoq652Clj=pm6eJu33rqe6Ek!|mLoBCnE1MP7SUaH`fkDp+92qoSyoQa+(0 z-lw7Pus+pWPq^6KxlmSVCf}NB7T=Eu7jk6fu4%-uD(8Qw?f2bW^G@Cn(TGmydSWIj zGwDF5IgR8OKx-F(i(7RyhEz%mCmQZG4p+kB)5qmn`?4nrk(Dl+0HU8SBC&XA&FZN} zhPYz&nUtX`EkQ#f^l-WAT5(>NsTs}F4Ud}?S`v!X9kk+BaQJTxoC;UVK!*C9NhHZt zuc`o5-UjIB{^Xd#BU%k&hYeTh%z7|&k&}{Zw*~ptj9tq%Y)~& zCj=vSj96J6YYPx7#CgS{a`^ge{-cXUmyk*XQaam@SIk~Qsm`2g)VJ1&Ol9=6ZQ^M-@iZHsROtnvSAA@bi`&E%{XcTf&ly}R)x|7yjX2ku_3}_x%fm#i zYvR1nVO0)^299wo7xrGHEupWqshTt1uL#qWgGU{lfskRKaPhG@p|I|9y}Q18%o)WJ%yw-1EO);C=a zk}LU?)DViRt3u`BP+)5W3iF1njxc-0pb+1?>IEi&>Zvbe7OL){U$b8d8RiKx9#;;A z+liA^U8$3oQ&LlS$-FlkllKg(CNWb+;u8QQhd*zFxrE7*A@DTf7GYdH3vs|)H#J{E zfmEcoXB6^6pL(P>2CFv&8S7|v3PpPRHx}v5#w6r!E7F_YI$Z$9is;zCV3FR65b5o+ z7U>NLqJ6N)&}8ct>dW|^#2&ytPrxnej&L1Mqay)LE_FogsVjtNj*CosAv#OXpoy*r zOwZtvkSRO|Bw^5(ZD`LZghH4io7*BH3jTC9+Z-aY3C9aYF`ED|A75-S`NpvnlT8Id z5DgA9mtbbp1M~6|yMBcygNNz)yJ3&t=gj_AOI$(eLd$~w`AaTzwdwGXaDF*}H7DZ8 zhCiyxwgrO#d#ZfC4K3MjfBX8O;SU$6dgRTHd*8}FaJZiiCN-Yd^ZeV{RK}q#&OpMlMdO zfL@b$K)p_g_&;L)VG?Qn!<6`J1J=Nn()_dhYLRX8KU3nGX&i?6hk%f^lk<;RNfnnE zOq+O61TG%OoUS6|dAPO9sBU7gWhfakHeav}p^_edk5B~Uu8O1%+t?w<} zY;b|YaK%bi9HY~I)0ARVUN30qIoZRwo{BL(*^#Pf3)td`j#jYfR2?Zr`&#G3a*FEt zT)M$$;I_{Sxzx_|e|~BNtCm@R_`r+u*%^@1@>33dJEv-`6SS=bIIbG#&=P_=p=T%z z;*=Tdd~u>K$jpc|KG$LR;9N(y!93jh(0ER}=!7HeG(g z+Ff^_=(tl(N9fRys^w-vPS(=YJA~@6s^@Um)uv1)8Gr^AfI_i|uNp*O(cy(_!^{3l zQqbiAmD%n;(HMLg@o?*X)YR3*CuKfFnWZKL{LQK>_d~kA1fWj&*LNWsB(zTR@tGhh z7{|b_v*N70!l{LzqI9yf+fFF2mRMi)Ws>kQX+pwOaFoJ(>F?46DMoRSlqZ>byG#YG z`%v*g;D&7cHp-teoSK>-s=21Z>ADTg~I5J6Dvpx=QCMOWb^ZD2Yb+Q=# zL=Nik$=4ixd>v^MtgnDoOM?@7q2JIoLo$9{3}1a4oOxAACh!R~rWOT%5y4Mwt`>%9 z{yak};SGDNHj^o%t6P~g?V2hSO-(l!+1aC}C(N8Cv1S5(^Buy;@EBOlj5IFmt+$lx z$^>#-jAVb7jr6@ZkkGsOgoQGO<>~@UX6?=lRuUi>URo`RCu{Ts__|t6i_T!RdT90A z8nY=WErAYQXjB;Jq#6d$0ciuBt_?IH#_dD7O{Ey0Wfi8!b<4E1LC(LhJTj}@>nW?-#&tTXEA7hb8Q-2C#WUw|Ur-$5l3f26p@7MP-a>0Vr2e?7)c2%H49 zW+3Xe#9Y8ZewKCf{DKz8A9WokXp4_idPmYx zMYYpunn_cr-U$0MW*7+~G~k$uE%hv5abGWCf)Q@tN5X_(mwKXPj7A?LF=N*2H$K}MPho&jh5Bxi+{J!H?*0aHZxkD}3?z;%T577VFft$va9_?< zl#kfQ&59gA7v^FN=qG;FSDv2_zt4u>uleurGdhLyY5w_mFkBr>YEW^^){REuGPo9) zg#1FKV3X2?O3Zbz6tQG%Y02mpDw(cWFBfIq(sI!+Q)-3fqF<(Dz#ZC5Nn-k4N|UYH zT}q){%1{G=Ab+T2+?t&j)JtH+^iS;d6%(VpePm^I?JjJtEEt~zFAsXB5IFcMRec80S z6e+w84*tdW&bNsDJriPsxA@)g;W_kWbmcQdlgU=p5%$#tpg@U6fS23VSN2r1{t_6O zQlP#>a^pMhH$(q;7<#z=f8pb)^@SQnXq{$RC4~c^Wz}gq0&n#dMsD!hPl=J}O7G}o zSd>{OPp3}u(mLrQ5sYm{tdpndBdc$%wYb=MVU)w2Cv$Fq0f zRhm^#vX*;-de(|3QH>nLdb%((wzH8|nSx&&9R9Qwd$>JDXTg=6t=mf+E<{$(>J}mc z-?7wvqe; z+pNsFyl^5Hd8=SjJ128(D@&U%6J^)5Uz>AI6uA0Q3PUfn1jU+iGpO(jo1+s>bh>ac zlAV(pgGsX2OWE#N+^q5}+GYwSKBQr;uS~5PE*J^BLUW73;S$KV#$Hz}Rw<*bx5Bu8 ziwyLGDE&P{3^p~U62LNEw+ld>rCmY>xrGfR7O2Ifjw8N4Ch`#p!b5F4RxqxJoev)s zzbGXa3f)B?n3l^XFoF>{mx;6`7(U71gzPFc{MUv~fOUpej2Q$&4m^#v!jg4;?#LGg zYO!i9)&jh)mcT#t+P{$mW*AWd(}am=?|p@_%QcKz{+e8T2$vy{l5IlY6EwM{ZyP!C z!^$eQ^-`I~Ea&+~&J&h%(xj|Y`@mU<;CQKJ#Et5Df9Os&{28v^u1#AFJUR8+YQN)2 zx*n-yC3%?H;A6+Z3AGKy<;fQdHerfkOMp&w{@+1x1{*Y1Q66l6T?GcxZWw`$l$iBv zb?E0`Y=@}9rfISxA}H%fe9f;|aI+K4b)aZWb6*y0&@8{oub8(~G;%;`F18ZFf}n5J z_`v?a0QCh5(uj3o(oTxulbHA*0oY7O#!PG@ZL8zOewuR0#=_*G0xvA{OO| z)MC1$7-cgM!iI7wcBT3y2w>BGKSjcF-^Ekus)J3*1$v~5(Vo(8c7V2zX1~}jWPLMM z^A1Bl=@kcMDKa(DMrn!#Vqcpf2_!0qlcx6?OfMY*y~ka)2UiObd! zNz#xK5--*v@rJXVBX6*wOneIx6-^R%M>}-X4l7yb?>aAP+Tk_Hd_?$X;|MC~9Kh7% zUj(;cwU&kHb%BNM7XI=Y-58!p1<@ACP1E!p=?+rAAtHIC@VLT)*vpA`(72?4>LhvN z#5<^5*Zk@o$#HlWSpt+E<3%dykeqZ90y5vsh(s%&mIj`DAn>?5+ALX5?n8sRd9 zSWXP$RfrjxW4yhAP1%~$9{O+?EfTbCC6+OQiD;Q1NjQfXW7E;O1A<-5WjuJRvRJ|k zOyUsrOrz2!wV@;w87g*3alWKKt~Q)wgNXG;cT`L=76MCyqGLx*<|S$k%j7eOS1AqK z$QKSIM88Cr!IGWi^RrhmP!5r>_oRiD~oTV1&D%RkpXy3;YvNpDo!e$z&<=dfPl@T zB{bNjF^jTUn9?o~`u1qR*~G&wHBZ$yVjScq%g+rwOc{qj$&%dKki;g z&+=>N=4LI-D?kEEq=zB2(SwX;-}?PO{^6f<`&Q7&m|~SS>Q`sAC7>0T>f>LKZ1|T@ zg4vX~?tYC%%`}WgXZn}7)p0}Bl^Jlsv@%99C>8!5{+VLk1NKD;l!2KI)>!G8{1u-9 zO9#h&wWS{xGwhGjKJPG7!GnVcghz37$_)3{Uj0JboN{ON2l1O$0Ot{`e0l0)o7ksd zy!$DkPi#+hULE9kRQ~=7OM0}n9M8(tvUh*kE?4d!V~2U?T>2rg|sdy$8LzZ2;%+hVL2gkoqR$27pKxEYA*6;TZpBJ18 zlfIanh-ykFDCCr2mF3OKKm=QKpG)!obXb9_=l27a-O%;Bdk{yKNv|;TI6E8i-fQ z-ba9Bdm6;@718$1`XI)kW`*8q8{W8)RhBa+sj>)Se2_vtHHfcByzwG}c$I;yIEYCC z;#C9jMgR0VAihM2)dq-H1maZ#@d}V#X@K|=ZGwrpK+I>c+dR=scml+$4q{MCWI-Td zfYgGJt%tzFLA~m4pjXj&=yNEY8|=$b)p|eJz%4<-5JitDcbENlv4hmIf8M@4n6Zz` z6`C-dV=%jUPou-HDC0>obUXYi15pN;osVzQ@40+@^Ey#oO87>|%xE_i50;>Rx^b%JHpt7C*1}s+r)e4|m1BCk;AOv*Vd|b0W zuIMIijhJU6QfwR%Lx5|G1xh=`&SBR1APbvY`7gyLtcl0a75C!Jhh5AE{jMuguxK2) z&~B}G25XC*M$l0zK~Wm6oeop(Hk1O^bxY;ey9Zq}q3zF}X?f9Y1myBJ9j4xj%Jdql zu;XJEdw_j5i-j%?E}m7<|WHy_#5R2*Z0ELgQRHm54)yHS??q; ztEYa;_gca)U6J|?Uih#uMMU$O^2?Z?%x+TLRe!_Urh=yL`kQ2J>-xF}%NhUK0tuyQ zn%BRSXV~*v%~p*Db&sOvDrAL5q31%vLi5Q?MKl) z;k+Gj-gasCvu#9qeoPKH(y73=8_OMv>UN_{F;9T8n6?So$j|<;Otd8{9bO=wlo73& zGcA`%StK`2NLKDVkP#K-3HY9`PFpzFcBx4xObw{5Hv^0SCPxiJbURLzFSN5>cMbrX zQhgmV{N+)F=Ka#41sV2t`24NcqXNpH5A)rg_2K$6_5-)Sygq2gc7ZD3$Ot{&$ird4 zDQ;!5+Lw~AiQA}&YiZpM4$(VP+84^jYTNtRCkNpc+mD#Enx`z*G8*3Y!V~$0mr0}|5CTrZ(rVhcu2BAomr04@2G~Yl2qC}pHy8&YF0oI6 zRWmXkY-etL$Il)xs4PY-z`3|-}!{&77{9;9HbI35lu=Ci6~K1m`aqh zth_Ncvs13)vMH}?{ zhg!kT_ZR1fpD83fZNjh5aKHbKmyg9nt#gG8i`Z<#A|@)vZnm*uH#5S<)ZehKDGO#Y zs%>yiAfwoygJEGiLFYzbS@f!7^T5B13(eD_Qf? zEXm|w&yOls2K9r2*wp43x}8{@Kv9eY^Fqk^eoqKGFXtlQT;5`LXEZjRKl2-|)qd>r z{`=M7QS{U=`STOM>A#-}<(slOD++sh318b#9= zCviwVjA`6-r(#L+m7VL6#e^%~q)fv&Gd~nOsQF{&t15RVbLNG|XMzCh_$am6x98me zqBcXkG!rc;a=u3c_L-D|p4KbUVGs~hVcLuulCCqc4w-)i^bY{iXczT{MssFSxV1k+ ze+mk2#xaS1LvOyZt2mvhXP};S@;7PVQwc?X1e^3X( zJqZ`p7Nc_6mk`=0$wEx~n@X}pvCukJE`j5~7GA6EIr#bvS+9-T6dfLJkJ}XVq299? z@Q}7D7I?UNtD;M8W2<6`3AP;__&&$m84NuU{10jk5cd#0YfU`Xl@jK{O2KyLe8T{W z_AJ=$hT58JrC3jFborP{!FD&*o~M!RUe=Zpc6SI!S(wU$0_=>!9^ehebnOAI5%(;m zho!Aeaf9S}BmWq4es&wYOQRcbzFX4XjHcBj83=8=vFx@cbyJX_t4(VGd*a{eiU}`m zQRh4f>*zYJ|CrR;>n&9QmOi`M>oX~$_L^csi>4xKkU=@nF{y?YOt(%qyR~j_)^Am^ z$<$x(Xe_i&+stuLf_<*92F>@oN;(Oe^#BuFne=62_4i@{Q1*507l#67nK&$d50w4y z(#e1f&BNwTcBb{`@1yH=a{c)eNY?Kvu<)+JSHq$;nT4A31;HE4dd9_cu6SzNCP4NQ zrfn{EAoh>nX=FjXsBs5WkD*|3I}YbuuA%j5@zA(e)$AHN(3fs98HAo>h;FsBdzLgC zDwkpub;fCQ7Tb$EL&n{B){NxQJ(3eFG;TXXpmm(B=Hd>t4xN}nsfooMjDiIoH5k$O z2^KYerZaU|z9IV4-p;ytPlaRjN#NK1Xw{dem4WJ+5cnk3`O`Bk9lP)77!gO!a!wIR zr4ug+qcccvtA6=TAgosaSW86ypZxE0L3$fkK2I_bFLxE^0H``uriQ3S;RtBYd_c8t zWA5NB9f-%NUFXT#j~|DCX6!gT@F@5A$5Q=?qiO0$o9w#8b5}IdXOK*Kf?rd zsMyI55%_h^lp>{&OIl~E!gW_i^PvjyWVJ*Q6_q* zlB}0>Mh@BYW_7!GT!4A7oH>Q$CWyycv6G{~2GQZ~D*MS(+ zV7smi259$EXl^w_Y_mcSAW*SWUtmmV&f@S_Fn10=uYXWwY6AF!PD>}?3~f*55pOTs ze!&Fd-dla{HHNsnGt5Ph3b}!KU=D`7_a1I(&h=8~%9^NuuLs;9%$n73{SR9%=!|BL zRX^=bQ!7mai)M?*4!7=g^kOEg@@b|7P*hub8~WE|*~WyAp>}!Kr-*i{1K!9q*{UD0 z{o%s#{84SAY2W!#jwCmDN#Yn3{>*EJzfIFsd4glv>i$|$>dY5C7L*LW4M5x*nTJC# z_H_~-lQRI0QM*+n^%D2&wPFR8)N(%?npaaOap72TfFY`1XgYRfuGtmuA*YVL7ku7J z+Fh7`YD{a(*jMz)i3oevTiHrlNLRV4#dUC|XS~&-NzI;dSc_IQJ-b}W@b*#a*x~GU zzQNVX7PR)kQ&~9eWKW;xsVCgg6C4t{;+%|pBJg+P7DRhgyJ(!mBTbKA<~swJoBFJ- zXJejQ{4DPo@(eeve!5g1&fdwF#K~C6=6`S49)v@u$cU#QHo~&_x%~6C#W@a0Z$xuG zcXHwEeQsD^owY(~vf;l(KqeO1*}OQ$VD$Pb5mAUyOI-@@`9)MT&j~O}`9*0hK+%gi zB+F!6;J3QKrfECG&A6yj_>{arG|WhC`V9wf0arYXPgsL^yqYeGZ{ek=?EO3Weu%b2Ub^aOV1=h3LWql}h(#pR*8M z1{H!Aon+Ssp}`pvbppGAI>F*1bwWqTLP)-zPK?R4fKsW($6&*(4wLcFR}5FRU(P{4 zEKOIGdol;xl`&q>w&=W^a^^6s&SUSO9>6jX5nBiWil54@ma{$zSc0(KX8CMRo3KgE z9;^*JQDAL0jcX&GtSC&f9lH?twmw?x;FEafEn z^*GPxj6igN*og4su22a?6L;J~$&ya1LjsyeLK1q>9*~ogk$K;8jDp&-n2*HlO)U zx@NCl+vpX{KXn6+UR3b^lwtk)&6F|Ou@`9M?=>1h4x~D*5rjp`utvU`GD0Jq>|`Wj zAL6M3`)LNIu#zV=Ku{F0hiIkBVP}At3Bv6F4F!7S6A)al#JCcYoVD^pXVQLx)i9ZB z0?q1dSOUZPNfdhVFJlUD6OJI{I`&>PnF9(8hj#K2EWvJYv$;3~JEJ{_vhFREvm$L; zH4YSb!bn!puf;0ik+3#%Tr^$?57L__?0}@vxFMx!+4$2Lx}D9bh=csum|IO2$c4jl z2V6-|Pt_f}sVz%T3PL2*iwLog2MAYHsQzn75!5H6ELQ@L^xPHwjSp0RU&b9=Vvi7`+n!H0%6YDCgM`e(a zP8C+cldFgl?p6pF(f%gQMXG=u6*f;~ao3u+bRCfc%u##JOG@o4R(u)c#>KdpO^~Xg z_r@YeEdyvVw6OtAI$$x}QxO{#H=pCIi$7siMrrM8J&G;6JUlLYay7+9exIyq5RdK0;6 z-J2aSo zrS&p*7*bsZ&PbHCtDoW2vX7MGeO)G&y(~VQ#hHU296gF-)$<)xC({^o`IRR0Oq-zO z{R)qnACRsDOXtjfU+|>>*PvIIiAl+pY#Y#Msl^q)y7ohYf{|D*GrB}BmbYduGs?BZ z)#XO6+9O+94gS0n^G_YbOd|m1WHt?QreB`J6Q#j7B5+g}rm{iK9@!V`Y@XQcvThv& zdK^?QsNy}d5^wKlYw{0DCw8EMOA$#t1AK}o ze}w@QJIMoLIp-gM<<+%1Uh-yHm@%76k&^Hgr^AHyn2$Sb)d__OZ_%> z_XF$%!T6lNK@zjhzp$1piocojt|^OVQCaXjcrr!T#BVZP62!yX{DHu^MtP2&R>4xp za`d&V?IEjS1CbLl7wVzkMo&;!U7*cG1$d&T%tQ?c$&{I>g6)8mxt8j52A-I))S@4s z&3h(ji)lgoaje);(5@Mq)WXQNR;4Bj*Tizy=%jflo4{?nZrN)te0OO{c*pl4&iXJ) zn4A>b9?}xj>6Roy)YFR2;DKZQT@4OB1Wn5jOFH>Qcg^s$kVG+cdb*mXp! z+X<;AiNzWr6F1Vd!M*%YAr;%2_E2%KG-ZcFgWCPVa$z#iYXxXULxPzg;}BMHtU6=% zep5Rg6sL8o1}3nh`NwfCwlxVyO9PN34w%`{*EYP5ft#fHO^fg8pyl3>Hy&;sk$|W^ zpS!qNvyQUN3LuybB0|RP@xYo?tXSj=|MHBTWY%Q_;IqC6Gs|9VS};E1BGV$+CFmRP z2Dv3-0oDq=!2Vsxjy zuy#dR(r5Y9XPTxoE*4`N7oTyGc!G((wEp_80b=S&h0PNB<<(;(K|*$J4rp%Y#0qC) z=dBkJgRK|Vd04mBKaI~Ozlifu_ZusVsyFuZaobTtM*2A)TA4Hd!jXs)R# zSba3tP#EAN#$(Yc)gUGUZ?ose$pHO~J;zPo~lKf=0`)X|z4lXdNDBbm10e1#tt@XuGD-3MgugT(r>z3)Euwk?dL<_G~(U zBT7Se=D@aVw9?smBaOCei?p&!F3=7};Ob0VN% zo&h8|@isfp0t~&RBzqPh*qZcY&tmvnl1HCsF?8HQgS76%eVwIpaUzQkHzemBFGckm zlbQ~#bN4U11VVnL;k)3F4iDX4`d&etid+)_xJ&*@2*)ts}5=Hb}s)tUWo2u;%8w+!i9_-NcT1nG{!m)4%;{>ht_5z|2xV3)*mwJu&|)kgU$YEda%V}Fg=+0 z4yv!CtRAGI32!G=-+;P8wM?Z@eJ!h@`bvE@JZ)&N(sKjj3s}lFU(9Rh!%~|&(uz|l z>AispLLOawx5Y>Z(UlJBI>sg&myrAQcHWmB{B&k|Fg=yQMSL9>B&m*FL?ooEOH*jy z*{y^o>weo;jXCgzo+*y8j9W;wIzxVm1?338B;70%CZx@SB;G8O#uE-+MX498+PZPoh8-Jpj~l&28s*8>S4>z@$wXz` zgQrC)6gH8nSS#T|_9?X7Sfj7lG(Lu{KB$Va=0_S&*-vlaY0+R|x?gnAHQlc?>F0Ha zwHh-kA>mU(;|0r7_#hgDxV=5gn8UPLhgcvWK(NIj^TF8Sm`x?+C|nmCbNou(EIv?u zt%Hj`f`zkTrsll~cOKO?=DpM<6m^&0c$JvYVdL8l6vz#rl+z8e#*86sQh%kJ4}?-D zThm$-%3aW!{4^LVHO}o%yscY-S z1!*6P(msY-E-kTK+F(~}pf8~S^1Oq{9%ootN&$I{jx0(6Squuuf-4|gQLKd&c%(CD zQ2}AE`e^A=sDSt)nY|V8NYfNp9t|oyvE_*I+PcpK`UhQy0|8>R zTFbUI8`u0AYQ)t;)EyLg9EQEZ51lF37u@%Ip%3x{BR?t41If)+RL2*o>!ITjUIt`c z2OYzlSOs3tFw(^*9ci@a;!}-Luta>S{a3hM$uOWG0`R4is3=G;b4UREwpaq*^ox3H))}hfDVynuqXpto)FZm7uq_wv%V$*lVfVGn< zR5S)`&|sPxt5K#(L=qTqw`RbKZcQjl7;@sQ@C+(nj{!3+&0@}gGm2IZaez~VWegZ5 zn;0sOTfUyxr2CQAA`LBFnzRgvNZ6egmowUoJZgN^Qa~C{0 z+~g!0x&D78E-{%->f*V8sJMRN|8Z~2R(<$d*v!usgg5<)-DQz$gv%wkx)ji$ zm=#+40ygrNCi4t<+#%^I9hkQ-lOM;mAvZC~2)Xs(hFPFh&~G2pWEBe{AEqJsnly9M@}LpS@6k2}YA za(mjrvU9xs;G^&oT*wZ{eGHurhwt_U;R^iaAMnYv;wZTp3Zbbpx- ze-O{uTWSDJHSs4+s!jN8y8rr3Ok(mO5Cz%s6n&uy$d{m<=<9quCf!%o*7Ud2XJ+zj` za}OxZAL&gGs5BQ>4u3?=C|-_5VzZ=w&Ek>DPvh@tA<~%hZ=uIfhI+2Z{~Af)q``Gd zZ*=|>d-LSon(o47gLMuDx3ZEhwrS@KEc!x$TbDWde+#|aWct_rjIE=vUW`9Aj*`=8 zJUFO9Rxn^|KHef792RIy`h{3y7Pk1}>errG-Np4W&vI~KZOcHJnlP;l6b#VQMS2nZ z)C%U_a>hVUoB(xPQ=%OoJiMfF+eK3G;+>}y&j1a^4z8eP1g^9$!DzFIM#VE4)P5ag z4pYI+npKWKrQvs!gp%*Sqd}eKmJ9a2gI)v-lwWQGl;Pr|G>-rh;kB0i(XzSznD7Cb zGxF92cV!;H^i8zv|GIn>(6xgr?w>5n91UW{c_nSAZu2|UgKJHu0T*2A(FZq2SPPSr zDPu-5W!U@a$?Rz|8Eu+O87=C`3~qK8SV)G+MAs(nicco)9rm$JCceaM>&W4ZS!Xio zpe9KA#=K+vEJmZiocMtYa+mlfBpDv3l7|}n; zzm{i|KKwCQ<67OHDc1Ox%j?OGb+8FhKST2`ThzZ+pgGfWcieRmyZYIe&=*aWDN>WH z8p?Q)tQs=dP94swrDqzK=32Lslk0En-!0;}#RPDR)S9J;-5vC=EqwY4>R(fnvaaU( zQbgh&x~Gkxe0Ua|lBcCkaj%k#8H9f&v;55m?;5PA#Qj7iO*lK%o%Pkh^>IWfy6((C z0!d%GmIi!hz!7{HV48Oic3-ng|MJD6%KDudzlhGf4#yPZ@@HE2y>&3EyE3&TSYNrg z&LU$HV-GvVN*ndQ1`YLU&2Z~ogOVaax!6{2xo5z~hPK;*`d0Rs%z@993v>rqYIksi zh+*aCdj_{zkkEz--I?uY((A2qs>)p2q*zEAG>-5uf(Qn>noFYr!1m|%Z@MQ z^un2_R)aP{CtDf^lyk!R=x?bW(}c<6jilRh@RWLirYCJft|@&t=xw}f0E^xS3<#$j zE1zCczi3S_X%ttlGZ^kb7)*(2+?rE?D3t*&%*Z!6|@-hD=*`l;XgCt zI0Ja^9vtzml}q<O ziui~3Q)pHpXq8LLo;%*8Vw>I$g>6=8*I-%>B7@DzR`uz>*=lps3)1E%eeV#zEn=WPvaRc3c;qL zup281md2tq_KFsjGp%a8PlM3zk2Y=2!cXkJVmudowW-m=W75c8Xk6&3susHp+d#xz zQRvr7VPRygS$gZBKM#8}h#Ntf`fG$^gP$OgVR4MIJ7qDb+W!z9G)N2^mJJP?2Azl< z%C(7vEbYX&K<{{fnsNhh-#D7#)tn9G3WU>=IwO+vDb?p!Oy|jz{Bm9nG__Uj-S&F9YWE#G=TYXxh&av6jHXurVLIq)xm&_glTB*YWC^~A&U;zCsWoR4wZD86BPYVsT6@A@|&(BvCts=5GIYvHmV@Jw)l zGK60~5bvxy-DYz5!t0vu7}6K(=2#+)9md&m@gq7UNknF0k`KZ7pVsz9Nw!05Y)&L- zo5&+hne1y_C;&5;K1il5b1F=0EyER7d$aWu9YE~GcdQgm`Ym(uJbr=8+Qsz@n70>P z2K7S)D#W_CtTw$FV3rkuD)eOcdWKO~ZzHTf11`(?F_tiveQz4v1Z;S|Z``X2VIP)1 z+hdmE%)`7rNZyZUzZKk_1srSEnE%zx|- z3pHghZ>@&Agi(NDdn&93m*x@iP<11V6O;Fdc2VYTP zmd>)fr#yYyoGPb3(d)>Z;-fPXN`u=sI7GQ*xKYkS_=-Qwy3rP9KPq8BGVmSnoZz+u zkBJtwyHQDB0gGBt17TSYQycgndv+2%#Vu-g!?QN=*DY^+my-6++s8d(=W|JotbsT3 zM;e9U0f-IF;Q=-!>h4|3Oas^chS=N$M8>7sF~tX)+sT&O+)lT2MjOTx%`|RvGgaP% zOtiV7=+Z&aw$yep5ZSg=vB+=AYy-{tyQaxnuuh+CCzh-P(Ey!yYW`djl@rv zy=g8LBFLlU)=mOYyrzFdswiqH$vfx8*1lsre*E~s4`J9RvM^VDc7jzOoE+^I?WzLV z_IKYkctcdUZJC5lC!fC-oD@d5!q0ObIx$+U+Ag{bq}<_Bj&{Hhc8r!#zjn9?mb|O~ zgIKgJNjr6(Qi*qpmGQ8o3kZ5fkz!Wk?mJ-vCNRQIv@$#Ilu=uHVMco!e>cOf6 zD<`X5qEfhHPhwCofn}m}39+@>Tj&qwRj<8Cxw<5^?2TY0OHwBk8oYe-V2&Q~EMdbu z+M0DG4mAp!QBDtC2p|>2()fwY%=3{7Tgc}pva%#h6xs*jumh0Qf)ru0hkSnaPUJ&D zYvl8@FXjgaDu_&g8Q(-cKo!Rx->fvCQ~kFnt?f4YuwQAEDE(~WdMinU@vC@J2eyiI zb(fOy>Afzs_qiC)%T0Rss^pEeKk?~XQatgS%RQm0o65D2N{kys_o-66IAj8$4eSIl zV26t+dJEw0-N%L3c(l)tb|5^^sg{PXGb-;@b7qlDvKXas-cD!lOu^HRZ zP!C)q5JL0G4#RHEj?@DKrD1Cq?_t0v-qTbMxce&%0nIL?_*m+}W~m3ZtI?b}K)sb$ z05ld)>H+p5K|is#pn5aYn>9mGoa(Ss^5(O>tR$CtvyOVe=@Rfgs0X+*8xg{Us8SMN z05SEzAQ069Q;=YWwI&4izZLHEim3-`LD+)DEP_z#!Jt&IcX7x;tscyyHMA7tlQSFo z2Dc5V2b;lQi50wF>yko?mSIgr37gLbSJPxdvkqW(pyPujkjq-0%-`yFW}~5EHSP=B4Ge z%t*w3Bn@t!Bf#ToM#x~d-Sd5N7;%)#v6Iks4gwhcy83--UQO< zRPg^}?`^;?yUP0Rv-f$v<~h%qIWw8hOhWcKGfAEVB7??cfT+)&0!aiUV5%wAI&D#> z6SSa~7i*9~0|t$VioW;~ee)_Btfa;o6}_~Mf{Nfr6+c^AM~z~YQmRzZqQ1ZX|6XgI zea>?xnS}UtU0jnq`|P#%ULW_mzt_F)g&ZRN^AaFt1P7i=P7{7dyJ~WB1q7gGuT*V4 zZm8~n9zYpRgK!X1rEPfZDr9-k^SoOb5|$?WxS2ROPMW>eNAf>DI0$oS_T5f}`*gnM z5gB8CpIAMVc`=oJZFQ4|5tpM4Mj*OxXw8(~f@FY_xWHRLO~*ABSHo-_ZF&w>4f?nrqi%JMn_8=8>;Y`zxyL%tFv~q7lqFv78DX;fH9|#b93wbUK3?%5C?6FA>Y|8= z*wAo6N*KEpdFDy+fEYQ9R~7?<)$`lYLowiAa=R4JLqht#5YE{ntfYc*OU;$dKEeou zj0Z(w{RY%z$8{sD^QcvHJ9yZ>{Inu|578y$hDead6`cUg7xNc_w7MW_Gf7Ipo9OO{ ze$~x51s0IbN(ye%q_uYZDWf-QCHj0i;_wqUt{b#>!c-10nLavQH~Z5K%L;un6=*|D zrG0}R_T$YDz1_KzM`JQoOn7+DyCZki_-~X=p27d0HQ8LZz@L(!=&EfV*@zp)4Xu>#p!N%Sb7W`bUox>IV4DG>K~_zxmX^M~YAN#DtCoGZsA>bp zu4RuI<>l8qsK0CS|MnQt;xO#3vMGc-tZ2u~gD=XR(-XMag9+N;bf`4L@^Y&Ei+BZbLX zehK#Rrn3FWmn9dx!&vA;yUq(| znoB$c-_6a>EyXVk=s_jPdZ7n6*MUGiPDx4ACWTJeMqK_hHo8iE!X(;R|E2NlBLkOZQ=rTUqb^m6(xmDoMYhPaeIPVmaT zG44|k5sfnul!!Ia6siiZBjVIX#zvOqq)XRqtJAjm|~zviFpE6>5P{Osr$n|MLIQ%~#X;<+L&9Uq8Lf1#hm+fprF7^(#dboRuv znEQALa;;m5-)!^5pRKbeUiqb0vZ{gOi|)NbdPQmeeAq}AJ(W;|ycju}mF6-JXTrQV zk~zKaVb@t6a1T!xHl_*n`fK8ofqTg8qxv-;5ZU##&tT(hKxFZ><2W%kCidB%#Tc0U zHjKgkEl#QhI1`8+zINx`ONj$D{Gv^+X|f#|LZQyH{b*-GT^6<`IS*Nf+k;c=$GMR3p5ez~)`X}fQOzlF;`# zAv_Uj?<{Pu+XFaUrw2K~>@=R<9Ij}bnq|6+nidpYg7`C`$OOo&F3Q3kG{f#h1eTdX zS_Y-NySfXD$WoO^_+n{f;oC>yPcecs@!u>gfqJCJ@bE^W}dML^4n+rD;?~gXa3a> z8|;s&n`YiU_}i9kv>kIaw{ydjjiyDK*D~4ge+x!yTFy;7C)=>*x-xB6jb>UCE9si2 z7o?CgeMO?7YAc?LqTV$gd2acKQa(AbSvL^>nNVK&!_&YFW)Ub;CuR{SQ)wxN^9QxS!pjG(AkDT4x|CMMCe*5wA0KC;?ZCal z{%KYtE%#W7+Fx4k;kG(-I^ApC0W}EW$cpD?y%%pV-673q(~D+$RIYpHy`>OcoU95B zYX^L@#`GAr=I^|w_!0vLYdxWb^W3u6v|)Jk1Eer$GD36)Pke9!Y;RPJ0e`H)TT*D1 z);qFad1EBkedms~W%dJC>Z(j4n6Fp#TY?#f#D;#8v4A_i+{v9dt-2f4kjbeTMiF1SX1zUdQPfj$ z;w0Zlc1zLmikfejAxCoghOdd=6Ef`N72e;78DJ(VvUyB15&Y}?GZ8E-&qT1WPB;FpX2LAYGXc=cOo)q7cnqTQOgMd|xfr1? ziHm6_rY`@vnW#e-PBT$8LBJhyK}`vQn5{8d3L!;Q9CEQ;hOqIkd(ZHyM%R+mv zlmoZY77dzG30Z0le4DNvsT8$v+a zWr>N`0HHPJ2ChtTh)-{oef!V<#t%JBEKakyhWC%Yi!14!;il4nK=? zKBs;s%m7fBL>o$AUbMKQ816m!U(_pA=L{+z-FWYaN2WLFL!|M2s|+68dJ1DBI>095UNw%Drmwtb<067x1!k8+C`D) znm5HNFKn(ei9d?DCak=vU(qZ(UY`EELe@rZ@o#$eVa{pxV{&5lliF8ie-U%m>|0P} z=FIHVZ{lpJP&`_5h0uaICsVfI!8Ycct=WPHGt-=tQIu)r=~-!m%~DsPl4kf9Qx8PR zaFsn+9Zknx2&)faPoaAxHA;(AvZu213cO#E7Xk!Oue)A|1&%AJ7pOM89L7{cs$}Ku zACP_(%Fm;Nr3uce6nbH= zK`~HRTvDa(UWsh}s8VI_)tCHl4iBW%g9nN$;JDj@2Na`Up;`qVWcRg~ffk^`dA-*< zeK$}cnEDhI)G(+}8cwP<2kS=DkCUq1sJ2VSGPFbg$2}CcPljSqgkuweAgu5s$`;I%wDjjL8P#y@sLr zU_G27G@^rs1s!%^uM2PaU)vCQ^=Z8)b4eY0^63`Y5^|<`w)UPX=2DwSoBEpGlO55( zfPB)g#>0Wkzk{y|Z;lY1-m5pb-n}~nAUDfe;gB0I01g*x)`*3*!{0CC)<8tb6_rll zwQmYZOKea&-76GSw<-ZVd!X0oXNfd?(^B!pni}S?ACQMv>0!BG&eyY$3r4P<%mq8S zdOpSlnfe;O12&w83+jpfpFKm>_%agOm{oRPA|Zqnoh2zcGQl+Uu?V3wnCbgvvp11+>6Y&+CR}Aem{fI?dQur zn@Y~kEo7bsoB#33wn0N%*Wu4l6LL}`yceA>j!B17q4UKzx1TSL%fL%OQ2)xXwkRmX zkA?0&C^li>d!$PKbj#h<|xxKdVsfSmE()` z8V>8U+b{VT6Og(?Yi7`|LMhN?x9@s+(^$knHdcOmk<($G~t!4-}c`~}~ z*omMSjzh{<@khxyA?8`Pt7X53(BM)BLgE)@7-_R+%!n>_B zQD+m3L)dMHerkt_f>U}Kh-fBrO7O&u;vA@i^;gwh4zK+o<7I?S8me>-f2KA^CUk*q1s4n#Q6Z4WwhT=SH*90}zUeu2ekFjYfkp4?6ZW35o8953{#yOo014^?^ z{~DQ|7)V|@lM|^1Cn?{X@)dRmVgX-U^EChu}` zypc8v+Qr1doZ@9a`1REwufu6wPTct*nCSyBUr)Z?9!GqCSB+@UnOlNp>P}BQ`gnV8 z43E|$y3^Axcui>T4?@DH9o?3Z@bS8)rna$rcj^Hq3UEhngv*XC=~(RU)&t<6P_+Z4)C&TON zw`ma?cF!O=(z0f^{dBO(_BUS@o3D@*)2j3fN!ScwU?`(fyQxaB&{~G3O@BF8{NgB` zkpJB;+*NyT8qL-ZY8u%He*4(=16#&9FhMkimUHuPZDVyH?4@Uf#^|e>9h?+SwUW-S z=@y)KY}*G^o&i_%Z|#+1dmJaJK@iPQJ3VRPjHDn!2+lj+sclzz5@%`VH$Mu5lF5;$ zO4K$pO;XhCk@9>rJMS3pJYOF!jBXi#8<|BRY=r2;qoFgBA2t0uPQ3CClnj1-#VedM z44~ba1=AS^3_y=BAahzzDP6mCFbl$uh99y~G33^!KH+$(NXMe$Ykq@S)30a55wlDxm>l-^EpG9NefU zX@cIS6^)_>WI{sOs3jZ zz>_u+4ii@dlZ-ZZgHZl-cXVYU%(Z8~-cm`NrtVY9Guxb^db1-sM#O7Pi8Uf z7aY)(*^NX5<{GPk3q`)es^`V*HmwHS*_Sn%-0Uo;1ZWDemVk{HlF;2Q+LT5vIs_!@ z@tD`Gw#X!qW>7&VkvwwW{bVwq^zYNIlAGWV7JqH;Mt&}#03VF3c*|ch8MY@+x63bs z77l{^>=%a6eWKKo79sRY6pMOq?Ax^X7Hd&3x>WM?^h#_d{#}e#@a+akbwZnjGj8GKROnxFZ&{eoBbhY-OF^8=ql;R19 z#BP^l?F0tKCsGWAyXG%%3u;MBvj0G3PVJc{fbUDN0s(>fTpqC|bG#FS#(QZ_D)dQ6h zSgC^jFl*yKWWaXi_!0yaPuAvEu||V+SNjqU#Ywh;Afg1>>Qps801!nw06$}L3f48# zIo>+!{yZjUyBnko{hW`3XtamA5Xpfcn0@NcLG>p$F)NGTw}?4zBbMC6EP*5(@Z3ia z0?1wcIL2Cgi0`aUiNI>OyzckmOoxXD|akE_TucFkq z?@bE-wB(_80wt!$83m@r3w|kcfHMd@37InO#BcV-SIg4y6_MjD8yOht5xL3+3Q8dJ_Tx=miQ1EyjaKWdTkde95IJMu!Dxhu?Z&h9pT*truH> zOIU!@sxY9i04McfP*3w-52;CXrN14+j|EsBn5PmJAPWJaStz*|@jEbl8+iEKpc(DV zyGhM3Z;SJI{7|b)WkV_;V^6-8nBDH2=K+(#=0uzs%1@X zgJY)x#zO_$4QZYEAsLAwO%0+ETz8A$$zl{Q$a==%yfzll1r1SThmp;>G z#q2mNHpZ-<-8bF{rDemO1T{cc=OA^w{b+1@ysVa6lHo?m80Acq$$(fA+#FIVg4R&L zyh}-L<8-b9DPWYk2T8FD+IN7Ay`@>jTSMVt0q}Ob7AO#_7(Tl~D{9uYC8JgjADNH* zx=nojPWi`Fe)6=8jnRD)7|4yKW`yh*D)?Snp7=SFVq;zET2f9duuZbE3*HD#W21;n z?vakCrN~};FQsupToJ#JfMlWUADI~5#{gBYz1y1t`5|d-|NQM_FNSt|%5;si;=nn%fyfPv zIVoAn4c@U>N($YBjH*fZxENa7Q*Q<9m$#ZcCWym5(PJZ35~q74$7}wSdo*)f*Qh-t?ra{ZJF#$v`Vz$})YHikYDVci6gM&gAhq7>0F;zCiZ3a9g1H*egWm z(78ImiBfd5-CYnxDLs@MqtiS5N`kc97#(nhfViuoGZ>}et-!Sb@(B_40VVa!pK8{H z1P7bFMu0=4Jvs;i925fh=H|nrKV^`c^{Me5_!|>UH&A1B8j%!1*-1r9v!^4UDecJC zoUGMhuQ^X!cx3>qJspXZ0?#EWuj#^Y#Jpnm(Sa93jJw7|I2bCOw6BZQ9~3v?D!n%* z17-ajDxe(n1pxK!aDaC63q^U<1%mi9SsGdWa&Wv`xVX7UIfpAQY}l!}phWIs&=>jh z+al-iMa?cL;7r}k)W6kme>*0s)mt4JrnNh{ZX)gO9^70i(JW5{k4gW91v!{$%^nxK zfou&3X#lbgOW~4F2+znw1`^Hopz}^jhoEsb^Nxl}4!Co3M|Sd%oWc zHZ4pNBc3YpksP=llOluJx5H5H(D!lxxkiPXF}Q}tTk-_6sK;_6slu3g#Ek6CNFfR# zu`pJ!C0ODGVau#*7h!J($n_$b7@*6`CYN~4Js2g~!xE!B2&24IP!zU_QIZw*A~_8p zBKr)WF6DAXA=sntK7q?yz`D!GMnme_-Eab4O_tmJdgiGoqK9uLJ6}k-1Sm7J6MbZ)mPQ4b zeAb(OM&8sB{mY-;s-zy%PxtdNbUK0?Y3yTiQEKZLL??gh4zfq-dp{|qTJZoYc8gy3 zH@h+HxLow?;oi8voxuQg4rw9DZtgte-0flPqAx)*P~AaDkW0puD2L`q?<>;F8Cjzo znj@{bNN=2QE6Sm{3FTal*mp+@~ezGMnXFo)%caUIZ%9k619 zE2b~IY&X6{Wu|0CZkNv->>af`2#HZT~P?-r;I=*=*&1`=&);uKE zXV6b}Yk0fp8sCkltWOMXj`ax?nuaut0)MeMO~XvN;cqxk;oo6>S?rJramxCXxVW&s zz1$Sm2TDZk3}Td79{@A{?`lTRbAsPseX6=K>)XZ9^-TUOSYK}Qv9iAWJq#Djf<9CB-$i#QF$e z=5!_n((hGlq?SxbK00BrYW9d7HyZhnY@s|jn&ib{mSCw5{<8zT=CA@p`oYLb%EFej zl1h`?e6bd#@;^Q}43#y92&ZihX{Gg2Xj^Yhl&upttCX8Vk&YCtTggeEz#?+7XV5R0 zL-f9pE(f^0-0ZxL>#dVr(*&eLp``S&L^e8Ffct{-^QRW*)B~OuJz+%J$z6x(4<}vG zacX95ST1moXb5vaF%UQ-;pnBjr6C}*J40ZkN;tYlL!b^mNzQ6UjrJCO%YD3cvYWN{ z)LGM$Mo{kQyhc#&!FY|J+|zlDAl=J@un9%Rc~P+pr-EG+L00=U5+qK}C5p8uxlQi| z&85mE$~g2KJ&sy8BbTVCf&qdi>p>bk1W%UW(uYtaWgwB`Q|uRn643}(3{e$za)~y~ zB0SUXbX1(kB|3&JLq^cgoF;mSDCSZ-&6Ew;D=wHoC$`?Q(H8WaPA?Jz4tF=VCz-6&}Hs^|yk>MZ%re(GE{A zSDs?Ff%d?xtNlP)c0NB`UwPO zf#e%jzlu73z&`aO$)|oqgoD<_->i4!ieq>&T9-kydB~#E+)R`O?NW9`*4z=?LidfY z;{EVXVE-HuafK%c+ganhv*whufX_i`_VJUIB`L+1^FPbqAI1q;rCYF z*AU-ve<%0*K=P7icW=5OU2<&=31(l??6P4v-b`tBiyGu?->9=mr}7u0C*VcDbjE}J z4HX`AJm)K1rjGM)q_d=GhdNo-HhB#0UNOFUFcqjVr62qIF$kEnuip91)!Oh4)y{9K zc8zxLxoGdc{Ra*ny7=%VmpuqeW{R*b#@Qrjg5|PicS_D;`;O`T-Rk{o>HY4adhajB zSa2e0!RE;oi|wA0Wxw%Ne6@-Sz#7J)j~9I-X4W+0y8T);s|tcM0-mNA9#Mp;G%3ez z9BTG-+n3-tBju(^rKm9J*REntc)V$i5?}i_R_*K5=xbs7s?v5o}hh;3;nHmL%>oQskcxL*p3bYA1 zsOtX8)ybb|qKfYh7Gkk`8sw3hBIp$5xtV$Iq7>2Ld!KJ&z77mxhUx=@`ZV6ie8U9xUO|I5!e(Cv3%7`sW1cL zIQW<85dTGLU{|36V>}8k!#E=Cojxzq=a10m5tF6lhbSC5PEn_@#1PO{e7Z|kp>#A% z^q(h3rN_hZq6(=MCnUw6Lwz(CQ#}d>#`_pdU*ypx?=1ls+Wgn;y+C`uK*nJ|N!hK?&XQxlvg|Vw~ zR}{0VKs=q7;;u|~Y2~QVeg*DXL)D57E{-^Ma({|{s!%N*_Owst;eNdh4LAE!U4+8| zni1XjUvz`0hITiuGM68_q%-ODTggI7k)SkI1Nm>(wWVEA=a`w<0cykFh) z?D4Hak3Yx~D$r5J#()M_FuNs1s7G>^tMq6E%Kcb#pF}yU&{hh%wEv#DT znAYE}+P~8Kf9P(X%<8_9u=D7Qn9zTJq^daV#udFvZ~uWS+M28AEA{Aok5myFyeqm> zZ~wk4x)*<4f=6`eHG1}Yk5toAdj?@`dE^?uN?$$1SD7}_0AH)}-=%!m-XSLm{-)a@ z-IgO^A^m+k{2d+=WArTD@8|xvxi1rh$8GUMvxapswolc@}-8lTps{KED_+NuHfj<{>_g=q>hfHh{SJ<-;kB_v6dGKF& zfKwuQBXA0eMaw{&^F~}DBDnx>#6mYg5e@UyA~wcCkZJmv!`D^qC3NXOYs65^rTqR) zezUFugM9*bzrh_rhwWwj{&jc!Xt0un;SSEyFFF( zFyGJmI_`$|(am2|H%pw%OgoCOL9l4sDldT~Fh(Ds8@aR1rF760% z&V|EuhWWYSUeI8#c&4P}5gPer8X<_XJ<9K2;`de09Da4xUe4Wr;*M=$GGI4;k>Bhs zglS#L-7j!Qk_%h7KhN(#(jzoQafecMrOK{yiUQ0+mp)2D^*>~!MXX1VJ3R_*^#Ge4$g6nXbq4Wob`URTS-4N|76zsE=f zT=ujp&jQ8U59qTW)o11!;Nle^WJbcoNhpI(>lD2$?gFr`;Ll7M(7Zx6RlIkEo3(t? z<0MQKpJAD$BSUVR8T9!FJKDMNy^tdOrTw4k?~k~@BDGDeA?B`6WPWKDraW+NtrY_+ z&8jTK+4WXTt#PV~pGOni7jr{o@4v6w52`OeOkX4%{+Djv#*HC+f7Sl63Vw(J#+CZT zE~ZrN;o?#`TI@E6zdPAVqAqyZsEkqNg=6BT)0^XFdqmxVV~s1Bg+KaH(Z; zzj>$^$WIZQ*Y>XJz4d4eBN!8ln?gw~#kb@JesIdaks!yT&KUFP!+=uJZ05+PY(Y@6nsr^fa_t z=5}F?V;VEKSG3nt)xV=EY4XSU{oVZDEhk-z)pJMtREpk0k)k@Pm&&-ss&8NU#lAVz zK8?rs@mT5vhMXcH2!#2f_UV*=7v+c8RzrCr;(y!TK>2r4ew5ZeiQjML_oa$1u3=yt z7xrcCe-{7x4vHDuopp3X<^M(H->xc$U*5h~H~$|uHC_C#y1ADd3CPh~>y0l}cL@X_ ze&I{W#mm!ggJ2SFzN%_}Nk!kPCdw8r(6i(G2>cW;0zZ?CCweF0rY! zbLP~($;8hMpQ2#MUqNq823f&4MQvs@ybbn?3>2UM8F)Bw9(w#9^;mx3{mkC4=;r@X z_eEtw(;(5V1LL?z%1^r9nxYJ<|8w3Ng5Azk?XRltZ=r5c+^^~8jodJ!Uo?CrRK@-O zt%l9p%$B7a{Oy<`6{g6>r%T+fzLb?~&ei*3VlnB_H>roi7qma2n>VO?(z_Hfcx(HU zD*HygAjj=Xk#O991NT>fvCkZSdi(P#Ag@NCaE}Jy?}viNx4l9^!_V9JTq-tUP|y78e_nr(vWaJ=Sdhp`*9eNQ9mL42bgfCH`?N6!fYh31Y6!hLttL&>) zCR*yXKcoBC`W@Hy%;D{v5=ohC!Mfd03%vHTD*7rHv0yB3DExbA`1$R-^x!o-h>_mh zzFP&arT~7kakC~7mzmOwB;QF}4X@q!gwEYlHje3zp`GZ5td+m2j+Dqc84(8hjIK5u&<>W6Jv=x2+ zVok}_8($<*d-cXk2gHqDz3~#A3u>xSWd1=MUPi z*Q=igd*brB1A87{G_a%jUk>c5{1u75HJ7u9Wp_7Kf{=D^OT&luPl^^fE3*0=-nnF0!h0C>Z`Gf?*j~`f^ zKV{JVH@$Rh(0(G9Cl4$KKW<>rcum|rX<$+J#DS&O)p5CMV0pGVXg`_nu8hkSgZ5Ln zyF4yO<8mY}lR^6nYH2)Z->z#j2m-lm5XAU|K@i-fgP^EOQb!M`>&1g$yN3qB6%P*D zUspW`(sPm&*k{1jMu$4=P1lPC?VssAB5HnD*WH8mPjwv)5CmMwxn^^5=b-)Hx*rbO z59zuw2*YPE2s>ka(Ef?acMQVkyf$e6TKDW(wCkA2i?0wmFArKffR_gCt99S!FkxK@ zy&x%uV=uhi%1)r^_D5&Aa=xo+y7~44O-qQ0~Q<&OhVUFTisygdz zWLV+360plyP?o!<2IkXlmp!7t-0$n0lO<*ON|~G+TvyHkER~!!U$VjJvRrRD>#viJ zlfL|svi`0_0``*FTN%%lbpMeuJiGp-roMxu%GDi{s##_SKUvvIlPE3QlRlH5S!tzF zh*lVQ*dl6=;fK+KHnIZv4XE-Q<)fR~t67s@1=BjE{Ut{h1*&-ykdP&8vo2|WNukB8 zNpG2+_OQuhIEm(}0_k}BC`*QYrE@#Th1FFyFt9s~9!*l>yuRk}7}-JzMCJ(?pcd8d zoC(iqe~(??Z{mq+0Eyy^KJTA%*2|RiH;#b#`g$qn%Sy9KmdnTzQ>*Qiv!Yhpz4rTV z0R3uOuA^(kI%jp#hYd_A#e!M33n6|Bn9F z;!KIFGh2O~91#|@rA&xMku(gvMeE&rFlmtPb(tM=BV^G3i}Eiz>EjNqa*({P)vKgw zgjH3-eH>OB1^Zn>!^3hWpi5|)_`!q(l^Et06apebWu(8;-Z;R2dh`LFiCnxba_onT z6EZ@g09zF`kt_rZ^_j~m7J6ofmSZc|bIVaTB+1g6)AH?jT#_(O<OfvmzbSeiJ zE(yTxZ0<#;P-HoT@7R=_axa1#ss~<%Pzb*d0w(Gd4;8&za47H14}soTgGyo@C~4HuvJ2jx4W&bvi`Ii9jEyoIo6! zz+-evLybC_#)M^-hTPU+L~YIr%?wu0M&kIS8nLy<>mM}d%}J!0zJ*3spFL!zoBqzV z-g3RPM2I4T$(;lx(8=hjxPmRu(#s|LxTd{ix>WBIl)jpJmD7O{+(<$C5~fJC*VT-j zYQ^R?r=0Vas>FE%HwE{dYIe0{6T1@#k~_x?Vznjn0o8BTw@lXVKXLHOC*CwaY>1L( zwT%V4%d|{Kwh1`@`tTA|cW@eIOMD2Yu`Sma7zUvPRT&&dHKa~XH1?Q=^9+!HfdCv4 z4N@WdJC}Mpos`fry^M}C;Zjv3Rb*flO+*6nH8l-$kE|H1r9F2@rC0TD8N=AetEl*V z7)a9TqB`suptFzA#g#G#D4?1H3WVdOZycC+;eF#{_w7VYvV`UH!c>ELw8#PzNXSCs z4|Q~nMs{eE<3|SomW@-r(nG12f*I7C0wA!iDw6}YC#)0V5V!YSeGJZx`|g`(^|4Kk zkj13eE+bIg!$AucX)o*mEE?_H6{Odpkw?{0ytC?P1s3%;FjQ$~;}T%`*yp~=b6<@K zTJE*W0*VAhvmvoBt4v38=ogY+coH}00D+^ngQ9FRmm!m~cACj@8=YpJ0i0$g&a6m< zqS0B7(dVB3O<1w9sIS?(C^!aO zfcY&Z=t)&bnhjs3nT->b()9P*I9Eb&OV9#t34)I=+zc4BdRB4k_Ka85V5v1;_`J{> z#VCdnI1kMgqd{WP;9;138}&jA<3n@B$XZeAM|ycRSawf+D~pnhUu=3sOUTk?QBHXo z#So6r)HJvL2fh8`76Qs4CY}&BSHy~Y`wIh0x&Ua zyYU9_p0=qsq)p}OTnDq1msxGdA@^@-kAX8F4;lFa&1*U#OI~7+Gnu3Az;>6h_+Mi$ z8P#2Ii3;%Lt0@;8Rlx^41y54JhdaPT>l2e9<7FmBKAXIb3{A7xjC3Vs;bx$A5|?;m1V!M5>iMeVxSg;kPf5E zsFqF2^NpgJQ#%^CoO1eSwZo=la042vI%FcgL3`kLp^L;ymWnYMm|#*z_f791#nZ3# zSrQV7-U8By6dq!qWNY*y!Bsefk(=x~lh?wu_h4M6;B?2)5Co^2SuZoS&=4OP*fQB~1lUV@=G% z+Ue1cu*qSYa1zrKKuY`oDv}FI=)ig^2#d-FGMzINHt@_=P6RJ;fOlb5y+&)Eowo*q z;Mr-`YBY$(=Oz;$zrh||q!BF(DxRcuG$l{pE}B_xIP;lfCb)Xc4u$iWm)Rh!oL9i2Ggzr= z9BU!L&GAmU2)`JmhA{>0>{v=8jBQ!!0)*v}a0g488OLCD93-mS;H?-(G`JGOK`rhy zs2*tu91u|vd_=GzgW~Ezt%x^!P`flJ>hz#CG=m#=j#+3BByYXZ*+Sq1qd%w^lvqNj zD1Lm)cwN))Gtze4=bfjkGD5BYEm1q?3H4aAU;zf2aw%_B9M0|ZnHOCID7oz-sho+evz0ZIbL^$V#%fAmWd_^SGr zxUuvNAf^bTUTXm?5nWp%_gV{JL^K^xWmBtho&$`2nsv(2Pw5Zt#Sy11sI&AUaW+LT z)`elE$uon4^Awf1Fm@rRSyE=VVn|C*uMqxXNYXz5c)!(=5)5pcNgEs$6wD0Gq-#ZK zs@Wu_j%ez(vX&XCG1L@R}7CONEM!7zI}C>x+(rDn5uhRykPR4?mM zzCkf_U%2VQ)t0^6n9h||CjxTHym<1u6XltcE;TcAA1pHmh2AfEsuYuQ|B1EN+zE3O zmZqi$?^>&da%k&h`s!$}-tzj4{YW61)UHYgR#s@!vXDAgNGw!`R=BAt8;J@uRQ~nko%bzG~&1+as7D2 znuh#YjH<|Sk7P?rE`Abcnw!Oo3q2P2{qF0&^@n|M?Z@CJjti`NqaU`bSBK*V|C&UIn?VDaU!b{50y{({!-~GUwekA5IPzS8kyM+uA@=&RVF#2;) zO6Ul#Q3u{SAy%`@C(*`AVD~W=HB>km!fFtyc#W44AejtK3VBhA9wqL#5S=YGH!Mh7?=;(?y+J!900E2F48uPymhOXgVE^x{s{SkME&Xc< zBbxg5C@LD9*Kgvp#N9b^w7)VJv7k!YuBnrni>>y zRd2$}UJDL(wWRN>3*r~NVSI7T`b;>G3#U?En1VaJBjroafL`ty(l+XO=(BgM;my_p zsXW^Q|JJHtc(wxskL|Alr5IG(e`#9*HhPSwOz@-V#-a8~BTRbjp{aF%8P7Jv={;6F z!K&q6E7{l_GM~xs!ihWRFUKbc05EN`tO(r|Z9T{2qOBDYKB5WI+|qcZ50IOc3A5*9 z#H_P0?{ZIWYJr^Its9?Q%+FE`Y63GC^RpBO_PKb2)r)v=yBfsvhsM@#??ngdYm)lS zs)j7JR4Yc&6Z(N>nQLC65%&bBC^xGIbi?S+s`mYaVsBAjuN_PAu(SP*woweXNx#@t zDmAn?vtebXR2)d5lS{cYLGg{1!3efMKG{4|z$+Gd_ukSXKR=hqyu6?|Mxk#hKweW& zj41Hjb9P)p$S>XIKu}Pftv%vQXX%Hcli#8KoMjjhp3I!;$!7h|%12jEW0A$`_)nIs z#%0AxJg^1bA|Tlc*4e-mxf|Y@st&v%FqvxKQH{YPH3G|3m1a-5L6{WJ*3j{Mi-00N)|Zc zF;@Yq%Hb^-k6yqyTe0K_WcQO>ok=&`~DOxM)2#7AqfQ}+D4;b@y4cDt4tsv-F> zUE63}53^f(rYO|hG2(8hoFLO?{SG9;4B6rt5ZSIJvc*L>N4DIXZ2J@ZjmrQq5h6b! zMD!h#9jcRvS{hU$>J{;E9xG86%whXuKz#nk*qr*V-=XG}HmDg_hp2X0y;&tTW`>?+ z8BRMmrDw9?*yOnZH>2XdYE2P8FN#t!_~2+-fmiTJBR^uZ{uxTtMY^~fo28c;CIE`h zv6Usnm|rQz8G9Ncv(+2>wC=^`qRB;i8Fv0>_{_TVCjI*p4^LVXZ@LNXU6R} zPPxRrnm+r3yX_NQ)oEYr^9D3hBYL2P%our3f(^1xAlB$y1VeREtdO`!%LAGS*krur z`~}o>9fJzsc_vjGiX#4&#E)QAQXDyq87vY%B1$H$nQPh7%8Ub`cx?krD^$Olra!12 za!I_ZOZ3I8)Ocoyo_YfQ?12a>6*`*n;TmFv&%@ylxHHmWe(L5{=rbaJ93T`tW4xlM ztGzsqpgE!Q-e%+0p$+X#Zz@f25qynf0V2pE!BFDf4>}7@fzm>K;qKHF*Eoz=YW*0R zE0-rdi~OL8B!|x0L*Wg>^-{J2Umi8l8=_@&r9xDt@v@>Ur=e7LhiIOLrnGNPB|n<3 z(|3O*iSbk$ssJvNefCD^WYC?V8-Pda(r^+^i63-)EF70{L3A%86k-wzj3dHy+1|%P9q@eZuQ=V+MI&MpA0s z6Viur%f0jl44iyl0J4Is2&;}5HL0U04XY&R#D^GJP@fgY`p*jZ2=;OcT2)2KjT&p3L4Zq8Q}QTh?5RoIOl2 zmrD|&!S?-2!NU|^$_)?_dQ6_6-yEK#$}iLJy$0vFX_$I-Wb7}MwRo@SW>>6PUlQ23 z+%zg2mjJ)Z%69T6G#8~WFD;uFGt#PRPZWHGu()Q2=E^3v7ABlyd5s+>O32Jy+&-ZY zhwo||37OZraQDlG^ss<)H{b;3s+3&xyF4T0qAy%3C`b&0Pqe8%z#UwwS9A`hKwQf1 zP#h$gYV(XJi@^derGprx52e9RXGFf!N!DVZ^(mKH=B5a)J~!6vX1LT222r@waT84S`L4HE|ER=doslb{i zT*3)1m9f`cDx-(FRNARbRtBwwJ>6H z@6H*TX}Vc%Dq7=9|9Yx$auX1NZ?3&l%bj5 z%Fs;SVI^W_=}Og1F0tvUkuPa$=9f$^MN%?~$wkW0Oh!RvXx`cQ#D>YJ;nC8BNXg^_ z5!=u;8Z{#LEym z6&Ww3o7_6takz+Z$z#S?(A~bvl_@RQcd2~`iJ0uW)V_pt4{)0uhv^Aif-X}tF%HBX zh`F$h1k8Y>DTzk(`yc)OjqyPUjh;ax;^ePXf5lC!qmo8WHp~WX0*$$=Wofv~jtk zOBkKIiUvLIY9ZG1)%VnG<`BNutR1E`Q7yEDoMUl>B0#o7W58@h17m>?zDG;|NKd~Q zgaRcPfu8$hnl@!+79}t=P-8t%8_ieCn$0DRG6jQU%90G@Z9pOsitvMeNF!={h4CoyJ<3Nv*PZ4SEaS#6}K%txK#9*RY&?Z_Bc*eNn7 zu|{}zYEIe_G?JUC-}Z9il59Ew(hIgGSrfw9Q_JVX!6;!&cACbPEKMg%axDzWk@kD?L@j|{K8m8UMIrhE&u-!(O}0NU2%D}8 z7yIBMeTi*Q{w!@#S6**gyV{_(2yqS|@XO+~+v6X>4^jm-7UC-XGLUa4P zUs6pYfuaueOGatBw=<<31j}H^0xw?G6NBsP8)CGq$_M3AEaysatE+lH;QR-fS5W65 z@p|zP`M!Sas8TNV+jZ`)>HWA9A{eM_{TC}1x7y0ws?#*wsx+Or)$!m~Y}88JYONqg z^1aRSDmpOFswi5(skThN=2Y-9-P~I^)f*G1x|dj@1%9u4w{fa_f>R}b_urJ~OI%3* zfb1)^!Xpyq4~u(pfaQNNSHuJH0`92#8I$$v>nHIW9=nNsj*4Pq-4+p=C9JE)4()5p zZVzpl8*MDDb=>kM1~-993O>$~vAfa|e8QAn2q`3^2tOAk5;{&jvh0tuBqg2eS;HDn zb%Vb`tz&M9=V9NX_9=)DiczvyD#yv*_CEEn*qV-!C<+CN^z@Ah{FC9TM~SE8<{w=r z>6!X**~@T2-Aqv2w7*1B2?}T^gbYIXxaWY_oj)JzW&P3jbN*R-&rijzeELdtYc&sZ zjE-|Zda0Ikyw+vEP9b5oEuIfe3l`M3adDh`zSmJ2nIoI?e?TTBHhy5%S zsEK=vi#>3Uw?*@%^$T^jKVEF-UJnd@Ar%D)s$ssfFrKrC@vs7^xrh7P;SNq>0BKc` z=`dwyk2`CMstAgu5|gY3ZqXb87gVnjFKYIQZcCCBFidu&WlFKX)zK9Jc57Vf7n|*3 z0yH6DZBzl&IRcxu{P-*(ow=Jrl&soE?-pYwW`lUlBO)g6cwrKYW|+0Jca#O53zD^YdRn%W-qfLdDI6~2^GyAvtiu6R7QDmA9mpf(hd){ewGk-0 zm0fHPutXxG%c#L1h{S;ocgiuM)1);53@xjscD3S!k|M|;I-?97-)f-QY8k5@NGXgj z%80W@fUWMTI-?h(knC?aVE|IU7#m5*$%*URNuB$16#xE*xHD?U{3(=aUa;>;pIeM$$ZT6}aW-2K_@QltK2d$V~ zsFxL!N(o0PCBX+P${Z606-ji*WcLu@%xj*#RpES|y;adlR?JuF=(L-OYp8nj8q{lc zW5OYkE~o(Em)QWf=@a;@e3`tGraHPteON{zgy@Ub6|KSE!1sDlE(U~<`+gh)&E7y4 zr;6yQmCJ49?a~gugF5uRqllVFX;b8ub!&J^5jQB;9buQ$>muyt6>M<|bASt0u#4zJ z!=4d+r3V)(@Q!!%Y!6fD(UVqhp8!Skdba5(y*2d+6oHqlNg>QT7YV#YnzjYr%n~yK zPmC%lJs+K>J=zHl6)WGUAtZe~re1k%=k%OM7gkWF{(?P0ADjAZT194aW@Izr1q-G= zMfcr6YH3jP_;@$S!HEyz#^ z5tUjLn>CwBSq>o!SE2^+(=TdO)O>eM(JxSk2!IYjI$u~nGL4M#w z79Z8p)m*S!MmN>#;VbjXI~aN=b3l}3S*MoNK$2ov?ebe(l+O2y~LaH{1$TiLVzw3eI$ansSc{fjSK#gx8MsrNxFiqChxJk9~VLx0C5Np;$lhUZU3acO$$OH%- zG!;yhNuFd}@2Y9=GGX&{2EI>@bD1ROtEy~)J~q>+-?lKVL z5kJs)@CfJD+2??$lA!XO5`kjT!=$rfipWWuO(bI7Nf;2Ykx!Y-a6K*UE(X~0;y#P7 zGlT44Vv7aPirogXDpQ|HBNyPujhgnbJWP*+PNmfzQ-`&MD|MK}HL1hUm*NTO@Cw_x z-7b6omt=3@m=dX7jzty?c<zT0|vlz5_D^^0&jRj)bj64t@M6Ysba zo;WVNAPLFQ0!a`U*izl@CPFo+ar*^Y8|keG!9>c8dd65+7U+f3`r{3JOWO8_umXkr zI<~l)Fy`N+I?a%`*re{L4_Pa_3I~w6&8FP(4tq_!fsg)&Ngb%~b{i6en9Xe26U}?# zHwpIE@1*c448rJ-VzZ%^fg;F^Gt!!0^!XW5y4a1LaFCvCVE)flk4t%bt-R;7D2Qf} z2pdTk*Gt-@=M0Giraik6E176SNRmmF2xEo6$N01*_!&S4wFGE-G)w^FASgs^2f3VF z&n8M^HoL9tsa3?W{804dS`Em%$!b8aU>SICOj0vh_r08_a5{a-B3&mDnfvEh=b^xW zw-wn=D1QP@!kgT?4nKT+@Z9r5=(JEIqopB`*%A=YJbL^h{1`o|5{dQkrznpFyzIO@ zu-i-T_D;w|TRSRqQvW!A@H8Ax z$xEEzz9+SiQn|8X=FNE5ac4n7=o`RWB327c3AIc#=Dym}Z17zBSinPs5a8MQ_kJ27 zGx|xUrW(d{UM|(0MhoBRG#0vL^5icnS0+`3GveO;9%ru1PW2uKyX~0mw1b{xC~Q(M_-3t6OTA!-@gw#{gf7gLmWtl^tuSW%|rx>^8-V-$cVjzO_zI&+Nd-FBxz?Cor$ zvzRCcFXQSK2B36Z>DNCqZ@2x`U?q|GQ{Nj!0!Ks@7TUg3{t1Pol1zT;;;@Gs4{h(4bm zSLNA0!!LO^;Y5>k=2P7B{Q)73x~k`Vd@$YXa;_qJU?_U1HSyB+$vy+(PXsT00GZCf zi~E)wgJEYIQe+ua?Z@1BT}~H`971>s%Hg6ep#%GygBcX+|G9A3Nr6%K4tPmRd7s>A zl`@Efl)`npr402DrSRTvDS*D1QetJgrJLF`$HuTM%_=YnCM`n9)oe_t8eY8m!LWwYGwS)wHSmXJ~-M({IXP%aWeS>Vv@ zPmg|IQ)r$}+X~7S8(U$Eh!HZnIh%6kPVhKFD>0b$_1%@mr=m(rF#IN<$n~%q!p1wI zB=L*hX#<-y6r&$AE{j>NTb!5Al65Y6ixBvfoQSx0bl!2@-}20t*mub!WWNhb?0Y$o zN;(0t@8l{}vbi-!KTSI;-wSLZcN2C&HaOODOH&}=A!^X-uBvzo{?Swi;B$7wP}EoA zGo9moiRMmuC?j;nH{={MCHaONa;72OBpRy4+(RrOJ2Fk|sY-G>z< z&RCW=M`w`}qaWwb{nFO!McVq>HZ2-HTeN7o+?gzt$|svnW}`E_uwrT=&AY_pC@bB&p6e)Q_Y1U;>Mad? z%{}7J!)V~B-fK)d%WTrXEtbK{tNN&^Iu6*$@iJ%7geZJPrfE;|k%SP7bn&oFk}m%4 zE}Qc%Em5XV2A$chmbo4W{M?@2(1roLY$OtpR%`pQvt8H`0z=}#98|Xhb!Ayt{ zK3C!~GjaArp*g_r<69dLoyq(l`U3&k<->+|>2rgx`{i8Vw-nsutd7{(FbN3_Dw9pc zIt*OYYwN&D*tteDz-&5G-lwbb<3RJg;ExMcSjq)|d5C*gz9f}VB&fIULU@Y3TIu$7`@6hR0cj$suk}czJ}mz(Xfx7STafX=oz)np z7ZYv5B$lo(0ir#uSM|5XG~2!&nk*yN0|n19cA%HK#hfDt^ewy;`N12Kg8md6ky~J8 z_Mg9ISH-%&@Kai_GsX*AyluO*HgX!L*cJg1OxLr3gy^RwN{&!wR=tFS>Zi0pwc|e1 zE5IU1*3uCzsob~MyZ1|8e&2?#iq3l^{ze1heK6N%M|dGN>o?dlQw2piXPtui5;tH> zH>vx!ZM)onkEAU;95?8<_ogFw&chAL3x<`LU5EZN5ot!0q8x6pBqn8KqEP%*Fp7SQ zs&e6!6Ns+-@hOCX&5SN5m@+O+Lh9=@cF<1q5zRsbZ0-k*akU6bosX z3Ib)s(M3E0CdAV>@!+n@bOL5vh>d=ssbcS!7FK`xhTWBDVLjUw=OAjaGpk^62EV(+E@?eM#vvBtk>}Gs{Tn#t;B)+e48@XQ-vq>N>m`b!EMPRlP(sAy1K3t z)g6+S=>_!nN9+vj7Yd|>PIsp5h*7N}=DUMB*4`U~Iu>KHWivY_4Cax$%d_*0hc@&u zceOJXrWvT9U?*_RKy<$G0Q$DpPo{dw<9(vKPpo?x573DoKb7{5T&|*ZNyoU*ZEPGr&i@`$Y*%p*a++DH2%>TRa-NJISfN@A~=o{O;F&TV%mb z!;!~HqDk-Z&*;2`8CfeKm>NT(t1-;^X=Ac7Qyc3oR;Hys-Js6`vG z%Ds$T5U1RuWoipox~GO0;lp&_Bo1hvrYPN_Qr$UK%<*K(DXV`FD6mLJn zb(mHsJ316}48P^j^J!u>;^QpNJH|ZzKz(Wq{GMOk3>f3S-I?k&DdXhb756hpk?P;=4GrshoSO9oJ^DDxWtzZ#`y8`Thm{Z7Q02NnqYJWP!=~+GoILd=M zNhd~sS;bs?7jSR%s(M^$A{@9QRFL1X32v$P*=zBU^aV^%*pdJZ!^+Wldj^iWQYx5%#8#o;1#!IDN`jKCpi^Vy=~4ypHoSUth#VBatw}&# z*Pz#85p9zi&Gr441kq>G_iKxpZIj<*fT~Q)NX>SbE@RiMG!`Hy)AI}I);!Bo$2!fN zQ{U$VNYj3EXMA(KE(Vrs*hW60k|sY*-RulQ97n^Lz`1WpkLO2mSEupw12?xZ+k+h; z*B_<_I9S|+=c74VfSi03-MBztD#?PdzRN6{_Env6EdXjB5Z5#*a-s?i<^lAr*S2eZ zWG;6;?1K+f!mC{GET9%?O~V1yk!lelYgwOM&HDYA$y9)rJ*wE6`oWY&R9}Vgx@hjg)5|&2)12*nP`{u zajhOPY?zle&V}rd_9IxpxDXUcz~n*zq-C6tLe`UN$s6M#oK_!>zKss>nO^Gmq`P3% zNQ%VMd-OB_3CGMQ_9bFe?dzE}`YpP)KFf&{RYmQr$r5r*3%$v%J0?D8QEA>d@tozm zTkl5$lv^0TO0KmM;B%`o6bo~e7Ok3IBK=R!MgfesfoEZJ!S`x$JA3+U4<#g$S6X~i zayPcT0ga~q{M$#rr6DiEuJ7!iX$H!yj7ozwr<%no2|VzjNzhDu%q#U$gmFp&dHKbK zRS9u$l$_-5T<>&?Dg#nXcC^R7V1g6@jDwpGk3N)8XgyF!imOk`7~!a3W0Fuy0~u+9 zmeACxH$8+R@&kyn$M} za~QpmBB97Y`yB>J1lo^cS7Xl`nD7}9Gk^c2f8y|6_vvhj6U(o;5622|?yG?*yUjO} zFQ%SU=^XoN%R^8!7NFIbI5+bKx7fmPcgAvPL9*0LhoG-scG*E-F#LY&uD#Jlx>LM2sb`dVO>1b z8=ByZF?atKO5kradmb!>v;7IZQQv$yIo?xm#qg4rWVC`!j5^aUT!MosA#$k5#v3CT zY)6SIj0|)kr5J0#JEoUSu6zoj?|@S>=X)p?=2!KWxur1AIF=bo;asbQtz=Thajd-9 z#hx@|%yTmGndjskeZu>)qmQAA74<+qN6tit;iicr!%)R}2}%)@F6cgp#JxkAYZ}{5 zv1UbHGq8GQU?R+Mr8Esl0wJ5(g2=CMv0=THHevvRah+z#FoX>DnEplQ%yB4>4PsuXl95mTNYqx2BZHmZ(JRsq`Eo(wFG!ohBR9W|$+J#ssHMKQ}|lHazw^ z{Yx52*O>UFnW3kid%N_W!2aC=$w+^mp!udd+o9E8fiM*yRsCp4&Oaq2pg{C-ufW^#-fTD>@_ije`@7JLqsFm|1tj5{cQ;?=ojq_)-obZijo1IwaQzt6qg2x<4z z3e*%2Au?DwdzcWEy|&Jt0q584k@`;@Q1wXy_S!wud&Fa}y*S@f$&1Dkhgv2fSd{e& z|D@JsJ4NhOMvjmJN8SW{^oP7PG!`RpC(a#DQ%q^#3F`>Xq2~G4+JWa=0kdgfs4VWG!28E|V>$t8t6HM!coPH&u*goN=i2mu;+kUhd$b2hi z!7~kH%PbSEG99x*R{|{%q@ElvRVIA!T3mrnuF%lAMNv%bau8lZgFYB!(NNQltNH2d z43!Qn3Aq{I_K`8pj2Z->=MB9k_gD^`!3|F;t4$()MsresPNl&0_UEchzgldf@4wP1 zFu}jKQ(%gJs1&65bpQ&7vX0na+{*jQC#jVWbqd_dM>+*=<<7#0F1VGu%O{F!U@UL$ z6u6apIt3o>8%ja96+zy*hj;=wBftgJq}$uNZeNXh(x;8z>qP?b%cVQ@*rJHr%brv8 zLUa#B9Im%}#E^UKI~`?NYL1D4#w8q$f4s!c$-3~*=i;WCyjeVfcwi8xH_gS@h0wvp zwJ$ikf}Mz_;|g{nnvN^jNh3P0;F!Vn_N-_*)xXM}cN!#ahcZSeP?89$8?g{NG6Qrn zFdw)Q62qCooC-bPH+mmSFW+zKesg+%O!vp8_s4aAJl{tL8S=D$sx2thY?SUHZHmC6 zdtzVZ9vsjK8RZ@%(LoyNKC0JG_ZF`W-p;v+28gCn4gr90irEZm!4y|rGNi1~tTxvr=Wt`YoV%FdBH zeTCB~2upF7V#qeZ%(uiK95-;%J~;6h`UK0pHi$^=!gh4y(r8NyrfdS2o;gS`7}0@;(Pw*gZ&!nl{7z*ObQJg)+W zCMG)J8nisbgxcx|!NH^gRxDE}xYr(KP6wXTOhlcgZ!y|>QuQ=?kO)Y*CSr-vQstI1 ztGtQFL(`hxl+>eowuP_A$<7Ft-C-5K(J>%^M)l?n+Go*cD*zxLD7%B=UG)qgy_v(pH^W{%~BBDW~mJ|k$OUSB|BMVPY_G4RIn*J)q03BSoA)6R z6pZfXebzZcmUzX-T!D8}be+c{!cztS$WLq@)yw^{jzWL1PLrA3$u0sMlFpD_7+Ddr zO18+NrT+#cOqIqGpI#P6w@TEpQ{`}|#re*aR!(kH{j6GcRX-=#nC(}ZEkS%%@g7O}8wH3?dAv1R{E=ai>;k zEfgDR7X}WI8&b?P?EpuVXW+cZz*!1X(7+OQQDRgE)W9t3Rr2`YoB=YN1?Oq$pmIW) z44GtLbRokV2{K8f1EwU>Ei7*dC>5nXL7^!12}(t&Pdf(ikL~Qx1Vo7nLLvVw)?SwE>*Wn0}{?2s33Q0A_WFuW}zGun|K}?eqvd?Y8rrR zC7gxk)lmCtS9apGo{2Rsu!56f0w-92}DU?Lh6oxzlC1w3;=UjJ2+`-OAVH?lRdm^EzXR1D! z`@7vB*-40Q7&8r^fT->5qMND{Q7(yBM(-;Y6|+1MeX4?mwJ9t#D+2XaCw8P(fJ1jz zTbuLsK{WQLp^~5Yo7b8~(l1<;N)mxEPBJV!ewqkcvQm_+Y+jNi@GNzak~A;9!RCn{>s&rFQCwqq!S{Pp?-(I6!En_@Ti;3@n4Z6+K# z+-(TT=`@ryO7_cHDAUyAlmbgV)A=D*-|3<5P7)x2>akhhCi8*&NLDnrHUA_uG!2L2 zwa+qVe+%=)%yjqWzlGUo1Oc8wMv?a$NR&B{=j$y1;^pa?9IBc)!bwD?C#-dzkdmg- zV`3CmeiiK!Wt%FqYCJ7#RE94;VsYXdz9=tR-9VB#2 zqff9+QLnYWc}vy)=GDYX&jVLXHjii#cpp#-EyoRWBGDB&kTzHOOHb`o`EWJOGQ2D4 z1`N+I`Y_m@=dsK7E)z!GyENPc|4Dt|cNdTABTwvfA|uTsjY|kZxV2`5&Y&I9z{A1o z;RZ(qs*V&+8?C^9SFj>6s1CZQR0y9ZeGXy78?Na=xGadgw4@q-7KvXdxKUuZruW)P zjzE)PFdgXX*}w-a{Qqa~U0^M{&ilS|_Br?5^St-mnL9Ig=FSZFIUI_2$e}oTm}D(m zo;?;x5tJY*APhn<0-_L5V(6x#%nC_CaVGWHWdT~4#)=?UN|kkE-@IK|kZ zTQ-qn+L9gGQJS&Cq)Mx_SY&%DdU1)b^$b$-jLf{=!9ie^1^l^K%JQgUg2tt)O_3^)Tb+0rhkh>13bKI-6f~L}`rB2ojJ(p@j z5ewt?b+I>y1p_6p0oV>9j?B^04GD9=W!hiFY7e^Dfz|#^39m_qhOC6_q3cu#v-eOL zXvcE@JHo0s7^|WKN&?`u&cLeZQyO@wOX(k>f(d=LDvT5hs;%M+-GJiD-3LYohd&r` z`j{`s8{#z_&)Rkr6RWTfRWC%AO?nZ!-?mLmlii+5lWh}|>AKWCZd5Vlb}#aj8jMNR zu;z+9L8!2uPfiUMf0+zdG%F#T1Zrym(3Q6}?11#b*^>+Wvnbs6mW4Jnhz4l^@t#iR z0KnWsL+ojQXfC#OHV3Q)%RtFf<{h$Ql-3AQNH~L%#7!Ni+)}7Ti%krqmE&B4j`nx_BvO3_9@hKd;EJkFnjV&dGIGF6k&4 zmO&T>gJGpjb2_t0h4!X^#jOHmD`vjr0#?6r!HX_nc`Oz1I?G?W5lf5ykRZQ+Vl;)| zpyEi^2V^gJbMBP0(%!-i;)1EM^!S{;KwGC%vsA-7=}wpH84D*gltcsDl;0n{r9#zg zlc6_KsS$l(w%Pzvhts?(Npj+tk8N>jw;wpOR{z-JMgl z)R{^+_6uAEblWb|CRC@iPcYj1b@qnooDl!v>7#`B-&GDz7dgcLt%{yr0_W@i9d(B9 z9aQK>+HU%E2-5?fKaV9p{zaICB!if^Cut29lBANLRKpShSqSTd^r!2Y6HRT4rgqs+qDgZl>=Mmm zB_%{RkPs%+C9(6?nd%STJ^qX_zEuvT)G6|Wgaav;A1nFu!A+5wHcl-k3aDkoHq8CY zckg0&rvx#uhe*kK0?f5<$WR%zTx)h>!9-h?2vZUtDKCnX4WUsiGI!TrH`}Z24Kf*! zUyA9qECXz@d@^anWDb)xw9q6&0Jh>cn?H2n+;@18au~5kfmTqw2(c%AVPdejLRq<2 zmqL3m)P1=MF6qkb2IDyCfbs7EH<H1DYSZ zx25?DAdoG9O#6zlzcF1e_k1YIgUI%k%O5KFBO-en513u*1GnpsRN_~|xb9BYvUlYN z17rf-4JJDBu6*^!zx1fsEG7I;rfB8@2lbeROQ$aJ}yiYB6k#+WiZt zE%%oDe+Y|yt=#hrsfpKqNGjwRO4rzGi+UOU5RZo9{C8Ae?}VuRLDQi~=K`B4Fq<0h zYJN&C56tQdx_%k~7_#q*w<}^;H?w(L{W6&O(`?%eSG{6Bysi3uWJkx$%c_Yo_jL>Vxa~s3cO8| zpGXJhBRk81kzz_Ugpj@s)!$`-8@ ziR6p~k9;7T(vHGlf2!(W_r%UYdjRA&VbB@|(PC5uq{hG1EW22M6F)!}5M9GI zR~b&4I~Qz4#WHD>G9;N`d2b=6jPu^Qrpao+0}Hu1T-Q!eb$V619`_E|$sLo#F3W_( zJobxI`ClZ3OKnWrWse@L$O*u3$&5)-%KRq1#-@9+Dm=Mt@LX#`B{NHuXH30xqe-S$ z@N^?1kWJ3m?y(ZAGQdO|z{XX1+Nf>Qn2m?jD$T?$-ds5jYu7(z%F-AfW>TrvsG_4a zPfSG&y0#9s+gThbn(5Bs+d8DuJz6YoD%MARo2yvc6<64;4%ns#Wc@CGZbI&Cwvqzf zC19{3zgrrers*2~mTY;#0h^Vly_19dI_xr5%+UOLy2&s6B(^FNz~mxIlX{stSfe@f z{{uWoRISwib80pYyp>cyyfuvxL<2c!?3zS#iOJG|x3AuAtIFmPZ)2jHqWH36#pt!$ zwE$^jWX_ohqp9)aO;h@`xyI$pOl^)qNwkTF+Ki2UA2{CHu1xu@rL48yTqY;z<>nNJ z0R>Ys@{&hE4zE^uxJ)%c2xGCNPp_p;G_^D_!{ININrBCxz;N`!GEK@6M1sV4QHP6! zLcH|3igW2*&L8g~FL-Gf6b^6NH)p92+I%Y1H!1YWqSE^C+mtFtE58rv#m)HbU8)E5 z(E((D$P|Z&;z?Y~1~dh-pj(q%(=TvO%5+5|XKG>!#t0KNiLQd0I{XT15?=&0b=4Q> z32>+vG9M_hlr;F<#H{yr4fjhi)Icw8=%W=rs^*>iH8gL=;eq`;XXP$}(@2xkAD%(7 zl&fk^?nRnw@&D5B2at9U0a$;k!a&tU?yaMYRehTebwZr{*NCK^kfNF{Hb!q%elLEOOW3nDq9nAK zomfC=B0D$NMb9Mfm^)g5m*((JsvX@is6P8;#~9G8=#_I9L{~Mjr5O7(LrKCxtf~$d zOeHRh(&;dNd1?F)rGdE}|3)#qLrN2krbS5YOn5H6`W*w2>KF5ALkxSa#eeXWGLe#8 z|8_lnEj@ibo;IUTny38>b>@n*-Quy^(#!b4T$TJ`)*2AQ@j>-GK^Qv3qdK1^^?3D-be(kH}n#ngc}()AnZTGs(2 zMK1Pn+X2ks$C_(<`aPTQG9TAwP%eX-SAxvg7iU6JGew@N({zUZ8?At@jPc9 ztoXF)Vg1H|qWV_!d(AXYs|Qs}qrsw-=kte{$a6*ntrwMm z__84FL6)$*nbb{dLES{EtsVMi=c+()it4UEYn*?DS0&iyXN~~L(+hdIckjzz`JS8e zJnh~OzIGAn@&8_+r1RFK?7-POspvR9vLo5 zO%xV$6tJyLq9YXMir4B;*}r+~F$PJZf7x_~t#}w4S%+r01peWm2!L* z0k-));yI$Mj^A*OrzqQ+y~oiUAz)&1k1A>^L4PWYMqH?aIt&(RtGq;qb0(ptZG)}G z3BItbd&hqZC1wuR?8q^~F$)kBq;@AwSw@^((p0tBdM)SAZzT(cZ(~vz`y8xSeo3^L z`iM}{BxIgKkXlS|G!zN83}=CQV{8(u7G5R&h%;*}S>Nq{OWA+mb;#vab-n6~ZC zBxyoLIhbdOOB|5#n7vF`n(}}nW`&O%_zd&9_$U6_-$_2hZ!S1uzNMY>2@}B|OK=3+ z#jhD05yq5klq?ijKnZdLGfA?J7Nk77PQ=Bt`Ot}+r)ZZ+#S$j3^v43Ja&LEJy{a$e z!W)mFYpDG@5cmLI*@b(lYed6S9SWFBUWVX>=vTPfcGwvJf%oW*zyFJ0nhSssXCxI2 zthf=|$o*Qg^mPItV1RIc&>&x16vWp~9il;N-3JQQR>Y;44>q;2FlLs3$}XC`lj(;M z0ySjibUbHkos$?Ws+kWkDPW$UKOImT z{~V%;OJMn_YT1somE|S=Yc&g`5y)1sQ>>{mKa=ArMakWFXlc#h!i}CU=2Rd4c0xWjb@cH;--rgY$2#}!xrWFcNChNzZkswM7v9T z?tcEiwNagGKRIn5lLZOELAXFtgbW^_7R`Dv4t*`lHm-`+2J6JkHxpWL4}Aatucv}Q^PjL=I zv0}2r->b!$@%Ku5U1`cl-YUMLFf^{OH(9V=;#j=~P9E+L2W7RZS4B~DqV6S8;|%my zfBpaJfF<=Gig@O!3QwVW^(WhPO^8$X<#2=Q`)u@4*XiW4a)GriN;H?-Hm3HpCw%J- zfE4eI-zQL9Eldbh&GPVFjW-KUU!rbCUKP|2&-jyS>7(X~5l?UtsTTIHOxP@3eHu6E zI@eEf#XnG8;JU{3d9M4pKF5{BI>Pc~AJ=nSZ{Z37OiHe*3K!u-qr=EBS_yleO1&0& zn-l)ZyBoON!TcCj#0j{r%cl3uv%tBgyMDP}mm}o?T@IG}bXh5H(PgrB$Nicor32HsS^WMriMQwC}Lq?o=*79wG7oX@ack58G^ww1j`OxFqC2uyUVA;ca$C055`tC?3nZCQ(( zj4md{aW1IRWbwM*P~MYZLG1E_Vp=8ha9Tqcds%0)n z;2sy0%wWP8ZQ{u)*lST}6S8dIjXm(L=Ic#*g7t!37bXsgasFezAjZd#lVzj993IHy zS)D+VAfr?T5WT0sjFqRe%Y|eBLoOVSN^Yd`piYv83bZ4SOvU#Uhq>%=4&#!e>5p;8 zfk#_#WsB2N5ztX3y?VX*u7>PI_kbo@G9HDgyQ}qu;BL$G!sO@IaqQjcP!YxBk0C|+ zRrh0Lmpz-(=s%qZi`3K z(CM+N-Z^vzeo!m$lAMqMf*g`F5Dvo!$XiON7Pw%EpkZG+J^qO>eO@}<{fYD713TlT z^OIo!WcR(6i_mJgG05Vb!J>vjhUi;HJcDsgkD`3sb(R1iYM=rATHiNRzMja5^ zMxZ`Vo4&~z6oh%>NfeVOgGG}kx_-03U9yI#feR?XD~6DW1;|yP5iw&M0JhiQthG7M zu=-kqSQ{X>Ts9b<<^?Rk+=lYQ@c;9?$dr)10t)DR9sld&l#m0CH<|sx=~MYGYA#d3 zAUsB%r+N;_>@v?OJ#ADI?T^Z+8((x!;<6lheOU0wWD6)@XKlUnSvf~UFFyY z$VehIy3AS3qnA#XKT$5fbY8n~4H z`Z7MJUX&IlBT3)i>{joLWw9UcRrmN8FU%yG!GYv}fKh}~V4xCX2bf5zg4pPPh+!UA zoFOGY3mybyxxyZP`-FrhK7_j)Upm2tY`iqMqBzC($Siqc>9Yr9VH%p_*qJeVJM>TjKqMRf-*$COkl}vI z+QZ(8#_1nBckbNDIOLkq4=w*1!JaaZ^K*T75Lnzz2Q-34wJFH_>w0$ULy;FW1aN-d z+fzLq=4Fw=XG{f`nv<2?rH%)OQzR_?=|EE4Y`ap96g;yslPoOj%R#iL6p(|}**fBi z^}`74NgNtgjWjtBuhD5`S1BuU z6j-V^CUPUGMQaZAoNDNA43yffb?CL4UhK6@pq*V*ClWC@1F}k)?x+CYwd5a_dE~J6Y~-FPk1A%$jGXT5ISn_TyX;u;y-9P(jcIW#_WLg+ za=F{18j(~;Jxn_pkRyq2Y(rW!VCiIFnr?3R?Q$;{^=W$RfZ@JMd zI<2K{|IlQ5>#^J3a{JcaJ!?nz?LV+__~7P|TW*mtOXSZ)COWc;A-)g!Rh_K}d&9yP zy(sPy`)oRRnApg2Kp-uO`unR9?>?+>P29)dU#)USYJi@pPlo?HsPO3UA&Mp<36wCJ zm&wfQe1LQ6KMJV+QZKuq!s$LNk8t_0!%QiB?7eg!00_#phvY8UT-179vGddT9lkJ&75YE zdQ`D-V)*h993einM4gV_KdPA69v!}$k1Z8~>`cl2jQ2e;!3K018Iwdi0kG10rw!OCz|#oMW7m0X7+ z)E$pT$EsUs=5As5&T5OFZx!wYz}pBKERO(k3r*mDm!2)49EthB=&jX0KD#qMgTx*f zmDPSqh}=U=oTv`)`*@(7$`+B%c`J8T8@xd5oRN-R;dE*A0Djyy97JYY&`#v>L!&#G zWgb;To*agyZ96ToFs3bR^9M$^REK!}78#j|aza=(w+YK~)1p${+~kAXYOP^v40@8V zPFf?R)bJC7Whzty1OOrj>g>)Ia-bq-)$b+)D-xrlG=)+4#wR^ z+#QI!{R7L9eQ`&~dzUx&%CU2FxF;@aAzMMFL@Wt_`dn59)tJj@P_1wo4k}S0#+SN; zv*;)noJB$d&LUlK79HV&vq%ubS#+2SVq4%qY?oXR+i&55*gnPuWj?6hddnr z8L_y6x+eU_Tllc0l2vplX8il8G%*{qYrQ`?gvtwTulJ;!LH1c_NCsmKI6(yT$G4xC z4(_sBNmQgf1nPq(4`~k6L3H~$vkPRb+)f9rXT#w{MWPJ)({?X%2l{UP1`QADhGS}{ zhOgP4x~54TAb}K^V3nJU)P7Y*W^XLQT&7QyC<(u8O8O_uHQ^+`)d(6nyzz?V|4qh=p?INj)+@k=Gr&IKpa=xuD;-#@TW0}keNs*^KfvU9%;L81V4>Y-e%ruj)r-6b;o_0+2Q%~wBDElxJ zE^aFqqKbF%Ns!C1kZmpb_B%0Tb|*X0$8}6Ak*8 zF|NtB;2u!W%ddW(ujK3ijq*?^f(0Dap;GPYXH4(^Pd!<7HZyfs+abJ*2fKL6-b32#)OfE-6)my^!tmcqEh}tT z09|@`b9@`54l!{@!kRuJk$oPUF|*IKiQBfO*%gFfCS_yf#pYxv(J1F`lcwiu@oYV{ z%aYXmGtYw+S5=&fg%s~{u&fnj(PJrRQC4+Tem|^Dg$S-1>LLy~iMUg;IqufEAPGw@ zuY(!lFvawz7%9T(J=~pmSMw1rRQNcBNtEEFr+G_?SUhD}Y<}ew_M(T#+kxE{;|6bg zIc2Ykhn^8${h3ogHW}j7o7~D%hl{ZegCr`K=VzQZy*OJ-BN`}gJugRc$r22bPHncU zuM?o*&1S*1IMIf|HjDff6C{USoc^!it*g$>!w#|(FT?z4o=LQDAtsUH;IHPhKP@ov zBMNJO6XCn*1^Jt_pFlJ%3Q=IMMGzDP*}jS+Dp+=ccb9_QL=_`Tt@3HPWEW^7dq!Dk zxk4M-Xs-FeTxZUmYma}b31p}?LR5qr1Bc!ST0D5u2jXR6*tRVh>mgcjLqf<6I=Pk4 zh&c(KiUkg;@_GvM_l1QHh)EOeRw5a@o0?E53PE~XP9p9Mf(RE&J|=jU$X%Qj&CpCC zuq#D+@xB*_C-s+cw0n4D`qh_C$ep7ruFqvLdqwC`inrjGX6GpJpS(-2=~{Jo&AM$v z^EO$qtQyIkrCwO)GP7%p*QSS+5~?ZtX?dbi*tt8EgNhq(VM3@h!m~MTJnZ7JE-F1+ z4mP6>q9|MgJ``A#-rVF$KrBtOz#{ldU6sw%!T3aDP}L6Q*)N5i*#@xgL!?JEnMCwu zQOK?DHZ_X`gHFix^`OdG7TfhvH(^)`7ikXoS&iW!*!(Y6XtW+?$t}&<{3tvfOm~Mi zO~y~$g#Glh)Pavtip?@xi}OO9YQV8~P$ZNH2&fB`cM4AuYkh8xpK%;hgT?ViHE|q0 z`c4z6I$_c>H+4>>gWN=-ZC(o}|8XTzfVUBk^5TXqcn4miaw#FC z@eP*j-ui~cj*a@JJX7weZ??{qN7P4ubH|x-GmoLfYhbG+FO<+b&_8}i{)G*KG7k~a zgE?jl29NrH3(Pq<0SBP>nRes16;*x-u8^Sp&f)yKh;NBWVG?|^_cg=HMc{jLC%%vD z#P^<^_~xVlVWcJj@V)n@@I6B@_@1E{oXt=SzK_h~dvhM&@^FheQ1=Pn;3XNxfjc>8 z*@{XaHLHe&Fjuea6L-j}zq24&g$lzHk?~I4W+sN8GZVwlnTg?Nt)}ZU{K5y*Pxx79 z4#|E%9*BKwUKab-ye#&ud0FgR^Rn2t=4B3Ly%sMoiI?Ya3nDXIGHyZSPF~Kr0_S*n z5s~KQnsHs1d3hzH`@6%-oSkT1-UYYC{6=HA8aPk{USq2cKfG0kGPa6HqpnN+ugX|D zJk~l&%!QO-xK=EbA}T@+3!C1)Y+L-YLxZJX$`qx{yJ9FS;Qu#SA=U3l9s7=>0hts8 zX#lzTsgGn}@kah6O}tbWKl8p55u=Luw8m8unK9=gSmhs4g~&MKRAOnj#I)DO7|7kS zwm_t**Be|AvpOnXRw2$5Liy{P!)K~69n-wuqugb9zk8xu)$kx`%&9z;%j3ZnoTww_ zA{Gm?PJ;>NcEW@>(Y>E>Bx-XmoP^0p-Zrz_KozJ$Wq{e@9q8iSq5z(^?(qykB+RKDCM|%tGPV@w*294Xs-It;7LD%s>M&NY^y)f2H zmL8(LMrmkX&DjlgKXzBu*U+vtsM%O{9|9K0Zm3(}s6bt8Gy^7?pBjNW``l{OdA}Kq zr7+tW*XKdXZmyVN1?h{aW%*wZbvD?uAhE+>JGV)=1mY6YWlSzQX|9DddnGc`W+b{W zPM|O6CG3{RnMiSAlyw>TAP&!sF^JR7oDjG~_?HEPw;?J};P;>)c8S`Axafj9Jt@0r zVxxxYmCHuUtDc=+{K?L}Eyt|r7Yonr@yxH)N81x-q%cOP#UBNRLl9C%5vD$tz!LD*ibwfO&4I z%?dEXcn?oJ-4P35JtLxR-n%)wclEkZKz%N(J(y{pC^e<27o8ndkEgX}-jrm~w+cXG zg{Z032S;Ht@=$0U6k1m$vE6052b7lKHMyx^+=q)gUx0QX?aE_-8E&m*!L9eXN2HKfeC(~2WlPIJ z-u61iMbWBSILY;_WLCjN2PhP2?yf|P$7*YoW{nztx{=%#S51S0h@J6ce8Hk zZlP<0JtAu3qq;{7bTp)mh$^Km+;J?HAXIeL#yJ`}O?J8SYU~`Q4CGAa83ra7fT|aW%klq47q^O2aw?jq z-h=Q#=ol9w1}^}O4}<^_yOL2+Gh+Puni1EiV1KD;Oakj)-9^Re6U5wz{ZvVa;?zy= z#fOa8f-#nywmqbO>Fw&}-4OiBZU|2JtKLkDXX*Mc_Z7XfUF{{kz)3IcC7r>1@z-^5 zyC|r+dq8`tIk8uJ=q0u__HemUp2W5ibiC67oIuiv=mAnc3Bw^{fI9%NUtb4fR=DOu zylwH?$yl@{o2BF4I?@?X`J})tz&_cuN>pg!Q|basa7gv7vg6cn{cfrBq}Y;=dL{YhiY>TRJTvzY&W&>f z#@)w{$IorfYw+69UOLs3C{S|wq1MjPq4 zu+^^%NAPB~DgboKV4&u@>Vc ztHsIMTdes0#LbB0wI$K2lci{<@$uHigp>g`;oQEO<^1B64{?0)$bXc>6BdwERc^o3 zE46XowfnPH_h(P^hw-QWApEy?$A-d$&|XZ|$)4ODf+yXY(>{c3QTT>1rL+&{6UN}$ z#3*`#EyY;_+j0W4jSlEw1L>2Cq4oWytqL1T@Z!a=khZlXt8La&w%Qb18*LGMf-!i! z^@MCBH4`8YY($yGLJ&qWk~+eVQ6mYGY`$^`UUX1~y2%Q6TN{ehUERIN^ghJF#paZZ zRVtbCNSkdSQ#`-vl#Lge6GZfb68!1K7ubZt)J-wcLB!K;GP!jDXp#$lMjDVBJ~?4L zeG#<_JR(Obk5_gaYi4#53JhUUo?AmSXm($9+3g%vMUr5j1TxgjO$TZLbTrC$3BB_z z-7I?Vn?o;>zBa?PWs#v;_%9;YYT~b9IK` zjxz)YfklR3o6?DztItAa=YNM+5pg1==VgX-`y5xz4n8f`2!UvfrM$odqu5H9phWV0 zT$1nO`jv76=jRA6I`7oLhBj5jhsZ%?23F-Eek7Usc}`M71L8}+JN}hAHL!&=(*Ou0 zeAdqsUmi7_chXCL4|`CSB+@7(QDPDqV4!^b>$Y7zvF8)?t@evXb4trdztokeGbBQm zfSOUFMgm-%%YrbtD2P!je~~*%%NULPMp4_nv_bL!q73WIeY0Ql^N#Ur1-zZS3e`2z z|IM2Q1{s!tI&afp@K@Jcy|e9So0`6y>s{B_4bhYY)XjP*z8%At7$zCMUJVa%tGW2h zXp{V7Sy;h>+3;O3*{)~!hRJqQhVS@VhA(lE$?)xl;oHSMVG;e+c3iJ;t*(G;8Qn^5 zn=GC}7LOM3c@}a`1bV!61&e29_+!{>{MgIkK`Ax%q@hYa=HApLd$lVXp0`&yo#LAI zYFPcrUS+X>&+*7+dv%LQ9+|5){Ij`gpJu6yTX~|n&0Jm2<|_8DR&{KyG9%q#t{$^Z zmGmZSWD%1?HUdU;uIG7S_401!>MInY<`#|6FH^WIdNB#9RHkV4YgfKj&Sk$NgHtv8Bz9b0iatOm89I7Gb)wo zSaf|-J`+z5YlAXgvq6aoO2R2;MGgyYr#YD@PYjYx5mOs$etExXqCU>jiRqOtP%Jp6 z15oBzX>!g%M$|#bk@T!*VJf1U<=GBXzr`v8{FL7ca>n*yJ>1??eGA8==R*$JNcCB> z5v6ejipER{ccDVd_%u9v7Lg)nUN~l{PYG(En64?{(2NuAvnw_{iT+!Yowp{r>*ROt zRzo+K65bf=8!W_}P!xEfVATz2GQNDyP(W)*zPRC@f3o0NSFK)LA=ohW;-os^_JqK| zYZTdlF==Vkxoy8y8>b0P2|L@6!iZ|5%y2P7!S0Z^PXzSU2#5lDlkpG*Skybv@kn8< z_J)@!luuXp^0Dxjk%VFotHM!iGNdKWeC`0k#8w4YTNT}8Rfu$wRiS{$k626=Pw%K$ z8eO=g>v;^BTwHE=(wE?(Aj`mgdOwUuk*o0fh|yY9XWutkwh`eN`vPjymUp73o05Pw zVBX*Zb?pjQbzY*})V6wwQh7AqC<`RvXB~;H9uw1+rdOzqB;;JsF zN!n&Em}-5Fk8qa(txr&BODaENjH4LYb0kyDyvM1^k|9y^%DpZ1Pg+9#l>v4he#oT! zb$-be&flxX8z72y$G>T#1&VK;E-R7{iWw9aTM~|I;VL7oO0ifMr zL%!2cy)f@aux{dCoHweTTv?Bo%_iohjn{E^kq3D69Rxjx{K(7_?O4?v#e zO{ppz&EA6&eGqA1_d`-3Eqqw)(gzJ@{94mWaN>@U&xLiOfM8d%7Y72d0CKXs*mbowKft;k`vb8p#L5(8M3H%X=(~MxO z*e07z+V0%|Zje?A!UB$t+6xj~a+{?Xy%()G%?bs(!YF$I{_*{dNzwLf)1% zU7i`g=nqRKp?trkX$W!hZr-Q1;0TZAZL5bvy$@hS85r5yp9y4c1fR8p`pJ1}y!LMf z+j@#fQ#t+JHo?{n6%t%ZePK9CrDBLihfm6E3L7PIObp2|qTaY$n0xNYR`E{l7JIT< zHmgw4w69HrhqT*7+dKOF)AkOy@4b}v#^hpDAi}b8upZ_iyFUoM9hE(8@HnK@QOb}9 zsM=oL*w&x>uuVk^bf$If&II4eW9!a%AK8x19GrEAZr(p4P;s};cp86`@F}j{rETz0 zvXPzeA$&Q*2maRas=Ib6?NPV^d`vpKBWoLc4(!^Q1GCPI)R}|3cZL-S@{wwDx-R5# z(}fi}U05mNLv5JVW{!7qfwI}%s$TUljuc3a2JK+(>J#2w+x6Y0*}DbKXr)QyUG49= zalJ@p-lZqIyt}Pl-hrMKNh{fCE;XledkiX{n@%^M%)B9D>?=0`A&6QafcBwp;g)Sq z{9A(dy|u|yAEE%nEuqoy(J{eBei4JnKksnjn6DHXO!$VAhvipAhnn&n<3e~HA8L)y zTQ&Oz4{b9oFZ*y29PadIa_o95FFeN}sL(?^#u`*eH{PbckbDwyRL3aH+796yBP(f1 zb(TY=e8zVr=u=sCk11ZL`ovqc^+`uh&^utk`*UUEzsG~|EBeExiL&9XGfgs2b?9iF zUx|KP)?#i+xR5N6|6!@wlW}pisC`b3PXg8iNNIt@?n7ptO9-;SEiqk<#C4 z=PNGQk~1PUa=qaKVhB=!DD(S(8=75E?cbv@i$~wXMR8>J6z}C1BiXpOAZu^+)#6N^ zx6tF)ql2x>T-D(>q?_)OiLLJaei0^RfR?Gy4#%m!6D$B*YyN4=ZdH1uC(Y_us?jfx zzvg)k+v#jbD-Dh3vtkhNszOH-UaxPAgqLIbE7X0@!MZ z#Y9Pmw3tZqOgoCSgve4JHUS1shfazAx_2|n)80q6#2`RhgK*$B`OV7ueloeXupPeB z|H}T#fqri|+P|{8cYWV@&)Rag(JWf+4(TKnh}k10BkTT9Ua#z8xQ^-0mfTBP0HyEA z#|Y98EUefrYrE|MGFSbn;!&0rX_h za?Sx{0{61*<-m}w`H|a$ddcR&U$S`&M-%qg_elvLFXHz$h%UIRK~+zU)=2WvA0mYj zDo5Fs-ygz#OeSP=YZL`pFD{rzGoVK+FmhjF7$H4Z6 zCM7es2TfUmw=xhYHQ+L(`{||D9XJwDJT+FIW$(&mRfXS|-L$fBSxbb~HUJp6W2M2z zX=n55c(INHxl3&fj|4@L^GkuiRgXe+b<>2KoQ6wSu%>oqe5Ob;At;+RnGp7IA$(Eb zBM70vg-i&d3^F08kkkdj25S`hfJ_KOE=aC67bbE8F5ZqO+rb^e$)YY`;zQ@kgdi$` z>V<1|&iv1@-P{N%JiOGq@wnS%OBw5n_-o*voc)j z2k9^ONdBsn{Sc4PO$Kj>=j$DFX=)3zLahjr+Tx&jikw)UWm3QsgR>z|nD%ihJhr3E z66PZr#B1QS1B#K24y@JY0K$Hj6<@pT7@5vcCQG`M+@H>hcX~l{Z%4hB|vt3ZtQMzgt9;ACUQ1pT-azUjCRRI+IsV4B(;{yJ4 z2mbUq_|stRBEldIaO_uF@Z4 zAfeL7{*^QZUMSOzlB3Fc;tvYJaXmAYPT-E# z7T?bFy|noc12VL^0E#w$oC~tz!-Au=`4jv?n-d7~BYcXxbxxb3`gKP)rOV&P^SX1t zZ<bai-%Y(LACE?wjdhITdmv5&Grj}Wx3h*oGqShb9E5u zxt2vB;c8xqgZ`lNQb9o8A>*? z3l%}e5(e`{P;x;Fxk%>-8Pl$wM_Xsc|4e3;&KGJ<+jbzEVi0cPOExa@DkkzVspg{k zBw`PLdG(4d01i>%5lfbRy~U7DYS(k2d>_nQ3Z)@oF|^QG#Dsqp)n%@nT3da#P=dm! z7;(DRq65{H5Gf4aRUuuxof9&PX9yOZ*{x>yxt@pQ@9<{q178}OUe{^@Mfv4%*1Nsp!ACc})OG>2KP%b65?vV?yF*y{+JZ!4Az|~`nD%K%zpy{0Z zXmvfd9@BoS+?RWzHXnDub5XqtsOS_1X4Fy7UtZM`f(*2KiZ2@R%wYU_j23}s79k$& z99ltB5&#l?VoO18%0-6J9B6n8IPQy$u>ws7!WF=Lyf|NQa)s8jh2h~D1BK0wkqZJe zvx-gDTdixi|NYl`!6j{2TOYvX48GG;K_8(R^Yb96(L_d5dP~`_$bw7k7TIdR-!F_DOk? zMpF`J*5?=tBp2P%UpSf-75@-RD=DJJy(e|N=H~VCXhLhN+@BF_)FFpmA;gp_{O4w0 zQe$|1VXqiqqnLUZtzV961lM)Jb)MS)IrV8YBkjQsn0=`b z$nXCsuRF1m^W*ywFIa-bi@=m2Ns9fs^feD1i{lv~U$ka3!oSh7m4k~%6Fmln^~kKD z%Zb=UbrQKP&cR{969pNHxDI3MNr?z5Y!O-4MJp04Zj4Pwj-;_ADx_oU6H&xGX`+=3 zHgl6bxidvML+QC1^sTCCQjO*b#E>B&sWikKfaDh8nR zE{qFvhl5aa7w=wcXP?`DOLT&Z}yo(+LM}%E;2T25zI$vY500XY`k9 z{YZrh9*0<(;LP0T8q(dM->AOwJ8_ck8=Ye5Y)8m_4dnXNF99*w(56my5vmj+FVkdh znxRtUnyi#L&tdHGl=TZKqYK2)P??-wVr_fD)H5v7`}BueP`LcSo}xDWVwpT?Mw!rF zCf_n5wNp}_!i&v?xy6+I=ZTOsZBbY82F#aGF{^aBM0WWT(n@*XLeM+fD*MQ0ALBDa zrq8P99zLq$c~sRFXFM`G8~eCStyFCnu}_n6x-Qs`&kJRX?1wGxrx!I(03lJC zRDRhwjVe;@7-ime6z%Z6WrQB7@0a*8!GcOs7ZAm&7h{!6H>QU#@ZuKdzsXqOFwe#q zyVcx3zPEumKHlhJz_KiQZv!U73C&k%K}G$@lRXu6Q6C1SisZE3ioz-39K3V9QPQe< z5HV+s(mDgkLCbuR5X{yQzt5a4pv^^?%f_9@f=l@cWTV8U>TW27mCg(yu%ydn;6h;` z$cZswRfTTQ>gYn!4|5SoAFy#d!N9+g2?&fRC^>&=!DwCaXqK?Z2HM& z2{A5;w5B7$dK*!!2`yShYRd~ayvfoK(i{C%oQg1MBJ|{sv_gZ48e`0_sL?{(im4Tf z$+Hlv4l5=mEClVv_it}LUobsnr*!C#LW&7pBE_^U4bnm}EsI=fN^u`nOs$tD*g^D= z!a2o+!lhydaWA=I)dG6Nn5uYA-!0E8CKja2PF74EtxqS#ARo-lL@gjvko4j_OImyj$6I34UC)9CbHx#KJ>PtaM+Y5?=U6rQ=E(3AWhsLXjzdSa)#Y^ zC}cR^)~Te8gk#m5P}oeBgIMGZqC|lvw4h(KpzLc_*HrV;bjfA}r-;by0S48tnPb_c zvlzerZwh@+ifI}A;lvCZibgZx(mQuE}uEj)RLcZ zLG3^?eZs{ZSO6rJ7oZ@{M<%8ZuQZk}G$91P&)~V8KT)k^I>?T0f#rMLWeK32$Q1NiTPVtIbgoU!8h5cX~`nS9*MrJ&x&8A z7#(B~9G(^9T*1PL;$yR7T!uuEMDdAix@#Q8hZSu_Pal`Lh)$|H3ipUNJ2_FEA9&|p zJiv{v!#C+YpEe%Xp;v`)lIT(zPiYyrz-k1LwHfSOcLRuMAxRI1z$nJrphhM8F zz_*2%5$YFh=i}SweT1eEmHSB`J$XAs4j-1iDvpu0`*({OM^hBp@6}-LJ%V(X%`5*$ zvzZrdtRLdki$a^DksO%+(5dGa@(;MVCN3s-F{VKtqdy%xN5NeUoWkms=1Ak;VGE7l zSe34-!}HZIJ?D|B2?(|fJ#G7RZRSUkxG`nRA^%cM|wv;&T< z(VlC3+zGX#sG_!S6*nhWCOS6(crDH;TjR%ft5Bo10ci7+nm)m_k?67KHL89eg3Dv z@V%mc=^|}%7HG}Tb%!(1#w2_#lItbc&w@~0e_OZ^b-|oM2;m~(XOxNM@L1|5A`Js0 zBZZV$@zEG1%(D&lUPH7TIS1nK#z_%l+CWt{tepvf*VZQzE~e2UufZ8!@&*Am=9oMt zeY!iu*hG2M#SSJ-Tw5_c)uu%GB1Gx}k)`UiKYokeFChp8xbbsq>Q0uao&f>Y`UJuh zrL$=vI!q@iaFlxVQ&5*INg~Wr3#ycfYL3ouwytt>U# zMN2VsNfq%9`d+pY=M?QfT};}nzn_Mi=>5Vgk~zF`K(9zcgA1{RBwbA3;a#tt$2`I- zS$1mg{F@BQ>hAsZz8?#|a=q!AxAPmWa?-Rqw zl~{;1;RbX$BD$4D^eIGi3kd@=i&L;k(E}kPw=5n{)gl_-PN{v!3HJcI1+YDN%h1P@ zs@UDx8z9Pu)!M}>-eV1BscL0|x{z7V>*073yQzDoudVtW9dXYgg(V}YBQx)dHUK{& zUWSnn0VK=f?q>O}Mh}>JJ>6vM*lt;-(pgEuCsJk>1b;I!6_dfgsHVBy2EB^@gw*#d zf=P5STNql$4eAg3Y{KvuG}U=#>SkvglxTzzx&t+O9bd!%Z4DPfl_JCVPAk+X9`WSH ze>(odrjW!2VO@xX5lA%4W0h3HM5ogsT<0MZaSkyadajfWGin=k>M>{*z-^&jqFlC>;$LKv zDgLF;Rq-#Hce3K*xEMvzC@$s&uFCdZ>=OL4T1&wz4GR!=6GgBGCmPTLbF)@JXh00VtO$_!_x{81rL=8 zavT2x_K0k-Z!AQX8q}~~EX@6+bXP;T4c!pzKi7~2Ks2;RSmiB;W~iy@Ucs2kh)!ux z3S{eJ2lfDy$Xo9x2!foGo?f1BP832!&umYY$wYs#pgK<+NqoDPQtbaGN5unOH4Avi z^Fp+W?OWET5ZCm3o%~z6?n^-+B*hiOq?1DnG4h2LaTuZ$o-v6Ah<;}g1s4e3I|m^A zuqG?g5ICNG4~-V5=)!*6Jc9LAEBB&2z@B7vV1EEmG@@E?=)O^4EFCEiXnwn&ttSqM zIii3V3FWLon9pZst_TB4-#R2lxU*3}IY06j#;Iki%4>gW;My`+Cn;`+{7?=T6Lzn}H>?NbZktqS zE`@IG5hP&;zZbDiMY-3f=5V&FPt92ks$mRk^&tqYpfSoY8i>Ur^*cXBd*g+MAnR{PVP=+n}px?_vu!Yl;DYbK-+rs5A3{mU7dSN|3DkFYXwZ zo8{3w?|i|A{-#-=bhcy#enBJ(3RJgPM)It4uP7Z>Q4rc3c5Z;i8{m$4f~4S|814YH zr~umDj=McI?luE=w?uX)0c9^WvehZ_g3oI! zRGLYaeEl3rD(`T*XBH$yhpN1uqY43%992ve<{VXgRy(R}?(y2X%%f7Pc+p`54VG)o zl_mN>f^fkdl!IAp9h9;~lRGHpG3LxL+XI0!Z_n#@Eq6(HwTd~Z>BNfg^xE8}g=V#n z^)D0?yEU`|u73!5)`p*&EVq0c6MLRN1v_I|j0tmee4G-by5J8L0)$pb6Vc*ha+LfC zW*+W=r`gUy{6}$$x!c>-6k3pvI*uk8RFBA|IUPF6cshEt9B}fxN_0lMRnv6!Q4VZh z{ov+w3|p0)_*RbDHpSzUevxl@tTKIapUdh`);84?jp4gN=WkB;Mzgd)J;QQsQ!Pe2 zLuy%}WV-SwPgZD(1_a-X`X3Ys6C?yuX`Ak|@>?lQ&$Zjx{4@P^(w zSbyjaAK20119Kfdq_4Z*e1|uq!<)Onm9kynimQT#Xo_y4o;IgP+-N_;bwD@!3veCG zb@Qk!{v&*im^n-}o12_!Rvz7iU=Ei1IncGo$jbwp<)KZc2zy0E3Z3nMK=4zpZz|tx zpB^M43JS`olHnbc6nN##(Cw5&_k|$(Bm@P(@@K-0I=k~LP9TDe;~$?9w5k_l&Io8YrYdX#;Rp>O@oASa1t<0*LV@R$~3kVIV9@oS7Ug z#6!)GY4=rw4mcnS24dpO922I^ac5I)KitAhrc;tDQH~TNdx3;m4!zIuXPi&f(>x|m znW7v!n_crr#(IxIl*^i?oJ$U(CnU=)UDU=<$`y{yUIyi{oXXC3Dp~5+c}L9cJnh$k zWX$h8EyUEJkPaWFP#xYEnSj<5zNPuasxIph|J5sR(cR%X8y9&6(q{+D&Gc)dJdl3v zug!WALTIY0kKyUqoN3^hio13T9W9SMDc~dPyv`cp?Ozw81`pbIytj)~RNsU)co~F~X z21_03$y(%@$$pd%p}jB*qN?`+$36w_w88Nrvvr1b97u7=TDHc-9h8HKS$v@02L*Rh z&gDcJV7yPK?xLK_TNldd-QARPIho66n3yLYV}#d?9c5omNHxpQoPh#H)For>7M$ir zONR7vfc`{a=dHm$Cj&d$9t&FfTPp@w)FSybHS7hq>0=O24$))$ekLe|b+4;X+UuzK|DBT!TI`n_Ph$I={0o!bOkU_0J@}ul zG#;KFK>+lsb7zU3LDO+);(9rFXxjbgbRSBs+@}fCVe~+Eld3zMbI%WUQ}a?fd{nj! z8sPAgY`$_S78uisCLL1F1}I}4FWQEq_R#{0?-^VNvU0g4&}zdv!AXY$wDc{t=t>9p zz+9xj_}F05x8_Oh!WYy1lQ9q&N2BA^=x)H*zP3*2t<>lt8bt+aZ?I|_Pxh;sak(F0 z(*N}*=@{zvVay?kUf#k>uytm7E3#$%t_Ea8WU@FRk!-vGFpkks9e5U{(CqD$)^3t0 zg>*|wYbQyRLctSCO^sq67HZwX#bTjh(7vBuO!p}E zdh7R@j7a6y_e@r#YU3W59CXqnpx!mLxy5tOel%KDr%G09np#5&n52r-2lr;0HKck$ z2{5V!G5w$f_+;Iwo=^g8vW`+;C;={6J9RYpy3w5=kZDnme{Fv7GA`%7Y?N8r?*?Ghi<4Oo#f>?hbtSU~jEQ&Nz?NHw^Li`i9Y!^$i1? zq#I6dch$O3^+tJEz%+CR4{WjtvR|>w>PZ)B^kWJ!Xz7(%9llf!onVl1U{nP?L9%12 z34Vr>5P2T8)sJdId8Om3P9`^h;tWq08sLnu3EipnPegXfp2mPzr{rQeOs7nZ^1UR%E?e%D{m8}?+MMbKQs^dbyV0Z-=fRywJ-cw zt^aSWwf>P>ksq#|dZBWR%p@qFYh%4Hsb|PfHZ=Q0(v@0l0SUkyo~U7Kd6?vcgxu~x zUf_T^AR7po>gRxLZm3NS%ORk9kop&ZT#Jc5;GYu;fZFIV*hv#6lo{-|@H>P3HhyQY z3*IJ>8N3bCJpuOh06PiFEN%kqx7Vie&BA+*d6G7Or48>5OJPy^WJAU|YzQz|^La3|U}mQz@BEeZ5ngP1!8H3A1TmZ8r65vuRwLO@rEO>h5MX zVQ@dGNm~6pDqY{YOCsiNh-Y+qQ zqO_;gX-?q%0IO`6E$@dB@a249w5(huul%mQPr0MN{JXK-+?Z@p2WdOD2I1IQG*PzS zm0K(QcDJ|GX^=fj{v%8+ZG8Zdtq)U&`@;}(SEncV?Tt4;GF zoOTio%t?&0Wc6xi?~NtV#-b!T7%XupSmJQ7#E~G?ah60P05yE9o|D{K%cP_AoMcc- zr#a)-8c2zEVj?jTAPLWr_A`HUNPn`WtR*7Kav1YKeok>KJ&HMmM~Mt3UEU#sNn*2H z=R+J=AoTcLPi84fr@5urBhZ*CZ&QGUG+(*Ne6D&Ds8l^(BS!W5#sB4Y!KeN8`@d1 zrEDsK3fWXNJhG|i!nR0_23lO=!p29&H6=mc51`hMmQ#N$3TBEO+0VZ=cLS9>VjrI( zEyxT~&vb@7JqlNj25%e8(9$%ble~&?rcJ=j=g|l$j8YW48RV3Of@hgJa|YVZ29c+l znhNuJHh^psDs}?K%yysrFWG40?M0(bn!2`oq|R$|FhqU89ze0r-m)`Pnhf8*?fTj9 zOk|IRxLcqDX?I(Ee{p6?+TQ!f?B3Si6SI5UdXLZUF^I&Iiz6dn4nT$j>Cr-80+Lmf5vS%T**j=ey zO6j>%Eh!Zikt;s@qZO%^>d(2SOBPTJdoe!BLv`R;ih&dT3n&V}@e)A_B9~JnvL0XW z?W#{p&e-IPTRrZavB?>?)C*^9>PN;VXWUXYE@X_dl_6u49t^tq#bI+zIzXLbjiy@T7;(zSB-u>&Qlhb;CohQIL%(GLwc-2)SCdnKA*Wl z%)uoJ*%Oossi;A4LdiGh>~(@h>xog6!4Qr`45o`R_`*?#^JTzuAplnO(QVOuVp!If z{Oeqk<}N5lpT_3yM*HKxQp`x&{6Uhf3tmE!%aWIVx?Oi&0<5V1`dk6MDysjnE?`Zz zdX2m2B+FaX>-C-1*00oe1{mWks;@4VZK;eT=Jf!Iq@Qc!GazM0Wa#4p#PZfgew36$aywJ7_hOQ2(4yGRt9GbaJb`n;04y?35oCx z1qeQ;LWuhLrZ!7@PeRn?fL`=p+(kev??PgbdD)~Q>}IDiW5GJAUZ}MNw>Nd1t_N6G z)coi~wUD0@(dY3ZAv{<(oj@rhg#x2q<{E)fk;*4x8T-Ld9?hfln{hnC%c5)}O%$AA z>{8oN5pxh=)$(imnV% zgd9gth$fLH;g?AU&T!(MV@daP=7!4WB^~pu9j#HAIC7rVY~m zE7X!J_bPFsF$r-eUqMs6i{|5v3ux4`VXfIhRVgM$iyR8@5*&efIIDbbgartFp9n6! zFZnO$m_W{VCWQpkRF#RKE}Ee~7pdt|gd@orRn)+j;EbXgISpkvq*1sToAGH#LnG#& z)44Ry_{0vz=g~5HK~0Pn?7JL^d*_mGe0Ip$QO!6z>I&O<)3ynj9PDqAedbPRX~v6YU9K)6;}ZGkDJpK6~zS zLPXGv-h*$9Tb*@T4&Duo72K?u?pEpndvIBe=p|@npm?}KJ3QE(^f^c7&fX;XS)aM!;!v{O~g|b>}WNx9X_U=a+o!*sGmPKp$fQVqK673piF;i&tOq#%^FrdDu_r`8dC({}A7y~$ca02JyG07=1N zvMkpMPLB{V2ty=Cc$o?$%(Pzy2&COm38CH6i(@TqFQ_(#;?zFsIo39+?fD|BHWW*( z+M?&%RaP?(4j2(~#sbbE-nB(ozy4dQP=%d3q0n z9420k%du%+IqY|%peWEjb`~|WR+*gg1jCB zY_hNW9_T+^k|r!;oGx zz!umiK_!(jEONkQ2IBX9_ZEqHY^c)D8#B*<_nNX84@1i_Y z3j5wg)@mR*711O8Itks8a_D`dhG4222RtwZO!)+xN>@a}DmmS7y9lICM9F@$3P(1f z&(4}px~o!$fPiM1suCbPBocio?|tHP1h2nO#_}UPl!+N*NIKOgNTxB=MG`U#8hHtj zJBe0ZA4WDkQ_XBD$#O|MnBEz+AhgtNj;Ya~`=-UV9TxH~DI#3?2=&5z z8|pJNfhFy&;MqH2Y*mDHJ&F*gN`+o8$)_U0s=a>N#`%xhY~!5Ek`-tzP8lMhlZ4Eh z+QwO%2Y;%!amsVROahn!arqn2dAh&mHcmr9c?|R#+c=R0W9z{AyeEVVS>DXHaK`eo zT^KogOa`uMs4i{W$|*&+OA;|`JSP!bu1F$=mXcf8xzuS-{y`mKNe^K;_^X&tBG%2x zP-1sy6`4VJi`F43^kRiooid4WR9$2eBc+&Xqpp{xPDt8KnZ!IXl1mb0U|>L1^OWTM zqO*J}KersBM^+1oKx62Jw^oaf6$h^RTwn2V^wKIITmPW~xQ z1f^oZc5-)ltgifI-d~06(H@;g$e9nDKdL1g)Isn$%t!fF@z}JvjnDbUd`@Q0>N4+R zH8}I+W6>J;MwCcAQW<}t1el(h9))C7E6e2mP{teGQxnQFz>iaqpbABTD6QB@$n4gW zBr!c;7jhv%-hPiOf{%gt&%1>uqJ_sXQ)4J}ZTYkfHq+=M5T|&OjAiNUVVb%2x4VHLXK=xV3~7^7V)mTXZ>)c{0lvK7f4ODdY_=WjpS>fmWLRGmX|c z>=if0o@{I>u^rg+rYmm)HJ@GsQ5iE*1V_Oz zg{Pc7W+NyWi7?|Lieq<^_apvn-r~=iN%;hHFP#jd zW}Pg*ZS0?NcAEgU_D|6-ovlGKV4b-^8-mL=mMk$ogm2FoGbHLjZZV`F5is(_{5Z=f zpwl9=^!>N1#UOO}MKoUSbiV6fe3x@765rsw0YIIpik4208=G&!@b z#q&Szf8}6hv)>yGNA=NHD~DFc>-!Jv+c>yqZSP)%OL_|7C1+yPCdhTV$Z3Y27a$9P zrvxT(Q~VoooaOR#g<~a&FBuH)CenZ57%UFRI>s{XVE9%Yki~|UBb=Hu7~Z7?d?s6c zs$&MhiuQw}O-_e`hR;?CWEwq0&_y{Sg(n$rI8tdayi@D@q$T_`xVwwL+H|&$CGo-V z4vee&skp=M<1)0^5u@WaW6E+NrYs5MqdgU%)~Q}7?S;zjA8qJ(t6n||OUvq3JIMTg zeU#s-@+oapE$ZMXuP({`@b31eA#)+jNl58NVKLc_6aqEpgSX={mGi2WlwxXqk@vI zUFM&DZnf-h^sEsRV=u1v^*N9E@;J|w;f=7y*uxoJhbg^E-xT#Krbe@eHY?aOz)V-= za)70k7{&({iw8R|nUfMQWM&CM0TaFYzIgS$deugOj?MuRyTM7iA2{*%t5)(%>iDgb ze|`$>zEy}K9vmIwXs&^dMoTHkx#IatBg_fG+e#^s%XmZJPhP<-y3(#*PC3h&S18K_ zuUhfH5K_^*+jHN`+9 zC8q^Ht!3oR>L4GL5Hh@XSw?1uQ{FZxyTx;dc-586eP7rmet^To217Cjcnripww+A_ zTnK8g8Vdn!A3r0bgh5Q2L!vh^ZRJt+Sj3i`)EOPF_EH@OxW(rn#?wl6$c5I(gKk%igfUed?>%^eG7|&fFUe4-hXF zKF3=ASUv93DQp8GpEzi5pkOCSaLx;CaN(RjsV8!wsgR`2QV5*Wrw@E=-GERejz}CR z_Ema_W8|bwh#FFpob#p&QA3BgaL$`pkEkJW5s`_aej*e1aUp6*EZ7{F4lvE`Z#ES) zq`an0>3t=Wk~~dRkBrp;SS_u*0yuUc`8+D!=uj0Oq(MHPpKFpT+qs+~Sgkk}7Q${v zeesdvb#$gCmOj#!reYFc;bkENr4bX3Vg$6N zln8cQ1akYVa?Q7G>*$=WpI&M%YsfmOw#ATDlg2hT^TTgqPP46Jdxyw@27RS^)$XLY z%rRN4nww=tsUl4%Wh^nPj8em{c7`z~KYfBpl`{Uy1lF&lRmsOx(jfC?<#h%jT4#$! zpf2_i3M&1mk^DE9&`%C&w^^ZGYdR81rhf@9Avr zb$(4yej<*ug@i6hoHIcHi}igbCdnZKM|OU@VH=}Z)D zrPtDX4A0n%bdf+=2N0f4`;012ymt$@E6sW~W78wj$oLR+S%tI91f_=(;Mb}Va)#zxh|%ig~GId zflKpa)&IxAEXz+#?O}!@KfunuW;J@cZ2l-m0IhwjT+(%kG>Jcoq(95EvuFO3k4^bP z9#v-QW%Hp;+`IacK><}3GvG_(L!xpn0*aYVpC?>$=&WFY@7xi_qeL!R=wNTKW+ih$ zQkaICh;XUHpd`Evbj`bje$gSxbuHTAvQzFf9qgn_9)3I89S~ysGd9e znL}>}POW%B2)ChLc+-wt^NO#l8DcpIw-H{hWl#}ESuV;T zD@F+*ub|?%j3q7~JAw)K^mGkmP7a}e*4X06E`IO(A;%fpKNtq*`0zle5{$Sxa5FbmhP*W0Ju4zqpQ>D~p;iJ~3xi*Pu zOFT_|KtzV92}YhAP&EtO5~WbarB5ZofhC(sUH=iqM+FmlmWP!?NSZ_;d8~5A!cU(n~^A313trD0|9)-i@{3PVS&E-{1b4vDRxC?x|UfU5#ldEGMU5_)Fp!)_faI*p>WO z6a#Rml$ zdm{Qw%$jpUqM2Ak{)u{pOm?osxUtW(thEYHRBjX`DmP^(DtDrkn#u=3n>3_mRxH0V2vTRsim?Ry>s4TD%(lroFyMQ5o)3M+22zGX-ihzti=AT z=Xrv}nZHR-w2cd{@ROe$EcKWLg$Y-iY>+j3d}MT9C3HXn{}Egh5Q_BC+aH=}<64?% zv`$H;!g;7A5zA7<<4t;yl!y+u-pP;c^;)28S1OK?3(Jga4#Kk%%(Gab!~Kcv$NJ>W8n zhL?Jyj7x3kiH5WVo=e_WWH!eG&y~er`rMQ3 ze)xfhM@9ATiM4qW&rC$0YkOh)5uu5N9~@cwn(#5XA&7ROzpeigBEz4j%5ZS$Idz^s z`^^7e-I>72ag>LCXKakI0gHqX5=a;uW27Lh`aZ^M8_BY<@QEZF!pqC3y1QCCXm@5k zhYo`YU{FX1kOXpvz)J|^fRH=R4T0Pjgk0o=B;-!WK?phC@&Bs3XJ>b3S39$k{m{?r zp04h$`l{-yufDs44Snby_=vFvZoKmeL_brLk>~|GkyxqeApJx&NcHBsOZZNN(@W02 z^T7L9p#^vVC8t%$tB<)7lrzTJ(nXbO8kYhI9?<-F1+NfAVt@rQfRvK@+K&W$!t);j z3VF5m0zkb?7HUoA;DLAU`m~78hMHiKU@vbN7)K3D_DF%BB}^Sf!w($1>7mz>696FV zqTF0NmZH&?$}gw<{$2kr)q}=T@>o-18Z@kwG|01pueuryZh;A0b{S<^aneXJTmXOU z-7jO{u6{htK7l_8NW0=-?Ofw=2XA`qt6{3hs`wzwug)!HwR5k&=5fc~{ouiyzFZit zhaRL0oNMvWHM=OJG3ft;tdqLbP?H)C&b=CdYI6U?SA&pO9jrZc%~hB@@TNgl71GFD zNd7z;ze<2;JjUesnv*AzR9(i2!$27%Y-po;rPixVz0@iZ%w|N{6L^#Uix_z29mN7^ zlnX@g4z-G0c2TE{9oWVK!4aicF}sQtv*(hhN-brbqKBcfVXgjhiY~$MC#od5T=sG* zsK1=^VjDI7e@S^zqXY|8KWoKFA-s3l%U^ble7yRez)%$y?eY8^_&+*`c<#zCsd3QD zbCEpXJ9odh6c(vGYl7b=58QPByI(7vkRR7vdd>`VQCq_bwD-O2Qs#zJFBcLv>VV_9|1Ho7ZmH`DzidNAyD8iTVdx-ZX9 z3>F*x#qMw^Yb3g1HM+fqeRrq9hrP3nLANnj)Qx=DNlpF7m%G_;Ngr>ds`KoDd~jE{ zqpxq=ud^w>IW8X^H(wp=wRI-V^cQ>W&Pn;D8cV8oLicE6MWyY*+2hiDtDT)WUIChR zmjSBRU2YujXq~kNi^I;z{_*RtcpU%M6gArY#!7c(xTFTObGl7ur9*v11?_=e?sKaK zj924$Pp>SgR4>!>*0NeDYolie2E1hIX?F$<)hS1JdDu52!05M6bc$YRl}ZCZGa53} zCcrlUMaC@e4m+9YQGcM)ldZJdAN0#-XZ4^#-&TeITXg17J8PWn4jGH3rN;5{S!?Xe z<2M}>*j8symEd)AMl#cRTR^LzIW*KV#HZ9!J5y#x1t%JPT}*FTi$2o^rdz8?PrBJz z8OQE$(4f{tI?%sa0HUg@=3*RqWnVYnSG>|}%oYFk-wS^B_xHL9Xu5wsWqP~&d-?>e z^v>?@_tO0*n3!QQPyhDWI!yy7j*3S5B+`^1k7qz0}`l%{%j!`JxztMcqEJ zIM@$X&iDEwP}<8Y-JXo(kof}ePIu6FK=-=WH_9hff6WvYy*1b$j7bFqzV^D15nPNSvImxWwbZEWKcARbjji_+8tYMX%}MFU1}Jdk#W?^D}%Ge zT{T&qZfD9s-UoWnCRq@&5?(S~UfDMgy2WCy>eTlS)zUHPlwhFg z!9|;|wd+BhX%$O@Nn?$*J11nVLI@knT@aA2`Z|r3VSiC)#bB_oi*Ao&*WBFx zbWx`#>AYEa;6zF#`$3LWmrL(hkBx^`4yl2mpvTY9~2 zui3aw^%u>Um=QX{GHpYTmo>nhZRj(L3eu{x`Nn~SbxgG*H0-Ic#iJ`PUu8V>{_nvIwCWM2Y%>BejHeV9XNp-c!3`TK^R0q99p3rI-whSp&tfe7)D_nS&J(M&%X9jXPm3GY~DK5n`wbGM9IEP~Ov&?%?Aa2{Igg&H8 zT6Ko3yNX+o2inwg0)}kZgp(2iQZOUXH|{gpoP|4MgKQ|)Yq3}Ap3dY8?#zb;9BC)z z6Cp4wJ>7?Sk$t+~W><$al|{u?zoL8XuBoBlH~m^EE~ncafMn$-UDeA9NX@3$IK2ov zSyj?lSyX-9Fg-IJ;8$5c``8HVQBTuhuLn5m9u$S{rpB*FXk0JXu=vliUTVuWI zFLlSd!blYKtJ58xFdRVEA9ZK^t6{R-hCl3fdKyeCxU6D-qI_8m(!~uA%C^f%Eg#cb zXWyyrK=;;_pI+3^@M7knl!=0yHrr6K4az-?E#oJ{D^kJed$qz0z;vHzoB%SW8T81c ziE;y#fiLHFHunj5bVxKbm07|x`pmz7LHuaHDo z0yNi$V6arBy`2*+CWaX`bn8^JTJZepL9^t-$ewD->@}+&y}tRGcDqa6JU69!(3LM% zx_z}YP7W9!hWZqbb!G;h84+^1)a}9asI%sg;f^T;DT^8=aE&DfwEJx4QrYh7s+U`= zti?U>f~%{kdej$2t9x2!8!@UtsMA1#Xe9qnG;&o1TT2agtKpgXp3YlHaNXT|_QGVW zw0mdw2<5$hsE43V)l5SmfcP4MZHNl(b65ZU$;aj+VX;k3#hv*n^_;&}uzN$*M+e=WI>BzyW#t<14S^9h zkCj{@Vm3b;mgzG(MF=|u<2Tx5H_n7WuY2=Z`-JWfcJFE2a6{v|g+9EtUT!w;G|Gd8 zqvrO;8=DMZ@!A2AC3~vVFDT?loHfHQLkGjzV_y&|nCi{m1~+AXbdSL)L~_{Ds!r-} zj}MI?vPi-6jJ0eRGV5bfbny(fR3`Zt+$n@)d36`xbb4nSTVa1q17l+gNvV}&rBPll znQ#>l0d^}8C*jJ*nUfX5f;2MF?mfD53JFl38MOMEzXG%576E7c*34QCXTqbDZGw3= zT)fcZ5?bVkHS#}mv@KqY0XYdRGecs;Fpy&dsU5Yk`U71fr5$nHsU1<6gG0R>HiVrsWx0L&u|+vsJzy`4d4Jd+tBFlF)3a4KzAy@5 zhmt0Ivs}Lw51UTN-1x+el>w-4+@pCA;Et3M_5h2&z?u z8$Vb$*zIKOY756?!+`qit~QEpZ;z;+Hom|z9qidyljw`9b{aR{P_%w?Avz5^KztH( z&kb9zmLO#)JxyUYU%oVYW!+=xY_6ewBQCN6(Xe?eYqaUBa)Qysz%22Jd^zY2Ho|(H z^r3O}4WnI=oqdCnKNU9q%vF* zIxbCghRbph!II11OiwO72nLrkgZ4pTm>Rq!vZ3&o9gSK}$kOc0GF3B8V+&E*f~_c; zG%drGz$WS*Vn#z33M)7Sk-i&42`!1F+WhfDba#i>{hwx;WUqpmleOY#XM(X(8D`H=0 zHiw?FX3Y_(qWDKTZU5pD}># z<>7Lx1Yq}`R_h)#(1Y&sVPQB*(>=YskAL@ zo4+a%ZbSWJ`f#Lqp>7)|YZ*&kVJWH5ep7_rs{X>%HFw~X@1MK!;it@@#Qg%Gdhz9R zb60WgLV6#^^(QI6mg~o^n49}-uCJ&U+}vkz{|>H?=lZtG=H^at-3|Gc@&WhH z;`-so7WW_LD)qjDD^<;XKi4O7{XkhhN4qcP{tf&+iN7}YPv=^}^H$&xcwR&K7mk%b zuY~hBm0m-6gO^PGTsz$V5`R+PJ1D%8>k&G+o9oLzcW&+|*B*aT@A~qWmgVvdO`AXI z=M(sQB7dKxKB>1Fmya_p48`0oK4@@#CF3CDWpOX#aUYe)`_=vPxfeLzb9FHeAEaOM zeRco4<^98SR=)dM`YF$^008OVPw_{SBe*KQQn{Cz3axxKV6n9%AYb;{vT!e?d!__t1RC~xy)D9-hY?n7RWF@U!1UO z#;JNwIw5dfNjd+GzOR+#|G@X-^**gE{~gMoI`;n4%krOISN@E${Oy!~-q`z%vi#h- z`uCLOi|fk2s4PE1`S`f(FUzZbUI&s1-c3w~DZEPxd9-B*J&G1uc8* zU0eZm?p~bGNBOnfc8KFa6E%3sHCf%7=+3T&_AD)3a}U5!&!F5ixiQ&oP5av7&f7(a_^RenoZUfthX z-oK6a1P4CCA5%A1-T%S5`#_$~NwJ>}0DEB{k|3%*tDR_|B!KbiNRJ@$SK9g=!}h4!SM)%!xX zr2LyGm-Sth-%yrAUd=xl6PXWL`!b#~S1f@!(A>=HIogvks=iOk@7KfejI#W_>-zJY zvK;on;Dz)}@PlD9G?CX0Un0Dc(7BIO@N}+KdtV5E(vMvf$~P9*Yq(Z)_U+sY>_5Ou zkKy|J+)F*5;`%(Uui{U>ujcCk8j^96Ig-B1q{#2*a+P{3y8b~bk^74Nzn*(p{}uk- z&BroEw^A>i$Q#52)jVJeTnh{COtV zH*wDpkNB%!s};Q53gz__!0q;%N`6_-3!ert3TXxuRPw8YHN z5(~_wPn0Js7+8_T26^G{`ej8WdO2M=``FR%<(12?G?nY+WgJ@`S3N)pf5qeF z!QgcFOv`qnE3cBfG2Q&*$Esh{XP&UjJTLV22A(HANlL^Wp;syJuQDJeOK85Fmg5Jz zK1*KFndAF*jA^dd&d)ySDW;-ATiq&@`>l>X{aH_&P(GmYtb4li*`GW9ur10pTznXx zCz}>Z-8X}Is(Vs@&KGQaIn}MIuBS`_06pO6PAX?Wp86b-#xO4rdKj3{c+gDCcy>0M zi$1O+md*n|@ljoP`t!DWISm38MM)kcUJ{4C`uzJA%$zryIB+zZ_vsX+WCKrtksk?0 z$4nlHWG6bJX7gzION?D83o?op11kxmz=~5Vj>6DUPrJ6Pw!Cz^*vc03B-5cz5^Xt- z&Mo`tan*Y11l4RFQKtmzs zf2GFu2Mf=nm_JupVHU)ZfAvoK=f;t;Vh?{QmD}1@*X*P+TY)Hv>nX>L0^FaTxwFC2 zof7{---#^NL1tN5nk3n^&GVs$xR>-!32Mc8oW@#Px#b6LoTz7A21$T~U3Z~iOLO1P zQZKWzILeaz*%zqZ%nxHc(`=piF+Y;sJDHd?v9mZ0v=duah1CF#2*WU%g)&&4 zj^iNEo|AZyR>>F1=t9$;b7VsU1?3s1M@MnGyyeUQHSNN&y^X^{5sb+LYaWzv(ehNz zlEZ&5P)?%5yI&~$hF zk-VVTf0|9Sd*&Aa;Tk#+SZpWMdFXmM$Zem(tIL|Lwmtd;FFcc1Fr3zOhFGjuS}Zm1m< z#g}g2}QD0<*AjjBSm!0vAv6nBB7V&u6A5IvXp0~v47D~1n*iW$ptyG%!ghD z7a2vAn`tMEb?7)=oH$w7-3&#>*Bpxgl$>b|c#ah(LFzbR8s%}~Mlac{!R--~LnAK_ z&Dvh|`H&SJS~(nsqZr1NZ8?n(t!+!Fg7I+|j4!AmPUg+#A)O3QP@B0~#AarB2|T48 zXRbZBo)&16@ zaqHSUjujHo{CpMfF<*!}^5odHH(z`0(6O#PaP9MsT`PaKJtn?5QR~`anD7e!E9Dq| zXHt+|Yln-G4s#1`CJsGEL-lW&Us^h~JRf^VO@ueNe&kA!0|L}7j|lo(%8tE^018$? ztg__R`!}2F0uc#KgryRkyi=`gjryChMX8st%;8@1z|K4!Jn!%Z_Oj$(*Q}{YEKh8^ zUYw;to+SZE7-Dn)j8^gY{eBMtmKw3QR*X|C+RdcpQTjZ*+*6Gubj<~mVFPH%>u zMaU=$LZa}R&F3w3aRJ%E4y}_cNoBz~P8#{Cb9DPKYsU*MlsUw4@wJ~EdzX+~v_pp8 zj!p3Vd^N%I^W)&p&mYnK_5-5VxsfX$LC; zU7MX{@E$>&_$o`kWcwgTiS6ZSg5nVDBlhusZvWHN%FrsLNe0(Ir=u_3{--K&tr+Gm zO+&aY$8OzP?U*A)Ou_7k7H5rKcdcI5(;lGPnwUvfd#OG?V?9>vI$`eHCsBe2ZM6DE9k!xo&*5gFEo5LFk zXX@B~s%NZ6fsdI=;ER#oh^ftItjE`3Xr(%aKZG5M;}bL16K1|2Wd!wxRzk3?UYxNW zYyrgehMpaGKDeB>XRId>IC9od9tBzCs+Y`IkBZaOM~$EIL+5^ca>ja)NB{}tJ@gZG zsa~3~o-{_41XDr4bnMzzvOHrwxEe8e$u^71TEpH zT&!fayT(e!w!EI+prfd>4}f-;)NqR zpZIK9^-hYi`p)41z3Yv88zL|4HF1CJduv*#UPWtUJhgebRH96L?Uw9>7L7QzNOF+C zIJ&l-ziVo=Ka4U*Z8b)x z9vO(V&XWi&fL7Ss;D5FlqtlNJL`fV(xn@U^gb`V!wt(o&_IV3S#U3H4F{Bi2nxoIo zNJ9fqI}CgzVic9W9X&7w2x%CL{T3l!g@Nt7bVd+JjFBlwmapw7@tx#l+XumM(Tm5h zi5P83#1TI@D+p{xI?36wbsTBiefjo52&~NZJnY#T2%iR1r0YsX(0UAip!cvHrM*PsMKqRi6 zirphcMT6Hv{^}`!(18bMlDVW>Q6U=7*USop9rze}9F*FrQYetmO$P+}ciRn8A1k`& zeEF1_<(< zrD(BY$5kxV>~*sOkysjgrkA5x#M2@7ziJvF5}4kYUU*g_$o=|Rfj|R*Cff>KH`Zb& zdBYSy99wVKYxi+2J3F%M1;oQ8@cmwhO$6cbYioX?xHOi%Ta9H8eiiRDm0?&KXi~2j zgAyWHrb4nWDO9DddQ)w|q`kv)khFKA@{v@5MM^JWVkJbcwIo_NEImVS5QX9cBlUYNFH?S2v3&#at{Eu*f95 z(t-U=wIk>GzDQYdu&8$7Rslv5rnMvsT@l~7XysV+Qzy(c*|Tz$d~@ya*qr0)*=!bC zzOm9n1>P8~-q3YM_>&^1k^TxBtexZtq2E&b?zLLP4ILb>nqWla7o?k833c99$ByFt zkQ3;8qk&}2P*zId)v+wbLSUtOCL>I7P-EglRJ0;XeQWK)7=JW#Yg>7wY;DaUNvq+g6Fl$V01epsFyHH8#l(mFdXKW4vsv zn4D%#{MOp-TYxgYu#U=#1zGSvHDQo6uo$YyOBMSRM9#r%{I=SS>%`y*)-uL>B(&NJ zy^C;B_=yR9`Cql>8gP2#W~HISINbJ#0mU39npIhewC-Aw#`VNc(kN0WcfWlKs+=*+ zj*}!fE96X#`yHzTI-S-M79SlA+1jYjgBO1LYDLq{jOSz)S*vie#7R}}$6%o z7${On%@>5VuBcqR`Idu(1l-l%c(qqWurYoh2x5R(lvNUb2U(7OBHk6pkPAoN1o z$*h_Ch%e~nHU9Mv*IqEv@B)Kv9q64PLZvgf&$cb%>`%9bSaPvRERw(zMg#9FY%gJK zRZ15Zrz27FN-|IEpkj^v@!C#YrqRLRWaa5xjOKY@{lt!H6BZS>3Dyq=Z8wX4a!0kX z(tLdF92Mb-;fKyo?Wi{KcfFt9QEeVpBRk3vra}eJ?ETD+YV#v;mJHBj zY2*ys{n;JWhMP!W$GC^Pm?^ZS-n*mP1O;)LhQ+}jC)LUOc2t{2?Hj?{vf1G95GOyk zquLN7Re-xQK5}?#x%vBdR2vFcwk(S{5i9ml=zU;EwTWpc&LCi9+|4i&{rt{qBb6^s z!YD&x!ldl%7j{$|6r0S!+Dh;yje{`x#U0gVdAY24H*+&4!Sa4-N3~&<(7q;_F#K?k z=E*Pbs5Z>-EG<<0kWwf2oL|{dZAwD$T=pZ>;S$RAt2?UA@oW_l$`&ZRQ}7M>wH?)l zQ4$v!%OyewcNgXV`i^RgaD#}2!O$^rTUq!UJF1N=NbD_$IZ$yIe&jcIR2!-Sd}1@y zXqn1&kbiIrMhrslrx>eiYvoD@uN6n%;Q6*ce5ZCo1>ocV`6xV$RMG z;dwyPa5A0$-V{J!#mIa-o!F=hS^NE2fxzmnh!wP9u2L+e@kgcrB65T@XK-vdEIX0< zgPDQwG=Xv0ZShLa**pGl)`}#!id^iD3h+|F_2!SJ=}m<5RYv$tm|mW|K%l|5?L09e0iMIjpG^UT@~tRlxs&%F+M|L$pB0GQ$J!>{aYIZB+Wm_ufJg{J zM{$qh%_Y(_cRxNW5DG3FoNyBSr|>9s|8fc-vIwv-Dv2Ouc~SCLvjQQKA0Ec+=E(eL z690M{AmED=PQ<}q95y@8{$^Gn2qM-NmPbMbQ`l?!Z>Io4N3kEFWx-bq*RL@CyIFx? zQzU*k))|^aM=9&?rvU=5NoE2ERX0VkoBYG9K%@zdf=-g+T26I|^^a2kkz4FPC|IBu zNKm2wiJ5^A6IW>20jxXzhVeg5W1f<5FkDs+cW&b?Y#|ouV7$pb{c;zVfU#9uk z&MonHC)6IUGI7NzYmI&ZaPV+H-zUZG(BLqYi`cd?6(|k;{F;Q3e zxmp}j61(1~rujJYQ+PNO7a=+|+z$S|c2A|YpQwIawGnO_-;(=o%r0T$0>B|EI{9?% z#%<_RMfY6B@Dp9EGT0%M0%3~3;(ttAfe#L#(02%W!I>np{&U(2ViYgA&h0EmbE<>% zziPq4n0a($i^4&#yKryed&ju~#I|7dcr0ZkJ#8 z=@jK1$%0L}oC8E{iu?$E%Br+uIMc}c-#e_0C@hy@MOeiM9sHl#i>j$6S+|%V4|dPY zmi2?o7olcTXX^2}$n*bOTN=~7SM~}rj25Y3o6UQA?Nc}7(>PmmHVehG(6}p!zsc1r z>Q_qA?Jl9}ZQXxm{qEJ#uG;PoSLC1&u{N871Vnvn4nv^ZlJ>pZBXwu4NZ-r2hkkgryHTA2= z+q!hNMK%LMG5YQFT>Wj^?&`fAV>#z|tm^B90~~8Y&Vj=jc^f3MZ*M~;es5!RWZW#B z*Rkv3n}e4Y&S$BszWo0m7)N9*g~?+V)~<)JjCcBL>*EHg3Nc4VPhgI!PN67Iks$Mg z@t;O*$=Ex(VI_qW%uM1F)N%bvTL?5Cb;!rYfd_|oMN^-=7F0l72 zw~Z?X+0DTvLXR+UIXN;S;u)Kz{kr;#7IsU5j6K`8H5Q$ez!)(%7C=eWb_8)Eay-h& z!Q!}IRc~%*5wmppm}ROQOp~dbN3dVf>+1)%xfH7NcBsTsB28GNB*JCNQqCLdPpqC6 zgZ9SyRVHt-B>pfbunfMseq?(0p& zwe|Nu+D_pzd4%_W-O zq&7m&?|ohUS08P}nkl-WmA7TZ<0M6fEd_rjnK)ek>pz2M#zCo)_&LsvmW!L*H+*K# zjE6*zZIIr$So*E>8|!B$(Bkp{EAkOdVgjqZam2J`xRl9xa?R#};TiESlbdo6S$(z$ z3AJNf%YY!oniYIg{l0~JCvQ!osz>}_Nt#EI{APP11BW;_Whxf?Im|O@X5c)&x&FMZ zI#oE6!P`;?$Gi}D(=zAGP!ryVF8LrLBKQJ=w9{|75L*atgJ{<{h*CUKF_?X8{q_mq zO-!g?WK4hZmll3H7FgQ4;)~C*L-46eofyzAj@R zrkLC%v>Ja9$@^o!wf_9=c6i+h0`xb*D_1)~m?oi1z=;30`W+K08)5ADexUGy&&@uj$4Y z#~sHiC%aW1*0`2#{Ag7BII^rVyI@C-rw|qatj9QKyrX{Wgo&Lbx)tm=ez%+&LtpU_ zBxw_Aw=ntOgBHBAeqd5XlTOm$P!o<06)YoJ9U4muw^Bb1v+%oE?i+hFCcBUKN!+~U zEE%${auy}XRvoKC#SR+)4o;GK443gF`|b-t>a>pOD`6eJ?EP8(J&zimdB&;~OR5Uu z0sQ=X>tDK1oxa;Dcd%7O$6CbR%BygcN)<~_;JV}+Ao2pqBzxDy<-f_q6uEHM%m*?v zjGvd0mMCD0%-&t!%6Cv~MM|<^YCNS#diH(wS58{cBTTQ>(FNVmY1t)qo&+{H&?rBA z&jlLek&KS4hmT~+#wi{ILH_*{H{1p1aYN5R=;Z+ z;%Y)+)-2-46ORiwh3k>v?&RT#%*rN%v|3Ze5-6%7zX%?#A&%=h{PAhV+;Bhr7CHT( z_9-$laS22x=P~h<>L=>n$W3!%ApUv+bIZJkkI_%o4^J4N^030SYRn#o%c0O3JzK=H ziv(|eNDLQ z`#S-Cteq32SCZXAc4`ZL+@wrK*Ol9$`?C`#YZBX_3LPx7jsjLXsdIuYm?g3yi1+1t z>x9&lC&#buT^pgDRWKt}5wT-B31GFwI`_W%O&eK^5#x_}1x_o4nHyu72nWq2Z;yvh z6&%IS)o+`w2GrRtPJN~Gj2@w(IVOuhiSGRU^?RnTYAidw%#2Mc3q=BA++93;l0Gm? zmBLexq|rru_esKoE3n1_MU2kR*YBJjN`|r1hb1#p?vmP>bb@3qAfzq$h5GH&*H@f^ zOKll(%Ea`cXJ)@6aQheQ2PV{3B-SU!XPFqCN=|PL7Ka_8hseZ1e&0MYc}WPHvwo@m zWs{bEwOsEe{EKkJ(wuN8G0BV9=cpecX!X_V>qZ)1J8hbLP|z&0>Y$^vgXEVV0SMO4 zvN4q73WDN-D6=s7mHPD~o7|>31`%}%y*KodM2`eAq`qj5onL(f;Fl3BkNRT{16Lv= z$=`xt>2UJEuhn06(dSS`u(T9o+K3_xCmc2(l5pr>pQvma5ta*rLL7#1LgMhSRs=}s zxUixmCauG7)Ys>PnGom%DWY2|iBb&77y_$Q;)qqI=*kH5YsP@5Uf`CUc-&g5{+115^ zRU#Jg#0k^izkni2M)n=Dj7W|SSCM}4BlRO|j|?!e+zW@t(!dt0SpL7+fdQDX@n7a> z4U$BYc|QJw3nkrU_^+_5vA-qQMV0@D$O;>|yvh}0l{A@%bX4=w8TOj;b}@-8G&-oP zl!zdX|3~%HThaPM9M+x=M*Httw)cGdw9xp~UB*UVhJOhuLEzbZTm5nU{)^UfMczq6 z6ZvpnM9q;AJ=TA6p=QNF`H#;bJRKIS)YpGnFT(_@#N5VBg|Qp<`m)btBx+!vBT9|r z3pi?hv|b%ZHb1;#ZMv5zkG)Zb=)SzU^K+%g|d5|UA`&j*!Nu0%fIFWV+w@3cNK~AEE40BNtHwzf4QXw z4wrFKSwmC3h{IjdzJ}z*Is0IP3v`cab~1N>Mejx)~X4 z265ANSj%ggzElq*ug0EFZ}(I6%Ui8wd?(xPze_Rc QB;@y}<@Zv5ktW>#2XnnEg8%>k literal 233550 zcmeFa54>epRp)umx%d6M@7{X%)!$e3lB#oWRVBBQ6e$8EMJhm@l7yr~22|RiZD&#u z3M;QdfTTcaLsDSGsHg$s7)QE|il$Ve%(S+&LR)Cm0#Q*Bqk>(wQKO>9)|tt)w9fap z*53P^``)ce5yLp2`9OGe&t7|<{b%jgEdTC&%i-dld$Pk*_vnB5 zJ%@As(~8g8;ViRMcDStqr1QJ=28D`y?k4YU0eR`}!yOgy{{bOyIwtH@-tgbMV+Ig! zHnSR4@7><`-C6NBt<9|?x4&iMk*_;`^Vb|Xe)FBj-*Cq*UvuQ%9hAdZBM_I4G z<+j`2@S3a;U{-+F-Erhd)>g8s#HY4bwps%^@$Srro zR;H{bDwHyrnR)+zgqchJL| z-+cUa`@NE04dlga-B`tMe5+SHuR^as^7_}m;VnlT65FP;4%nuQ&dn*ePPX11 z{~y(nVgIEEPiE88)IKw_z<>Se8UD98vte#}js~)NIwm=)8V zP4Gd=ennJnY~?G4j2)0^8Hr#D;PTze{iW4?LwR4dOGr|004>dBu! zmCetb%;%?l7K?20jyKybONAIST+-p=DKx7~W@k(<971~`_zFJHLjjc>f|tv7>kNbt^EUz7cC&Ws#+ z&6|(MGAHwOuelm9{f-n{eIpX&a4{^#x1 zG-6@uo}F3MKQ=6OWo1!iR~A{Bm-(oe9kwbSM@2Sl>!&@OBEMa>`q{8mwyJxsTc!l* zs(r)q%5eJ1VzxNw{{d^=)T27RJoCt*?%l)LL*;!B_lk1%VP3lD<-J@b%ht7&YW4Hs zTrclV%~$Qg+k>7WGb)=`vnzv6l?~?k>$VPhcDDpnwo7%eyF#C) z>0?e|^)V;S-wn&?%B>l?MBh3Lgf{zIwsrIQDj&4w%MNvUQ!UV> zc6w#c+Tpj%Z)~(ee(y$&@7i8ocB_14&@J;vgo$^Sv-b{WONI(sU)F1tMSqE|&#r*4 zfkCsuT$k2b{URi%!N9z_HeYpb8??&lLEaJu8JXU)PV=ksIXD>Pbp80su+_`vy_su! zLQBzY&-b@x^W~gXv;vl9uL9W=cVy45kddzp=auZ1GdECy&7)>!PR%eSdy2MR%Hj<5 zS9WC!^JV7LQ&gVrZ_DQU%luuC&3E)(&N#dCZ_o3odzfjX0HcD;$1p5ZeNipl=JU}i zGvNa~GaKz|As&cLm4E?gaZ1?kZ{H>)0n3jMa?R2{FPzhzvaLa=_A=*b!FtlaBb%Sf z`Y&1Y@5{6Kk1S5j-P1zF<#!k2iiZkk3o!xxD5?_$Rf!eaRax?P!}4%yrDEJ9r;e3V z)egF}Wm_oODyP)HT$FiC3}SdLr&fkjbjQiC`7br@Ft(}A|70Y-og=QwESt_;fXM6C7vbh2?zKTFelC z=bkX;Nwv>_A)heOEWl84OVguKh3N?tVOWSGh|@D0rT~lysXltWr#T6EJg$p*jp?Cz zpguiwr6$*>WL>Gr94>fWC%mqyvXQ2-ew;4lGd+uIrso8xN%M2YCb3+M-KYd$hWcXw zrf4bxtfTo=t-}Ga(;$|=^FpkI6+N03cKhPZfL*Zzm4ICoOQM!pBS($4Q$BM%opL<2 zBc7BtGLB^Jc$!{=r&CQlJ!GZI>4=3&fH6uIU^OY90#6T7jpSm3nEPlX{vt6imVM~h z(IG0HlaC+_V*_8-qlCv{(o=#`#yr}u1q9Ns*fGDHBpsk82d@y1Oe-cB40iL77sG1p2 zQ_fylJgzClxHywzJ;+#KXiuPr%30SuPoSgc$ZAW5xv=l=C=ODhQ<0O_1Fv zaZCfIpIWeJAY2s7v@7sAplEMnsCGFUwYU1gD>lkK^j1bj)GX>ZVt8pK(Y6zdnR{gP z$1_YN*c*_`D#0d!C;_r62X=#$gJ>Ch2LUBYaw(K@XhIsyIVwS^MS{~AFF~ncU4Ygj zkc=u_f9UbBX+6_W4?)zJ1R{c2eoU2NQ(aYbA@q$ff+FpGNoa8pCm=MEbr`G z7>%uDXm#fAEAr{pw!PG0*K8OW@xhd7V|Yj!ou9Qr;b`1SV4-Kba+fi2?8a zbN*Mh%``sQfxfC}$+V;C**+%IF`Aw#1k$3N#1OEOOd_ygNmh~>GvfVOvlGO+yeN~Q zR&r#)b+R;-#ba%0k`>rgSv(r~!du2>Cp%ZQFxVP~%-QYChrFs*G+dN6i4p8frRi1E z&YYET^bnFmO8caw!U-#sOa}*`@anOs1oV+iPw~`4vj_>Qk+CT`B>F*s&g$=m;k1z^ z_PZOKQ_yBaBMT8MVNuAm48lFF*@2``c6Ao2fo!VmWp1n@sWk%&k)WcTiYnMz&1hY* zH=7;ytC<^nFNEIv>t?g5nb{Z3;pC8*t}DfcQKinN>eOtxu-Z^HPEdu_>~Yv|VY!^T zqk8*4wBA&qqMlE6r$rr*5Pvd2CX#>NMI+0)TR(H z$ugb9JF4`Uv!qs2__z#v2$w6Wyeg_7UZ$$`*C7k4MLc4dh}ZQlBhk99cZDi<1K*_I z3~Lkqn7O8yL4=tDLmJW6!=_GVWC&0JzQTe0SK@;65-rF>bw7v}bMu7-{9+OLAs>*&HDTVf#-kW6@FvTeQm5vq$d$Zr~3@EZU`*df(Hpjr zY*G3TJA+M1|50bKS-+2W@CE|^5v_`0-4;>r4TtQ!-1aXs+Zie)5;pH40nb};Bi+ot6UlG4p}^26tdPQ;@?ol>D*RMn7w+= z>Uo?>-hyFrXY49>hN>?rcZa9OEE}i#bneZ-^;XTnM>_+wlFcQAH)4_pP}!dBw>q|H zdI~Pxt@X^5mY$hxO@SDNXyxxaX$fs$NLJeKZ&!gKSCQvmtO7%D%Ygr=2CL!UXNI3L z!Ri7c;iEbY0J$9L7kUSP7ORDz0A<5@VIeJucG={@eSVRFeZ_>1Qc~ox4t<*n$2cCz^%YF7FtIhcvIb)cIzpqGG zbN-g-(WJoN&ueDE)T5Bah+5O3yyi!~J@8N*KOS&rS=&tM!b=bsD&$Y@{Ky=ap90^P$P- zmsXFb>HUGy+VC_3y{5GGJq=D?R9fFW4f;w_#tj1t=0KaBv-oI!v{JBAfUsgtJ zUs6Wo?kOWKFE0-S)Q!q(!c)I|QFz*3zBoMD66CRUSGDd(bg5k#rqL>b-I)ml!ETdH zh%C{bONQ{iS?DG^0zk@FC6e!FZvfPu9pgPoj!u=cS+!S7{TW~XJhbSZLQrCC&b!9> z5;{H;#^Mg9i6$8RW~Ik{ktp4hop}~Z?e5hR*F?2Bv>R@QLp{FiX9;I+)q(-eN1D3C*~63A&MMl%L; z#AO|iwWUfHQaI8Vk4cQz0@+P#O}B4h=n1q&f{o1Bp%YJIVBs8>K!!$5DbraK$S7wM z$S7wM$YwZUU}0F9K&Iy=kTJ|mAe-TZfdz+{K$gLkBaqEtLm*>_MS*-_*%>pjqCkGE zXS{o1GgDmmSdXD?Hi3$Bc+lxiPo&XgP_JFJo5>E1K2M#S9b&w9AVI8jd3lSM2|hOO z$-JASjX`sw+gcaMY}drwHVc-Hv!rb?O1Lxk$u$z@K9YsVAkCZ4y<9?iOJoqU>baM3 z1XKRviZN@alHA>6o9%JPh8P~QpV(vxd6OC)1d3M`_-W<1) z7OEDKPy6d*>$7nlUpv_*oS1A@P9~79?akx9v&n92vR^>8)7{x~SBpPvjqk^OpJ(y? zJa?6wtKLz?|EfLD+V?8&7NlanDceltUAegA?Rjd>c)+z?tqly0E$Z;3HoUxTNVyv( z5{s3`GWGK1${5@VB}B|9yUX*F>ki~Uj37}brTCsgRPbELu6;tP z?IiE+S6dM8{)V~%yf1+Fje|!4JQ@dEhpB}ACY?nkHa@^?Ks3RI4!}(f7e@iO)^OGP z0JF{QI=5JX?pS&X3h2xYZ+gqaMMn9>M8;tp8N3#|6n4-0Bg$QIE=7JuX6GdCl2l*hweC{5^>e zb0b25pVZjfng0RCikM_G!( zlQgYeEi7-0m8WF|P=VYaQmVDSpVC&y%Z6s0APTWeM6_~sOq(obw}kheo6R1|zk!G* zM%V3XWR6E346%u*9E}cc5S3%m!8K6@;yI1kR17+*6+O$pP6JY5Mq*P};#t^^ z$?t}%@mlb^@c^qFem7l>*Mi@ad&s9 zl6K?f%~?Xv7^F%Nj72rVNOR& zaN^cPTs8QfjjsY~Yts45nm)f(06iIVvp!pvpsfn91m$ZEmf&>L%oi7#Q>H202^9&# zo!zN5!ku8rOSNGWO-I>f`J3cq9CNfSAf6TL$q9CMB&QqNA4Z;s%a$K1Tl1uJ>;;_W80m0_qEU0-0kV41u5Fzjh%na1*s(9 z(~2QmkYbgNIU{f`m@@+LWD8P^7+a9yR4`|RIVafdVOPhT5w_FNa7JJ@nll1thIxmz zn|3ZS)CgEW^boMXAGWHkBdO`59^{B#dPy-%n zq30Nd5eB6gia011s%d#Tr9rX%Wy@2k-Y-hbUF+dwu_a3Da@vd~X=y4yt2GU=wU`}l*+&mnLT zu?@S=;*NsAB`1akXgf}R1oSG#UUc(K@Bl`W@Z8?tvj$ek+FMLfEQCZQFVE*=_kBSG zE_U8C6}auy0$0W#pT|SS#;8igywV1LHpJYowyi?E&gBZ-R<5_ys(lBbX_7}uQU6exy+3Q>5BU8k4Z?IZbM?;we8k%a;T$_=0sA|{sQP>oEX|T zf$T5Vv&1Qn=pR!Bs;c9!69Zx<3-nJ#vPb9donW{Wa6y!olN>ERmp=0iw~WARoj7X+ z@UvLuR^dYJPH+c3!(J{u`&IUz{VF$Gl?yBVVRzHBU;9Qao)@XNgb>-RD2XP6bws`W z;-I!>GqW%yL1FO0dXzE2bc5N}L6y2X(@wp(Q=(XFdy{n=aHg>No78C7{4IzFSKK>C z=yV{2cJ}hVR`^I#iLI_537K8#?=072()x*z*}-Bs5YoN2x2as@Fb9}W*j3q<(|-0DqKoV2`@3wPT-3SN&uFwf!7HiK6MUEgukm;) zhQo~?MR53&;y2b9L^>h-EHjVowSD1+rjRoqhQihSNg-@&hNg2$&+^cGD>_9tSa9d( z7vO2c`~?W`%o(feU^(4{eROcGBwYuKQ{}U@0jE5U1!a!vpiCYwO6Cd`5(Y&8o6Q7|3eJ*E^G}S|jF!``vJ4g0QJUM!=LA?i zk&Q`XR=!a2nj)(S@tQJ`Cd6wBm*xlLx)oJ?YjtH6#LYGB7W)0PDfM$+N2J|PT! zz>b6P7LN+j6Ma~3-6Y;_WAcc;z75AC`bOn|!XDAbCVvbJ2@!Tm)6`syuu~c#v14_F z9YLFgU>0F_(j-Z_BX%O3T}rWsXn0D1)WjFE+@HX~f3kxypoOszd%lsE+v=T`hDQvj zS+Ev)*)E6W&bSRAB*T<(-N9pwQ8pyQlu@wpxSBtSHnph{tETZeerA!_*NIs@i$ zZ+5CPVA3wnJ`$pbf1xwLLAp14v@_T(_%C(_7b*SAA$s_v1uE^$ezY^VBuut#hL6Q| z?oke6C56;jV6VxUKrpg#$6`B20YL0PlW#4y6Oz8fDA(+WlN>T(peh^l)qJ-xyG`&Y_|-?_9cWOFmp*S}UpM4$DXcNfb0C203UdTW^!olo{lp z<0X{zPJ>ZZ8`gj%oN^j;q#QJjq@r?aN(ur49Z>`!l4OTb$55wABmf$(n9vyR4H=DA zjQZ?cgG-Xcl4LNJec_G9Sja$A6Fq5dKsixdkb!o;B4q3v%Rr?)FJ$ab8DhDUu$<{O zo*!%k`zsViZjN_xw4l)Wg(y^F9HCJe_&Gq1i;2_`@c}r!Cge0m>rBV#27jk94<3QZ zIR_Ua4b&-z+FlZJ8nr2hSv?qX>e`Si$dm*5yNJNhAU_byI6dFbvz>f;!fB%7Z5J`A z|H`4oLm{WpqH-AXmxP?Um#XG&#}BxayEKuWhfk(+N*;en9qA-Y2*|V(E@rA3fPTc2H2w-A z>A9&DRf_0}$4R^dav+{6G3+Xg<&->Q!Y<0_1K}CAeNwXHvs8jIdVWng02ppOa)NXL zKv&~w6bCTecu)ln^j8k1o(aG!FBt>yO5^m(<;?$q{IhgHJ(J2j9iFw=IjOGQ=harJ z76GXC&=`Pfza#=wmCXA4<`u?uoWt{M#&InE4*beI-NBys#dUOp+K?PUUTN3EDIw8; za^Ue!$Z7Dna-eJ-&~w^|&0B5ICccC~Bx5=BG}20fhr>Z|oRLf-7{rAYcfv`<0aL%E zt1=q2PX=9*a8*XlY}BGrNVY1YF$yw}R1&SqSR<(vT_<@4RXqkn~~EPtjj6tIyqifkW!M@ z%4yUUq?81z2b9Hq6Dg#>~t5%-bZWIpz zuC;d{gtpdVQUK&tEhYsRHN~U=`0OVCX7?|W$2rEq@X26?5Z_!zu;S)w0B zr&@kK8A6w^XKaYV^O!AK2@Vcx$twVFCdn(>kn~b$ew1D(!n35; z8BzQxf2o$v0#I#|&Q`*D?j#ZW6@}O-YEetG7A-v%mWtD&HP5|{fkv#7Rr4##pf#6p z4e|>VOQeVWr5<&@%H z6!Y?r|2RX`ivnQUF#u*flDe8ARH2yH1yNrNa5eV@x;WCC1fda-$&4|u&AUmCF|bXS zO`C%idIw^^c&sQmq0f(S=bD5&J(+Nwpa<*i(4RA`nSK(atTt)|s614@Of46_$txQL zgDqEG05>i>(0iC@GL4kiFwvBQajJ!>avF}9Az~6&Knq{TA3=N zp=iheOInyJqoJ9|0H0cyDx;yvPb1w}=hNAf;qVKE^m_HeOS(M2_R>MmYV96*7r}c0=1RW z{-%v3^JQPd#A((=~{Yb*zG5ErfuaS)`R`sAcG_72id@>Dr%rJn}o#MdOf z`!UR;^wa87E_b0#4xong)B08fv_|>~f6CZ5CghNQ641&Rjb$MHB%hVBM*3-ms*J{P znHVs%FJz=C3Hur5IMf^U)Y!5Z>1VRnsJBVG^6mubcM{rdNkY&NSt|MKT#$MYWU1t@ za_ZVl$}y`^`q_qVScb`|XiM}UZx8XdYu;3EkhgLdDyP|h^C+8)R?c{f(x@g^TZMwC zf@J-~jLMZ4q}m05mFtDL07$EP1uX#btTrG7K(daKWIY9dO7}F$Taxu3h*QyM#da0}ujHX@^3qaS>lDPWZv`N-0 zn$(FzIbq#%$@)3%fImh#s;;HD090K|aRI2hmf|1uS84~O0K8JWCFP(6I$)1K!ehswKguJD>K|qf#QfaL`+2KE~rl zFY|F8FLday^0?I>e~m|kFlEaY5tgh=N-*${)+e7NYlH9Ps{VZ|<$6zj2VZR9%8fAg zZ&S+0u44Q7LWK|Gelje8#m9Rp0~>qb0ndGc+KWnTRI_aLWCAug{HX+Nh@cZx?yol_ z`8OtDLjgS?ASTv~Zf`EC_ga}#)^6n0>iYqfj*y3VT=vHw;Bnx{dmoQG9Qs2%4*l_m zdEDs*PV%_Rp+CaoZh!ny9xw6&@8|J34*g>uBkzkkZKghxfcs2m8Su9ga8v_-H35C- zR`M4U(2-=o4=13b(||vffR15O;gudU2KOsBgps=pNE^89mQrk^CaX%d+~$gwY@I^8@0VR0UNbFAmAQ^ zf!FqND0iN#}{`b^e7-z||X!DFkLh55v8pS{InyP1UnwLWC=m?E^8PY|50`{Z$T zpeQFStwMxeJaQh*C=O#<77My`dR=qqk!iUFhWQ<^Ex-5Gq-48s$?%lj3_3(^aetEC z9P05=Gj>0)$4AZD<-r~w<%S;Z%{610=vt>4%fu)ao3Ttbc55S=mJB$^Z<&FhaqLoK zFn;cfd}U2jXiMW-V}Yn=Q{!S|ftZGk=|)sH>gmmf#)YUVMThHS{9cMN)n{BB#ISXw zE%?=iXxXJ0-g&tNXvDOxTK3P*v>l5!(kaJoz_e}@h?rKiXvB0!&*4@+tp;c^kC^tg z2AA817(%7#cspWRX_1z+ki@mp3_soOt27u&xBDs$5}UXCKGxG9Y!%C|1s$U0T?su_ zh;xWGK&K>XtL`UNljVJ+YWh7vswVWOSdi8n@g%95b)F!Vcua`3i!b;@2kpTi4;s_b zjdcBk*sl6u3?w%S{%4Dc(1$e48O4ah@QC>hAE zW>w4>D-~rRzd{Bh^7s)b#YrjkSk{7*ZYZn{I^hO@gq;9rEU!)-a-t0Ybwq&F6Lmm< z@gB&GW=h>6D-KddM#roa6`!TL@OX9Mo2z^NMUO)hWO80vzLdP0^1~hIl+Zm1nige`aZFhObrCU#!ZH4Rb!^ zmg_jniJadP`AVtpXbqtg|I7ggTkI&HUCL&6CF&CjoXlq4(YPAeGx^Ux=B7IW%6u

5p*DJ*BxOxQoH)K2niB|4jG5^Pv(ayH3k8`kV+%$1v1Kd&iP!UCSG=6oGB z+KvK*%sO*OR9xeY&Bk@q3V@wK?ZuaFAqxB5N3_>zz$ktD3IOW9|fHN6mjPe!Z6N4$cNym8M5BK zWoE%bUV;xn>#+<$x&h0#_(hTO!^F{KlE>TpqBRAAcnn;=qCq9BNU1JUr?!S|wt_Pg zwr1dv)s?}ba>r&a1};Qw)G#8xj8EIVe%b0{-h4W2dEPTz&Uwk~=`bBjMSAzks z0s~@4VD?q)Vln$7W56uCXFm8WuK8#CwBW~PSPMj@HoH*f~ zZq4HnxN&)#{2dh^z}wZ~VWmWaA^driQHT{E^jOBwg*EYqwCQw`#5gL>!+18nxVK1F<9NSAUs1QTiuGzXGo znjo(_G^kn&IDlCBMB6VpyPkoQ%{Dv2ERzN@r9=v78Hk&RtO~Bu_K|QX626zMV$FYA z7MR%DLrBXYE7OQo(5DJ2i{9aX6ZYLtfql4hLMY{Xhhfz90*@y+tI&~(Thk!K;)8ON znal@*(aa`RZ`@b?&sU=UU_1qFT|b0)Hq;_UQhn@rxVb7S#8%0afF^s5nsGd2X*HGv zWCuE?^cM2!?NNxT9zaZ`;f6)$D9KfeRi}WOKq87)*wwRnVs_Z#H7#QcR~#e8AW~|YgSIKf zj8B+GFP#?^m@s##$6KlnPgtlF4eBMuvggdct^z0ejzz#v!4h5z>t(vN>p0;;B(OUZ zibS@L7|Ad5_=0$Aub&mpCne5uYbaasurgllqaqL;6mazTxhA5Nxi<9)b_(S=vKwG> z$R^*I*ix`RzJXCtTD#v?Ls~Idg0{?nCm#0It)58JD(keLbPp7wn1L9;P30Fa}Fg~_2MFG4noijrC_~!L+zUG5jef3l!SaFu&kA5mr~P1 zv*qU#^#w=umkni)*hHsQ>eoJj%_`I?o&hl$2MMrcI<~T#-DPXExdGCeMkSbM|HNC} zez*JvKhLB!&!=oD1uG(;Co z<*bEShVQ}oTzqnRkr#juJ2Y_mNZDJLO5W%Pbl6q3ehFTA!`H~DK+jrP|T)+T=~ zeW&efi$!Cj>n?!Nrm$N$h6pyb*~NOJTOI*Bz*xN2?zr|_bpx(=n-oOO$2L*Q4_%yVxb|6ezOr+ zY2E8#?ltGW+^VT@^Mo& z!2}L><{B>pc69&!!1+U@ag890D~!OBp81hXIlMLev&FME(_ukL2PqMS8Tj zOxQk4rpqX>TuSt-NNs9SQ!*C~qf@#l&4(ovHxjMbVO5Qb0{g~PR}JPw z2K1Uwx%fCQ_>>#>lRibUNA-v$LFbEC-@tG%zH(mpdjnBTtFl%8G#yG39wapNPPDso zM{#;n*Ot*g>yqlMuTfFpW*j&Br6&9(|05#lw64A$9Tw{?SGxOa1NFfn?zosTb$9}& z%+U#1V6%<|?PJ#PZf~OLdb+qK2h@t<&va#M%9w8{OM9{iGvn`MVl^qUM_0BBF3RqL ziO;E=+`I)MK{mchUN4mrVEGDh{XCpQB#b zO$rqY<3iX`4!*_;!dLjtfnlYtjBsHsa)4OBY4L1MqK~n2J)= z>Tl==oZlwil?GPHX-PO{N-&*wrgF-$f>3cb&sFaveyCTM-9IW{n=K=JZFCt1vFB-i zjt3!dG6?kI`UT_!wzOwieg1Tk7Eq9o0likRczi*r~^=y~~HgmnYL! z;)^VMy0RzDuY#3#w~&F1r|e%1x1T=hZiFgVLe!|aE5pmJsxHsO)I|_B2n;-sV7nM6DK!@)7o<<3}DTE8#baLFyAz}s= zrwu|T)=t(ow6bLGfVnGDS=t!jtaQbWl{*R4ub;%-VvHNQn@lL}ADPGjQi`>_i@T;| zhz~h_P9Xk&676a8RW4<=$K zWj~5QRZK2ZxkI9&%W6dJIjZ86?r_CWl~?BC^9^PsplY~iK=9zp+@Yt(oD^g5HZLLn z#2AdsGvuBaYvrBi;G0O!nnKPAmV@mW7-_UUo`-J}?*=n402oh@9ak&)F7?>hiioSn zNCZg!bCdh0Y)vMh|v-4MJcW$(2re5VBu55wULb~LQs=_eh4j<@I$DPUVb=x(Zdhd5mfo% z?B*1HxQ<|eAFd;q#E)G^P|3>O5E_ZcxclY#ED!sj5;8sJH=(XAxcN!R&Fri)_ z92^>&IC0XX$&;r{nL2fNc-pk-(`U?>IrBpwnl)?o>@@v{Mx)vM(wsSS=YDzKy!rDt z+iYZH!Gg^<|H_9yyu}s^7k=a;TW-14R)6z1AN}aZKDPDNAOH9^+kD~^pZw&fKK1EO zZ@cYhKJ&MK``OQa^>d%wZo4d7wCMAn|GU3iymR(*=9q8XL!aX@)AINH2Y*<>XE$xQ6nLrweF#~aSm>By6tZ*c1QTcTH1+pr3 zo9_uL1q2i3AW_CDu{`Z6pjBbbM1K^ms}0jronl!(D=PJOm9$&+f%%P)NgtTs5I{P} zs|7ZXVeR>W`Aq>+%(C)<`3+Hv4)KBc4MO?A{PuzQ4gDNW*~FeTM}RuN0QP zTFUp!K~W~kW|a0hV{L*VgLP^%^4BdX$$^%*kfeCUC-sw38+%_E!_uX7Hp;aaC*+p9 zt%+}CDe(!mQ7a+AetD8|G7aX-ph_0ehG%nC>9q|4l_<%;B*!|dH&0WmoI3Kf?a#W? zTa?fD+=JKBB-u}T>iBJ(Q)iExe@ZN}SWFFP&3Z4-|1BzytG6m3S9$lKwK|owDL+uJ zx?+j|k#He&T5D`)^s}-nAZ?W`_M*0`HLBNE&(F2hZbn&;`t2v~KP{p^HZj5&_P<>a ztxzeoVXbALhEPTqjvnNAp~Gf7(pxsI_4kDt%|xg}20b#PHN?Oh``gjHTyd`v)|*}} ze3S|<%m9*FY}1aZ+F-dh$XP0B^(@$OH0`ehxl3}$-Cv0Yiu@vB&)Ri3!4OBE-M)gY z780F=VrO4Qc}iiVse}1&k#8|BMr-lYmJ=~epu=#XQ&Ifj6XL8+Otkp}=!c+cvQz^q z%~5xYHH9a=sCd_*u&bEO-Ax3{iA`OsCzD2_1asg@U3H25vOf33rl73LpVaML8U{8h zxi}E7tJ|DG5Y>2V(6F^`JxOJ&V)t$^F5#MiB{1!UilNDc{y0~_Cv$coVOxc=#D-&8 za)tBG^yHZ*K$h&@ted-8ydB{daLOTsLk6P*>DA-Zb|*?r0m@)XA5@0845S6qIzZxv z8t{)NIY7W+i4Vx8i>zsU$leErJ3*q(1t2o2Ep3L6qSi;^&)O?dGuY7lbdrGdxpoO0 zbrWr(qBRQJdHnYoh4krnGm1&YQNYkN3gM1XbvT*gSI`bvL~+vWi- zRG0^rJ(RS0Kq~1wy(PPM~Jm5rT z$Qy@_6vHN`21E=F9d)+Rqa$R~sd2K^coh0jmbiu8@Y5{$uqo7!IEH(h`A<%0YQMcD zbtP{M@)DM;mfNZTfeGoES4b^YU zlW3i*A#o_Af=fQ@lAUrbR%RCl?8K5KEz=2(KOojYBNE{(O{TuoxJ9( zhSzPhZ>F>tP+qq&uyvcTV)vPOXYR4#@}HNl-R?++mFp58kzAuFAOuIn3Ct#BmSEq9 z*70-tpb|7I$p9aTkaL25seW-3x@_mygX&=OsN%Mdq6(XCZq0Iyz9&afP_5MeA0j(Q zocfdb_MyaQ%r{bl2=}Ed|8Fyf?Ql;vbMhy{2N*ig^e~%P{ z0BrqQD_DaapAb$tsF#hKFCYHWq9kwk~ntIzj zb$6I2=5E}1TE0mhWBcAt%UH<0f?RxOlHQJvX{~lz`mV=oN*P}J6$Lu%D7?P3?9P=bgiu*4KU5*R zR343*)~dJz$=4K%3btJtRu+_O6=0dzRyjbZr9mN+MMfW)EDn4oivvArA9KX4F6wa_ zqE%TYwQDg#?atb2nba;XCub>T;bEE7E|(`~E>)(t(2f8JclI#O*4YASHJT?Tr!Awa z@t;}7u|&C);b_E5v*VVuNV$ttueZeF1w^XPr!YE*uWo6 zCT+Xdczb~=b%VK(nq_XY&mdqO-ZDA@kGf^xyM`?!Gp}rYi+B)pdFs~P5)6;;ygUI3 zir=Y4v-s#cbfX1{#UZe{I6~0dR>ixsqYy@ZE}W07%|(xZXXzZsuJTTE!OEyL7e~Zy zE=rn%k1%2NpJ_w@LTpUKO=7Rk#=Ax%H7g}5QU-2*ftgQFa z_ESH960-X1)AX!xuF3IsoBm%~T3Euz7i)aRP3Waf|M1_VBzGZomCA8~Rsl%NM2g+b z+!L7|ANIjbtRQCiBnL&j2Ze9RB4b~%es;}{nU%@;kau+aU`i~m8Sq;tLI3lKL{-D?mc{43AUhyjcMAl$imVv1^&q_-RN|6F0jsv5%Aq5zX zg%I}l1P<$>bi2&K!4`FQQ+Xm0h zz)rQlcm3uM0uVq9Q-JKzZdhLg_q_ z#=;ScOw@+yZY#9*7ugWpa=iLi76~!O+Hvb|!`DxN7D$9GTKFR3aC0@1PZegBkC2Uv zu_Py>->Jrjnk+ld1imN|0{W5ml%yu5^-_&Xzbuw3j^5J5z&x3Kmq&1Ufr>WjFGW0b zj%i$8)i$PuEmU7S8qLLHD!RiSpzmR#KB~Wri?*b&RDrL}Xm)?6{yREZec_0$8Tv{-fI8lRo85rNyRF-xP%A8tc*)vgw_vToG-U+Cp(!n5^td@ zQf}T7kMWb*MhL9+J&hD3kW*zgKnImNDjeLOwsuK5*jC-8Kyq0Rumd}Hp=F0-i+YMc z>uH}KK!&6lDV;=MG;u+M22;|-p{u6Z#^ooHaew)#vvq%Y*)EP;SXwz-M>C90HD5d# z9^1UNx7~Td42WO{;#Nwbn-DE3@}+|{);?i6;@v)B6-^j}3=<}GGE7)GOc+z32}2)b z^T175U&=Cv?=)c+(ZEHF(S*^nFjKunmc{;}^o(|0!7Uy(FjJ-}=qOlf=MgKy3)37v z+-jx`A+pmua`a8(T$@9SC^ka2@u++;$SNYMzY6^2t2$eP> z^gpM0*`vWB;2h%Zpm?z(!y5w%dZBr@5x4b$soVrc4iQb`bH~V~ON#Q%DQHRUAF4Zv zvbGS9N0{jZy`BbnavInWU%p>@SNq`qObNLe9TPRxf6sigXRA&5`65_`;PY_An5TDT zTr~LCIxb zsx@1kXxH#ND;Aq3gg@=@5w+9x(J7(`eb-n}0w*r6HOTRr#iVp-ry5@hD<=cwiRqAO z7RWhi7W|lIu`M?crGq=wwy`3EzKCYql`_UI7332lw>8!#nDClm$Cst3DOzfQ`L$!? zrjz0nH@2+ai4-?Bbgspk>V~Rn90V9j*7a|Q37O&8(rs4IF*%roFxtMhbAR^IP0rOJ zt2DUy6L-gLq>QBK_u_+0`f@D8j>`u`2Bw}9)Xe*w%Ynv8qq8edQ#(q&T6~2=7 z>{Ry2`iLZvvxppzaD|b2;6D+? zCNdewo`baN-BDhdLP>qbJ&&KKHSl1VioG`Rp0JaFi{*{wm~cOF%#BSGVeZ8EJj=8m z?%9~8^I?$%C(}kf{#Hw>J1A!=pw&vMq`A{(B+W~da`es^H;3{RT}Rb5`U#eoB-=4z z$ZENNNt^O=xX+2>{(@B242youxeEXrxWRIL<=@o*U?{$a7$D)IAft3(ry4>hL3aS} zwZsOwDgw27mZSvA`+Rkgdakp|n7qaT_A?!Y|{~4X)DDwtqKQ&ZrLZlOE-t(uK!iA~WAkymBYlDt>Kg4UMr4EvT zyE5|GQee>b&6#WiGj7Q-6RrOsrICMOeXP00^O#8xSxS@ZYFeByrpeM`bxjH^v7_tq z`L|Ls4L1q-BzIP^Fxiaa8gH!q7hHSHbr|jATbtrBG2g%LfzP-E_u)jOtz#%s)H!TM>n7&xL6v?8{s5; zpJp)7-D_gIjv~#Lk@hOknIXgg{+-Zvqd1lUjip~_MD0SXe2n^lS9FXh{GMjJV3crP z)~9=FgTjaxcPbU)XwXzHSd)W>cr4sx6oSPfdm#x9ds^Rp*)gHhiH6YUn2%##&P$X6 z4w-~P7=aAO@MdYt$D`2Y!%*8^^o18dx$Om0AWXr*EXN(e0yG!SxB<9c(%CYo!w0Sj zBt)@G@LAy?YLjg9J!$o;VFt8TvXZu|((Gvo8RpSm*v?9GM(ahW+jdu)v+M;M6-@rr zw5rrp$*M{^Rj6REr>YgJVJcuvT_bM2J2RU^j5el%0C_}IRkVrTFfv7g8(>s3)83|e z2_fhfGJev_pjv#u)fOXT+ePR{!os{YwYSpj{yMKYV$ZWWMP3Cg;2f-$t@+N7!#sAD zxHy)+HFLgfGJ?&eA@X^hE3=kgS=yXPKCi=`4qGH7eOo&1o$pe?YpB@2VPArU7cxUw zU&(M4ERo=FgYhyGGErLjQf+HZv#||6Ol>IOFZtvG!NiWDyMfthgha~=--eD2P~wxV zG(%2w;N5?a!-Ny%LT7cL3qtM_g(xB=9IAn_LTfI_$DoJ)C@>>D&GaHeC;b=*2 z>UY3`yw%QT2c(EeqQ8Khh~BF5Zw5oruFg>O%_g33P_MH)z$pMV7Gxnw(NMG-Gv!bS z+Vq0mA5<|#VOKFF_o`?p3MWz!Z)l-oH!3g`(Gmt3v`LsK&%kRJQjsYX>|o7EtKTtG zAI$V?Gi2sdDGP?|V+C6<f=<67<-eq64D6`v6-p@ zJzpnZF^Ur)rzL{4+&dD15rJIjrWNau7;7rs5!J^i$voW=k50cTzVyY zRlk{@+3?U$H60|AzKoC(-H^b)aEf$>NN7)}AtA{iQ`tc{1-vx@8PLLnqsNSXt>Iz} zCD7mytOGL7q??)q1OZ^kuxbdchtMWIu{~R>#5q}gFU%2uq!l|=ahHrujXKiqN z#UYo8z;19eCQg>pz1-eQLwGq5#TO%mG;6A1U29)`2kl1X^p2L(XemM3^r;H;X8%#& z(ih8iK^Q>^SC{M>lq}TXc4ak3THoviL7bFO+;B0+T% z^tYl8+FyzhnPl$ZUi{Rv>g89gGtbDI!Ms=bWq+?skCuQ zHL>W!=lCjuG$MHfChn(^vI6LWjf$&FPu|7(F!9rC^l5%TJ2(6ADfDzAeU35abR%Vt zbWT*#1WD%&{HBMT38VR%X@bsnX^(0RuA zMaD2yofk0#4N}vHqDV(=cWCEk?+jCoMJ9>5UC>31E{ck(x?Rv>#kEQ2-PY#x2>c1N zm|!ZAhoFQ6$ie{Dr!jy&a7okjfT;W?(QFxnPD*HX&iiF(JgkVnxlFo_=zyVt8n*o+ zZ3xsTr*qRmHvfb*lcdveHP%ktTi=xmJq(n};t=w;Sf9zsXEHs42eVfr3|HJBKsSYd zAso@Ls6vz@{UpED0ac2NEoBAd>P>7!T-$^dFnf8n6KVC$_;@@Or?zeNGn}x3?k6%m zcG`;PA@_`pH8HXWfkpP&Dtl+a0JGO0uv1y}g&Z*b2=7j~)t%D%;YYHMDeiYR_F?@R zS7cS1&9NfO{Wt4wE}55!+Rs0GeRlRYR%-n%?z1~Sk~Q0FUUT!PH>-Tcm9w%ftmp|o zW4Zr5VRT)~M`z^iU+R0i!u{5-!wIK;E&pVBM=qY7EwpCVQi~3tWot3da#jt>m?_9* z2l-0w3co-Q#5PEa`D&@;lP~!$<{j9Shu3ChA8v=qYS)7n9LH263^Id?V%O&7I9LZ# zaag@Kz5i~OM3?7$B!`pfZl zAQvr}MbHc?D6v|FAVTE?44ww_%K*6u(qb-a3GSPeT=KcBGxWqdL$Z*&B*Jl1dPJ4- zuIW%Sc8?AKX_H5k~+8dBo656vh9Es2f-`jamN30U);SGW} zx0dYS9QyzluOVml6zr-plgWD^?sHsh^L5BNZ}$ZSKIcY!j>!|JIWcgpkpdqjDuWl$ zTX+FI;&`R@%-qIYM=sdW?*P?d3?Ix}cKB4TbLO*vzq@8_JJ%g5V7>ikxGn$zZOXCX z<(+MS{>vk3K1VJsf1~L}SYQePJ3DJ`= zi0+I*oL`e+Oc5e-E*x)%h?$4~-dZmD>w$v}6 zs;zh0P}Tgx5W~wO)hBlzr_z9$DDdW=IKs+?ciu0|+h>t7hA&$I%&~r9X5w#6WgE+c zqj#{+j?Xdu6d5wLT*D$$$ces^Qc!M3Ycvo7&adoS(qf}@aQJS~x{fu+pU*k?eQ8e!4 z$=M99)*8ap81T2Wyd2Ayl=K)W)f> zn;F3PM`-gpLxRhx;*ofyh&Dw(nq5KS4stM<;m68Bl<|Nyrr`-|=t<7Wc&0sDCG#sB z8a25rgEr=tY}0#@pI#%n4zqh%+w5M^n%yyO$t}cE+nqHfBd+D-GHXZXarB)g7VP8nG*v?1@f#J>(MsrK? zc7`W*+7+lNj9DZ+aXV9<2@sKq?2&kw!v)P)Ou%7@L=ByU0YFfQ8_xh7io~7)I24Hx zMI8G>C@~(Qq!|NfZxsy5TNMLPt5QnTE?Q-*gHxuSn4_&mnx`RtolVQr5WeC7`m`+Z z5Iur!ShY=J8Af+39+PXvE?QHZB`LBg7dX&3NP;z;Z|ro5aKjiipAlfs1TP(EdYrHT zh;?`y!=oRlwg#Gj4u!$9c2fznHI^HI-aMG10^Q`ul$u_5 z0$M#{TI9UJu!W4S2JM!DmT0MZQ)kv=H~@f+^BUC{%V4f8_@AR1 z8@Usmd{ftl!=ROdCj`+M`p}Y`3bLjnA5L--xr@}ol9QbDIrLDH(-BU4!$vs1VG)iR z1|zI#j?_ju;TTdD2uD*}BphK(k#MB*Ksbz#sD>gOg>u^p8X4ir!^pL?m97*b4T%Cg zg~*c4g{>}q_DMk35|$L(n%S|Qf&yNhPi&T;9WlDLNeaq*0R%Ql^&YA<$tSXTPcz~8 z*Z4ExSXh_|$HEHT_-oCCu`rtnfS%7pDa-^A)J&L!GcJbK;JKJ)!q}}HycsnUww{H= z+)RKkqh|uut0TFzWdka7NK zBH8G|;bdYyjly9~BkK+bUo)vWACq_4{=~>MT(#7tlmuM0lRXYxp{wxEI&8; z0g;WT#r>s;?CtKj+i}Zr$ZXh=*-UUkx9SBlBYOnjy2Kvmqf|+Ru23kO<0*!8%8OS8p93T`Vk3n0H|p1)%a~j?d@pJ=__&Xd<$*N z6Gp|gb7G!Gl@hNk>k`tHMc@4j%Z5t*Lto>kBs(ykK|AB8?Crp;@@*}&NwYcnIQJ&Z zrgqt)?+7rVnZNX;!aI%E&osM7m{iX@^GWT*J2k1s=L?fczga*?I+*pUY5EBaQ`4(? z<*|KU+wAz7S2yG0oib|g66U=1e8d7YPY`a@d*>7*vlzrc-r^~vdOIv5av;4Zv z#Gmw|JdG@qT9Kzw_S=m3@@R6(KBJf<@u%T{LyjorUZk{>eWvM4_Bl;ot7KEj!~B(P zv(sc+o6v*CQPea5Pms9}y&1hUc<3h*%vEZXA`{D8%?X%>Rbka+#kehG!$#;jlU$Y` zYT2%>Z<}7XkVjn<3&iB(;_g~tpF_GM3*r;_u6j}YZxj}YPhu;{`J^|PdOjSmAQ(&? z?-`2-4O$sdvA@x+a zm6yA3iT32sC6Z4p+{fLzh}D59Rk<{Vt&4rIV%HzXQYBS5Gt?)fe@cxW8!}Fa){i$N^o1i?C5ph;Z=%2V~~s?LfBiIG|qW&!aqukm+7%O=n$5 zV{Ecmh@;hcA+3q5q+@{aLEbe$4aXB{wz$9$V;m(QFN*U}bc$XtAtPiJDTpZ3Si6b7 zf4OS`X(t;|MoN&a90_a+BKz z_@n6NDw~*#EF+RuDUl-Zs!kgX%pok$t~oBQ1v{<+RVrqjV#o~>OD>j4{-|VGvoyC< z{}5BiCD+^@#7Iotp;l=!CdSgEOBkNi7U!jwupm`3W*gD zG?MNW^jrWM^bjJM>3}lv51IqgtL5e(0~#8MS4D*N#JF2p5I?Nxi%lIopz$MgYN$Mxi1`gI$`2bOPbx#_z)>(rc$aK;Nzp?}D;) z&sVbNqVMk6oS>(DzGF*KfOfX+85s1$z@Wgd)`W~Wd=xQ%6a@baA{3Vj*tuaMY)l4i zSTT!s%o&Mr7a%hZf6W;730qAQ9kX`y!PXQA0j6pl!z-7|9+iUXxYbRb3;P5$ncYwp zPN}cfMy61M;tKS~0Sv;IxY^XkQ=Q742c#ufHU-a6T~y?b>hgwyM$e1(CKfynJ~Okl z!HJm0K)hW#9sJb!mmx-C8eu*R@uc-|c7{RZmEtgz%P^#B7KWi*hCyV9vBOv&)6{?< zWtyX1eKvp?Tu&p?1QnhojBZe117X+48lpMdDu{$jFvQ_J!4RkUglg1~sTBB%Z|L+K z;h1#Nt2yKZpKLgBIz1g&mQL2evZ*qF!~mks?*O1E@#0IhDFqrC#b5X7M5klt5z93qA=Kv8|pC`V1eCJH#dH%cDl zV1~SpsoSxYK`JM0`#E-`qe8r!ys=R{#T=&WWkH&b)nGs#!Y{f1e8X)V8ki|~3X;^` zI?>Afk}60s&Lu*$>dgq^t3hd}nMh%k@Q4)KM=B+RlCJL$bL5h8;RjR(Gbg z(ak7SKE4y<8jH%lkv8=8lWmhcj(D`GM9*W)EZ6<;;OF5f4NuBo0O@qF%pwCA?$$Uv zw-O18;bS5sAl1|e)Zc0`NDsvQ&SsuvV=|8BIh@f55(;)Bv_jUp{oh>HN?GLva;o?O zNnzQ@Tc0gBW5%*k!T`}x2kIZy)aBfANSa&&L1s8Qkm+bH#9?+6H_#Z7lgG!9#7yhH zdI?Hew53L9GG;yl-hYehwm?)76PxCmlp1>5!8)uA4?ZIdz_HbgqMvR*fB$1Ue4~Wo@nPtHZ#j zq*FL>G^J&uX(`iV)$2SbXw%tRuV?2OoOc9a2J94Io;mg*ujyB%#)qrK>$2ZI|J&<- zEB)C+G4BZyXTKclJ~<)HagB@ht1~;IB}9YfeovGH2_riLDD@ppZ$nhpQ96yKGKWHj zMjaFdBYJRS)0bc{Ix{1JQ9Nl0CQB@jEWwb+rcJ)}1{f$5 zh*gi!mwyW~3p=_gb;v87+(uC^u(?r^yAzwE#c`FVI`&Y{KlD>^A=w2l6UJ*y+ibTd zum`h7EJ*L#7fIqEmOm~~?He~nXALMoV=Ppw9;(HqgNJIdBG$$oz?uV9D_d%kxMc6E z1AMWLswL?IeK1DRDjZm(x&g>IDKiE#s{|RntB--KMTXlrWD)=LrUP{0%Pj?m@sHAQ zQa41IlW{<>(FhwmjikLNn=%p;AoMF)*{DIQI%896)U>=;8(!iT!G*;AGgjM7xIjNz z7#6konsCk5+lgsd^B8G zOF+o=FT-Ska#E2FV+ta-b<34E*1AbY3uOgU@*5~k^*_l&l~rgt9Yok$bRB7nLQI&0 zmgiFGr0f_{8xsY2#XMHSJXoHH4sVcr)y@FOL@t{bJmwM}6-zQ#8lILTGJDd0km^FE z5K))vw||@XN`AB3#gkmMRC$-O9GjA%?2SlFcH{rK`O-+a-2$kTvI{MEI}g$Y%xJ85 zZ199qcB#GMZWHO!gv( zDn#sT2~rX#N{g_?x6@N5+M=+f&Y&;peL;`mu=#qrDMjfyt!*dK2uk)#>N<+hh*-D= zW$}s~;K(-hK-qbO3oC7!gtBw3!LnKWPxjRm6f3GRy~=^i4+vl`U=1p@FU$-AL=)qI zj?fUmnKZsO4RY>MRvaVFLV@mYmLK}nl%2lNJ$C?zU~L8PxUzIl7K=jHR2H@=i$wuc zj@b5~D=b2_qh$sU&`mfng|!12HYgr#`lng&ie=5|7!js1_0u%?z^&HMsL&8XpN$04_Yun0f`q{!Mq z2cC-|zj|W;ol&b3bi7IGPe~B8HH{F#LR2>gbaorOW%%(j=sg?x&!RM{0x#?%za*zx ztu%b~GlNh%ICb^)wVBX;NC3O3$?ISer!$NH1eWY5{E&B$S2- z>!MD9DSTYF9L;c3=ALGvSbh#K(C;;K{Fu4NKqGu%p4~o5b8^5ok4H@f31-4)hI}s$ z;oEVpq0eNIn`6Ud5;?+5BavhL)S#mXPh9vufq2L-r?K_U=Z&4IF@~91&lR9YcHsHE zVe0LWHXXNBL7c5FwX}6vd0LVC)NRsRUK#0(is{uKfs67R0V>wpsX&-aFDtP)S<1s zlmfN{q>;oBsyRWi;3O)UmI-JagKB9oha{hsTAvZjZLsjEV!;(Yoyy06ebC2(Yo=47 zXA`8DOna-WT=-lA%QLl&0YVIE&ZeeAEEyFx=?k?+b9NtrW)>r^*jn$dWeI-*;PUDr*raP4}S4hkHEM1_V&7J+1r_Iv90_LZI=v(37 zV0nQ!JjCHP;#tF*uVK?*FzF;(>=Clq;`lHh%VZS?aR)O3)bcx20KSzqaMyB}4g*sr zLUlHGtWB_KXlfcf(=*6pk79HZ1$@_RF+H)iQA|&e06bx2IrzogGz%U=E+6>LA-@g$ zPQV${3*u%j{mYr&OcFWMn@l2SdSHaBok0u+rU$%?>D3iztCu&9>8WbR^y&;4i4mE7J?#!)ie+h=YbhK)6_@3ru%mUe))U&uLU?;By*p9vE=QGrgt^s>34OVHgGk zZc*Tnn1SM$ZZQ_(wl!dcPNN-e3@EId3$%tDF@LPIDJ81mxiZhd#m8-v*p&G)upRr> z$8D2oQj{608}f16%=v(TXN9_Xf&S}DUu zM%B;&&8egnw{5bfn=U zMoZeyLtk@!3w_+VIm9-)@2ruMMv$lJyhf0x>AXger%h$dJFgA;5r|PS+<>n{mAD`6 z(nvj>s*xaRLJT)nffCmAu0Nfn7;cP1?@``p#m8_HO)x;vq%Reg^KK5teVO zSFOaS;FCy3sA2$BRw0I4gC4;xS*xIkh8S*5_%TF8y|y0|lurxGHp|q|bjCJj^;cvq zxLZk~wbt<~IaGf$;^P^jt%)15)mb2$jW55ExbuXwR4(Ipn`OLIw0i`DU9O-9_XGqm zCV>nCtr*EXjf*Ame1MFKf?r@`J`pchHa2tJXI{fmnw;N<4TB(N>jmqNhHvM>t#mrC z{#N8y{K7NZ+7-0r=bMc=G&PIAA^zs36$>S6K`r5`W?fZ8OUJ=2sX%wyQ3`?X2u-PH zLUG3?Affm?&>fc!SUDf)E|-E95EE6#OH}tkZmPZ4n_jycvb;KrEgMc|xy6n%LN-8} z-}rEUi-!jO@xkv05cmKBA3)#(2z&s6zYYY_4-Y(;RBCr519v79>VrcQCrzF*b$HtJ z88bgLYr*Cp-r}HS%fI>P$F~0XHlO(9r#`*yXa4rH+hvPB|3B^Wk6-_v|CfLMU%&Cc zotpgb|KUIWAOGk7wd;TS&;R!x|IdG09_=0N6YU%A7wsP%5FHpD6#c(@?)BaO^3C1< z^}l}W-#+*4Qgbwib#!fXU37hPLv&+wQ*?8*Cb}iMHM%XjJ^Dp-M|5X&S9EuD zPjqi|U-aAP$>_Q0`RIk{#ptPMee}ENm1s@!YIIk8UwnW3K>T35HvVP&Q2eX-;rNmG z(fHT#y7)KoWAPL5Z{sI1d_EmN6F-an@%i}1a+_qLuMA@#^^6_`3M|_=foAcujmud~1ALe0%(h_>TC__{R9A_~`hU_+2_>%b2_~-Fu@#XOq@m2BF@x}4o@mcZN@j3C8@f*>t$?v1rqFa(b zM6X9bjaS4c#g`?&NZyRziq4Hsi_eSSj&4hyj-H8bPM(cUj^Bxv$G0bY$NR+l#{0$l z#|Oj*#s|d*$A`p+#)rj+$4A6R#z)0Ji%&tv{AKjx_@U@m(XsJy@%Q87;}hZ&;~&I7 zjDLhK_ek_o^m24Xa)0#eXkGN1=&|VW=!xj^A}X|lT=c!@l4NyqadJ)a{pk4Ugy_WR2hk6sA4NZoeiHpOS`ob% z-;=x)za0NAekFc2{(byfe0TDP`1SaY@t@*1;y2^B;;^oQS$v(-x$$rWH$pOig z$^FTF$$`ne$w|@4(a)k&qEn+wlNaKgM?z}^j`I{YURsxAw@de1LtHOi@z6BWkD@V5b*ncScLqp&Gc0OYr)0Z^1a>aAqinh3)L(Wr zQJZr^tu$h7bZQwIR#Cy2j>R~b;Zfh6^?>~nbM~fNzfiYsrdwuJq|(W`ZQgRIb4qS> z@|H);VY%f@RpPjq3|DWY5?u|!&TgxY*0-I$k#deTBF^qmFI0iss-YXr+`i?q=*Ps| z!Vz|1gC)wS~xQ+~4f~$ILpITko(%Vg5T%5ePICXe#8TTvWYGo7LBQQu?|3h zzXzU;K64-kS-thG8e0QJGQK(K)SWb#E(UWsgTXu0!VEDGV+18JmVi~32pDCFfK4Rk zYF}+G;K%T#?S{p*n>iguwU^;hMCuM=O_92kM!2{gqN$2|*=_D|2#)@$dE`SwH zh8pgJ4v3CnOGT#o$UyF>+|;(qpmRp+jtO&1AU&Euk5*Zaa0#{^abUR6BOMv`9hr{t zOOC@O_6DpYP39$LwD@I`#+sttXeMrmZewh)++naq>E;xfx~8fu7k;EueNDJb(uq2q zIFC-?@0AVme6BhqcTJIrcODrkSX*$Sfw0}Xf=_TxxZLzGo?qe`D* z6|G?3p{+|d>)p>bR#Q1!j)2A_>1$l0uTJJG?U94;A}9^;R^^{W{y?^;EWS|VGN@Ho zJ3{x9dAWj@cnWW?^c2!RCGD%w2D*;I=DgrXaq0|cwpJ51ppQ`mfQTK%KNE7ZRq z@k$;!^pBn}NzHgk?S>?~QZIk#_!9UtozxE~I>%ugH^Y#5xyqbKE*&jFThLlIgRB!Q z%l21!MfgdKpwN^^(TIB2QGOkt67{TWa{vlt6pWa{FMO~%nqPC7F`ACV-3a7u#J;$8 zXOhjNbH~#;LI7nS;`#gPs2Pl5y|c(T&Sl`Xkj*A}tdi+me+I3yTbP9yA7v57Z0$DD z{D6zZ?I&0riwji4;4H*=sHsy8aB`v87>n{Rk}RdS-&1dMcTJTFZDl?j5@%>B+o0?* zZlLnM&YGl;wvomNs0|Lbt&83nZs+Xtb*^zo7 zt;l=BGicZ0dMYyDi~|Rw`Rc=bbs(hQ-IxPOAt{@QyaJ^Z@OBH{9zdN^-t3H~R!t~l zY`zIl;nbR6OQEXsvMm=~frAoKE`3?5DlrTeR1@S4OdBi2S@x$9?JP8>nfJ#8yAJT> zuIwbe+>e(NR)_d-fM5ej=JIH)U4y%KbQ_mJz%F>?oJMD=`_k{>reY*JW6YrXXSF1 zC+BG#WO<`hPtLS>qb!BI& z$8XSM>0oCm@h5d(lh?pYt3a+SD!>Y60|GNGuahIP))XzD>b8BsXS=eqRsSDVzv%UL zm_5}|%{ExOcyjcr>fd4Vj9}+v-P_mr@*I8ny1q1q1tM+^HU^>VnHYHxXzcir?*d5Zy$@@KKdUtq$cd|H^mrmu>}S-vlwSut|ynXc?S_2u{Uh0{>kDkWYe zVX%F=D?48quaE(f_ytvVgl_K0pO?r)M$+=EJ&y1rk7?qwxci!qhfG& zGhw??wO@NDUxXIY!JzR$DpqOcDg?%9Xnr)9NJG@avx zk~2iW-sTqNhO3CcP3GFu9<+e!>AcH#Z72#tu8B71XLyXT#m-Rw zhM~RyPI5|-zv=Q`s9uGzh*<#*)viyf*P$Tb3ZqKJPfWvSl)-%9GJwQr$EqA1T7Ds} zik9C7IJjrl3+F_l(an$1O-P5AI1nKzON)9xfz@22it&r5q!w~|mPm6# zs-AH}i=ECgCeBMS@dc%)EGV%*xFz4ajBva!w%E2zk;ZWN!VS1SL;MCOVPnO3D{ED_ zhPQI=@r^mIx+d0mT$O9{#8quAj){WNY|Ut%VKhVF-p6@Xk{h4b`t#^*THtz}eD5yhgx^GOrrrlT6`HQurwqUPw_8U;};GAeYlo zPe|-jRQDv+app7oG|#`~xh@-G#@Y-pY)jq~b)wx{ctw(Zmi*t4kH1UyIiA!GapUot^juw>m>2;*18KX3WDb0lQ5r(;k z^tLG+>thz+k(@B;#(nC>TI&YiSU1L1ICSN_BNs5vq$^T}N3U?GIY-mbs9jla6mN;Z z4@mGO3I}u|{4#+7mYZ#9eN1g;Bby8_Cl}JF14hob+jt-idVIfn{2)EnBIyAo9#Hp< z`f!(D#(3S@qS`|2Z(zQwUpsKr{>bQ!Vo3=>YM}lem*V^hNdq^4gsxjkn z#-p|R`S)24MJ$J^$ADLJxF&!z0NgTnVUk^^KHW{9;@Z(kcD+(}sfW_PS`f*N@-K3IhtRKU=ejTU#>}KWNYPyPqrmX8NYuK3pcg5?gb~@W)dUG9b+=vfiM@l)@ zk^}3h9z-m-4>d*%RYX5Uu2#v;*mmq9vt5H5e~Ec%l0B}LuA!yY;W7k6ZhI)6aijDT zDt)y|Yjwc7lG9UU|5n*okv(E@lPvE^GL z^$!+}0=YNNp(2EVtb0lAcjfH2DsUkM%wPDj#N>r7Q|tTClM$}EGmf}CYO>1OuPZ~d zVDBNX5k+~c`o30j9pRa*$nz?4K1JBhfp>AJ9=@gP0?j72K3e*5=#tZ$!Ydb~=?RwC z)ct}!T*Zfk2+3Yl;ymja=HPw1vX_)`E*V4<+Kcb4ZaXI;k4MqDGk(L)0gCpX2wT$N z2$z~C1kB6&{v5t{%dqlCSGMeonzy}J0S z5@(V~)Tea9*O~(g!>D5&JmAC)RC&MwSldb3KXpJDQm+YG^G-SYy{b5aD(bbpyRzf7 zemR{Kus)_M`@WJZl@u6l7;$#IGEXBjuJ5O_DXz-0Raveb-Ibl70;f`d+2d;4Qzllo*7gE%ETwio^w!C3 zFGjTWSIQ3K#Y|urtSm&a@sVqeikB`dl^RWt4m#8eol;zfCq>`(-m48;me$1EMit&j z8>vDD`ixZ+ItE^@erbiQ^-t6Cg&6vp&tn-FI+7ia+@DDEu6jsk9jkSnAdvbYYCMVt z(&nd2$LhDVWrX?UIGhR8>ZvJI!uY!5@VwfoS2tWqRT`@MGodF%|e>dlNg>9xhiOQ9ZWw zsV>bTLs3I}l*s+K(ugg-ZZYwblI&T@l@o1cEYs<1*kPPKr_2+mS682Re`_i0YP27a z@8M((`0q=X!CAIjT=iFsmtI)A(7CAQnLRz)WX>2 z9h?QGk+GwP+IrjU48vj0xPiZnA73f|ED7OywFP+%iBFAt06wI4T?%a^uATcu} zT7plYz3AS@ zU-;qWcK=EsVdhSSgLqM-A5)L$tf5H#00YcSXB8PX*A^}Mv_s&U@up^0ejN2tyVC)= zGm3CbDa9yaZV;^eRwdah>iki3UaPZLl{iu(@hd-*VBqASmVS&~KNZ%0l8|j1MD51M z@pbp}lI-_tKC*nzH5m(zM_o1m9ek!*}-fd zCHCPh$3LanF5scOH2duC=Y;R~Rf)YR!NFeD@zvV7Nw%Ldmy-!eSz%(&o&#Y4Gg{bR zZ{LCOM~k8Znvs6?(@z@hl`hC6YjlEH`~Mc0;&U|iwHf+aRUe>_-{#{HjbXu;H3aHul>sD|i}25e(s zKsJWM^!9Z%sWB|j&wlzz7wnaej5`Lt)))@g$A92srhx7rq2y~MH_H;48lvshsUwy9 zdvfCp7YH(7cx(iaffBw8tJLZx@UI0PvK|_XYo{i-&rtAp6aT`|M3Z-6Dd%-+%aydImnJ=h_ z%p<3iv$K@(yh@o`Zq|jx`uuFYc#anpI8|N#Ewh%?4oIr|C;j5*;_HqOvAUS0hRHm& zoL!*Lp60U&>4N3WKA;sXZ}#jgxc^+Q*7Hg%zbEb6x%T~XcA+w#a^?2{%aU|tpJv~e z_39$MdQ#=TEE~whO8%B45MAErNf*$8KEOMIa2ZMa)L75gF}+mJ*2H|dwj#-n)+9<- zVkg;khCWf~|kuagu#cl|O9bAK3?xCFz2F#CUjhtX}@BrnC) z7diMTWr7-7y@xhVR5K4y+ImmM50!C08DUA(P7$|NvOWN75^WPGf=f@Tr>cWMJf5kD zrby_-Vi@r&{{Sd_swn(L1gx6Am!_wR!pZo(GVW35#HpRsVvrXl*=u@pH*dNaq$w^a z1t|C|A&1knwS3&1_!O;`h}&Aws&!If;gY6XmP*@3yVA)?h9KCo%B&A{9jf644q>-p z+*Ffys&@{IhNecH7LGa|D3@;MT*4g*nDUa!-a%QUrkSS+MKbqhOA~v2Ep%Y6pVC8>v4)H$z7+{30+KhAoDSn0-i;uh*l?yd;_Ps}xQQ29 zz=50lg zuk)>-upFcGwN}WRdU1;Qo-$WkW-#?0tE_7*%S^q4c!d)o%Fw3ZAOW3zVr@h_lm_KHmy?xH0yX%3Nic0dA)&>paUU!tE(MPxR(o-n2=* z$CK<#y*P&#^5*@i5@(Yz*|$2bUISa}%&6|KWU6daX-tgj&DaHyZzq!P7mURlB9b;| z5!^Rl7u?U#h&HO6Qu>c7eY#3}&oJ%|{jB{zHg>f$7T&R#-$T>F;l$sHg zcwm8w0`ILHw6cB(Hbks~hZ|?MHKw%Z_HnNmdDqP0ZO(U}yddimHA9<_z=28jBhA^V zj7)aO1FgkQyvPUPemC=VidEKPLmfEnMemNoiPOF|E=u_bgYTw`C(%W$D&{|4;-X>j z5g#2i7fY~;o}L>b2e&ER#(EVySm{pvVtCwj+h~m*hpo`9JZcV|%LJR41R$_&jv473 z$WSzlPWLMz(h9&0`Vb#5TZQj1D+dL&7*1zE(0qt>%LTBpzI&<=?uue)EJhGuOAvqr+R+e2|D@1?;2%aP-SLs!=y8>VA8=* zAknf}!SJIj6wA#E<{@RVt_9a~sxtzXo|BDW_dv`Y8E21bG$$~crf@;#MhwhSW`p}_ zleSVtOmc5P48syD2FipR1Nq9`7Ug69S5us1Scv~x^&g)DI*S0<>7briNDg;)N+@+4 zrAAHayJaViljJkKn0?voH>&$s>TbcX1-cf*Is%IR1USsifzZeyFsCql4?UQbsqWP! zYWo?r{XNAGHr`${y3ZV|dr(g<{xXk1-1~pq;K62+q3GH3PxOH=TLTXL-76 z4fCt$Qf!3i!r$z1)qON|4{DY9TcwU71pT1 zjQlyNT_KEyqcJL|hxoyH$Dn>jP;ghvT22jQvyy@HpjbaqY1< zyI=YHk}sVUzWx|wq(^v+?W9-Amy*_aW2Nsq2mSqNg;%;TVX<0>m;s9J;^yUrT6g&Q_IJ;N*eXEqmFo2uIZrQBuYmda)Pt>7T)giMd zU~F&rM||Nu`)7j(9_k7}-O}S^d%$?7?K?dJ3N3#1hzWi;`>ASuMU8^Vnk09)4#q!7 z)@PI@8)}`z*1?+2sj8MuekzIF6hBO2tSMg6qY9?@DFst}StfV}w?f_coed6LVw;M9 zjJ|1`q!AHkZu}Fz!IF!f)#SjDXF8)e^lM+ikRk2Bef1Umn1D2&!aPDPG2$bVSz;?LD+y!pTZj$q&`wb>NKNaK8c27N zM*cD*Cs^{sadxtjFOi%L4*pCDyx-l`MYcj^0CB;JyeiI)c4`c^{nq)kj)zzlnGuL_ zjS6Z+Cr(jAF9`g(KB{6KQHr)w3ZJUN&#SPhqe*s}GM*!2RL@Q*_N>#P80sI>n}_hB zSAEZJN^dB9x(Yv&_hy7T{Wiy_-W=m});2h``^prL`m|~6G;@ZUd3qE3bfyZg4}D5U z_G)5X{7Q{#&eEHwc!O#AI~dO}Ix72eWj|?JOonqhma~ma`k@^Lqg#fGm_6=rei>)y zsF5dH!+{%V>u#J$=Ywt6=#_&q*%v7LQL=&ZBDQm8I8cA3#=D>E-6Q&hJMG;4cL$1l`UGPd%w7{Geuy%} zh}}s}o3AV5m-dkq+39Gja$`Y-Uh6MfmuCwGp|Z;#Q2u<5L{qU?tx6e>_8ZN{Y}_jd zT7DpYcT$YY@n*X-s>L-u^TyOaX0sDcs5p8#6LvMgF%>9zi@?EQZVO@}s-ihakYZSa z^D?wQYG`Y1XpTQ}z9(RjI3_$4=apg(e3k=;#Tv($R+|R33is>uCzJ-tlkjx3;m!k*Hgu>`xlugBqcjyfmjy zcgSe9Bz0$&}(dv1n*Z-l&q%SUCAG zl@iC^?wjhx{q#bfNpC4}pSq;O&Z<(|g&<$?lqL&GaM8Uhx@_muFYxM22x3R~XL*0@ zHeSi*%iC(}UK_smThsO=$AQ?*&E< zsqUld@1puLklj}aMVO#zpuV4ycaZF{b9X4aWbUubUyy0r?9LPK0Oj4TJQrp^mYT){ zXa}{dK^&+8w^1Nx6q*{xL5h?WLOB47`e78Ybw7MUR8I5MbdYMg)tYy1WAbl3SeZIO z+0kw6Ja+n2V2#=r8rlx-p~||MEP2Hrro>HpFX(_uMF~*Jing%;{&oR1{{AiYfx}h% zjjBCI8BJjuy0F^HDm%%VaD+h_u&iFmORaHj8E7Wr;s>zNd~kYj_F(*Wk;%4*V8K~uzC$KHV4_v zs><%;j%{aA?cb{3Dy06ky1P<)aSoPu|E2n$mHLiL?N(i;l#ZkG?mty`72qBJgZuvX z?X?Ft`^$Ol!4k*y+S8qmV8d5y`(maL+qyzHBqopcUgn=bXv#uZ={QGlwo?}3%1+M4 z&ap#TtPbozP$5eq3%OPN5I$q!W_>9{nx2O7;u>O-@#1qb2=<8+*!H!zSWWBmOKm(tOcsnHp5yRMX!5Hp7LHgfT;gWp;~4I?j)PNslwCD)I|z= zjx!)Q#A;5)qFlQ?%I;E^&Y?^2|2>2ZxH>io9(-w(-K|&Jxn~d40FPs1_4hKD(kc^y z+vXk&i#XJ*5bjaoGgVlVjp*1rxSXd$OKPujQbq;Npa9XpcC1|xRex@H?s?m0Sk*uR zM<8P3$_Gz2C!e1&{>YQa7p~>hrt)B8g?xTyw&jDsDf#@&4=9c@DN;OL%HC0ERNa81 zQFY+L3U0!VY&k(nAa(LauDh!{yS2fq9*bz0zp7j|QH27lD?5WGMW#A~CQnn`J~K}< zol62w^V8IK4#G8;V_Aq1OX0e3?gTZ(UcJlp17mBiV2%@XR|4IM3^ZqGjdZ>T#2j$M zaiO`Oj(eI1dby`ro-;8F513)Q_kbYSOKKNK)r*)a9Aq@IdhUg)cb7!fi=+Pf*6cLr z;eQY9&DNFb&0<#mF2CR{>aQ=P?6bYur|hFKMOrn7kKSX>CEI2nZSU9m+e-C0 zG#-BQ2J%k4exECmXKdhM6{mPrTV7;^uRgE#QlGKnI#=?p``z#Ao80f~zJ|MexxA)( z=Vddk>uYWi9?h|+%wxxM)cueuUTqfJ+1LH_w%Niqz}7!YA1y}n%Vwa&5@oA=j8Oav zkJu8)%KWm=k}2NRbN=^P|N9KTw@K@H+Gniyzfbw!C;jhl{qGa}-lGp5=Rt9@uohb| zq~Gw{PkJ4{il6jr|NAJv7BBjd@PL`rLOK1)mw1R@Md*=*!eSn+<-ua&JjjCr@I1h; zMbNpQhiPQo$FHK_+{>@R<=o@bcl-2RK7FT8-{I50@afxq`Zk}w)u(Uqziaqa(3+e1 zRdAY{_-*ogBfpnv^f&OJs4CaE*r~C9uesw_hG=6o~^;G|R3corB`!jx5 ztD=*`!$~|`tDF_#;iuu@C*k48Jlv%+KjPs=J^YY|+x74R9&Xmdi9Fn*hZA_XO%KQO zV59hccsPy+JG^-;4{KHCdp!J7566TuNAqCeNRA3QM}`O4_N~Ih!^2_W;n47KNO(9n zJRB4r4&>pdnwSH4_=z6&=i$eC*pG*2MTPtF@TB^)Pk7inJS-0n??nCCGb;Qx4^Qji zEgm=-&87$sPwC+e9-dV_f8yau<@_<^yv~Ci9{EGad5wn$Rp$3RJg2W-4G*t`hu?*V zm&3zLJeX$rV#s+RGtB~^$4_B)2FL^M} z<+b7AK_1Mp`2ilTP?`IAxLgnS@oKMg)cku%UUy0xZxl21M~{Fb@X|qrx5{f~lwi zQz#W@q6#jeA`ayD|9@+(z0d92vLp+Nsko%uXYX(Cy&m6ted}9m{a?Dk-)nza7eB$p zqq_JPT>O$Qp5WrUbn)X{cuwxe^2Ou%;)D6(NAtyx z@dNqd`}4*3<%{$A;(PPO_vDNB=Zp8{i|@`C-<2=ElZ)?DcOK=!GkX7hhI|JXo{jtG z8S?F1cnav-xbP&)f5*iIeg3Un{Gu)%;o=u`@z1#Ud0l)97eA+qZ|34>b@5&f#@B;Ryc2T>P{k-^9gF>EbGwaMw*RN@zjE6C-}?Q}&?EZ&Pp9qwqu>8z z+Wwh-??b}Hi0{htuqb3WE#1HU!27Cp7i_HY5Ta|`}g1~{k|preo^|p zJN^F6^!sMgv-I9w)5y2Ga~kP=Z-Vs%zhl}yrr$ThC;EK@BCFps)AqyqZD9cYZbLu) zeqs9k8{l2{Uy$xUA3Ey(_H=*SG*-lY9`qLcG$vcWx27@iEzn>0H{+S=_oiw4as9qN z9q9bJ^!wWMdkT8%`Hj;UVBdg7k?}l<`q1xdprf9@8ocZNRq(X#PoQUXzXe@&e?3+~ zzt=%;{ay>c_53&nK=;>7+i%nT0{ZHHo_-s0!3Dn>KG5$~>HbRSru$>iU%y9D_xim8 zy6g9HRJ(qUpwRVuc-nreemPhB5&a%Y{Wu7{b$=ioV7)&bXuS_<6?`_0J;?S>W6P^O z2(RFqsA2tXOk?||=`?mr;=t^m5S#0_lC(pk7V?Xf0M}NwbKZ?j}@@I?JX9`F8wMZ6Vy0y7=$Wcx)^Fw}KQ+@rM z3AS7f`<0Yxw7spWA#&h~RutnIu!v6ieyW4PJ4tu>o|qwXCfz+@Ma9F?^SW74FoWC- z+O<_5pDWv$Pq-$)5H-yxU-yeuA_V}wn-5bV{_IG-txXyS+MAInfUWu<%Q|b;=CLr% zcv&OzamG@-s z+>_~&Vd@{9k#O$lsx>rqm3l5_=AF#GrM6}6r0Jc!@5VYv_%5u2f%!{g9T>jPJ>2#g zh}%o@&{l~0%jco3j$usGW2|GA?DbG|5vV+ii|MCE!xg-MI(Y$=yZ|}`Q!}+*N%e1O z3GJ=JhPy`AU#S=E|lkU@ifmOVsBR^@qc9OD;l4%M6JNsTWv*`G%Lcvx{^?==+;$FvsgLX;8Do=;P$u-y)F*QD_E0Pz;PvfM+$^r zPyyDTG;akUpP|W`VU(HMxS|iG3PAZ73yKY*AnhJudp?-2`*viSNArU}pgk^4)BbS7 zVgU6FXC_ff(=v8SCfH#|NFd_K;> zjz=H<0H2M{jNkKt#aOtm{LF6A7+jAxD^HSCbC!VPTIn#&p`8I(5Pqfe5L03&!x|1C zs^37kC1@?LFax308gHVL5)h8n)lB6{n!FV*+UO}#4xQhMrJ z0a1rRp=PORohn3Q`B;mpS(o@oBE$po?wT;O%K8{)QvITaA{Y4Qo9mGV3i`wOyfE-s zfec%@wG=n%IlY5OVyW%&o{|_8t7n%Nte&ccHlFP~D71Dt<*5oMH$)DgQdS@Y-IL2L z_eiX)-a^6}rsO_b2=2kXwLyNKwL!k8QPu|OzVI;~=GV)k_ku2^9Lx9ahE#bR_8r%Z zSFJIt2ZrL`C#o1c)!J6#9;hX`T7+EbnlS}Yc2qM`VRv@eR(FFoI5n%pSLPSe`4nyT zNVx|!x_Y;?R5RSOHW=5V5$8+6Ub&H`jHwT^dg(xEWzB!lTd=!+Yk)-+XnW zG;^tmYOpCF9q__UWXzgqATI|R09b09hDlMzi)b4kyKQIc`GyX}z64HRZeuZGsj=84 zHFk}P)(Ml)!jP06on8VG_LXv_=_wb0^nM{whlJp~iXH@kV2Z?fK_K{!kKw!d&}}ni zUtZh9Fc!adEXAmvPg^+YN*+vEMLyfJH^lGdHuTD9Xay$?6)U3}LSvr|{i{s>YR;*1 zgI42dYsO|niq+%FG}J+*idO<`4_%_v^WxFT!FRpULKe-7_$uoS8IV5Vq&G0-QP8s1 zz_|p!NozP6oY=-&Hd%Wot$}9wqRqq2&@l}ui90qgYbI!-;p}aANi>v_+3H#X_>$yh zQAtgiSqO$$TsF>BvZNUOg06%l>`X%3D~m4U1GB_F_;q_u<`BinJHU9+(iNZD0p2=mP5J48P^KQrZrAtTIy^`1!nKp-Qpk&!C(Sg!hz;g{ zKF_0GnP&N645xd>TH~YD&MnY8@*>jsIx3_#jW~i6;H^oiLwpAVPD_CTfbXtO0kX$s z{~%bkt5I}pQ0VO`SOuQhFP;;3+mWIIc)JG9|NB!f-nK6C`%JZY5GxB{!jZ_+J( z`U(rnOOo#*-Llmz*bZAgM77R#;8j*dJs}*wg>rH)Qb9N_S2(7=HTcpw%yeS#Wpl>J$b}O4M)`|S8#@(CN$>*;H&(}PuV|7wMQE=HITc(o*Xu34lUK-BII=g$?F}s`*6YTwG6$8g0t5Fyk;U(~UvG z@b1KWHI75WhWvwOLe4ueRE!tC^5b%X-_xu=WZ$vUtkFm{)Xmy0^}YN|5GPWmW&8MK4>bhsUlp(YzU6C4oQ)gx3bOtgv@F0ZKb$B7y2MNI2$%Ck=n9hL4K z=5^h0)TOLywOG|SV3l%ZVl|hAgR6YhVX8{IG3}+AF~eI`!>{|iS8B|C9^Xw-6ay}L zowWvB>_G=ItdM3je_@H#jSjWTeJPdDx3Rp0h!9cDSYEt5Agr*#ThWiGa3#8f zN8GDWEm9Yn6*{%I+3Qa6>rSndPVH5vDAS$V5Cu0LA{Q3AZPoYQxtYd-v)`$pMc5^E z(U0$$PeguCFRim20#&@K*omy}d_-T!rXDa^%HnU>XnWmKgnvqmgM0-va{ z)Vi_t4J4kZ(~1=vV43I)umQ$I(*PA#mjUBW4KVu^LLIXY>mLGCGXhm=tn^rDwopJt z{Y1T1a81t>4!k5C$AiutmO>h7=VdD-`5z#B*eV)FUv_AttWjaXQlmuIj#B4Lg?^$D z#rsh$Ygv)XVMlBn=ovaN+}d?EMk_C#6G7v=iBOn>bzYz1U!`gzK7T^~*g);X_3|`^ zZ*a_VT&s^)59(b*hXXOUg2OYti!?RaCnjL?t*oQh)8LnAb9PKsD#|k9FTM577Yl)`H>^H%P~3k zWSf{AZzv)+TNO{LU}>S3gTFugmiPb6=kOQ!1F3M$KsyRUq76C7iny+*e&c-NGB9lV zt{L-5)Ugt?7N-^%UDdgXs==f(Yca-vkl`UkNON(5uyu*MZ=#%`JYr-|KiljAwGv%{ zscBJiQ2Q+^>};#Kp_1y>>qXbKUUXdskb3Yx^0bQVan81Q|8zJe#=9+N1 zF$?L0*+)T0S-V&m zyNXaRy^5q@T#>>7u4)7sq+*olfQrGOs*)`}a*&qFboW&R6a3|U3;2xtP%@RsK%Pv4 zMd!<}0zIB|v6A7nuXGveBYcqPQHvh*6crZzcjVvBe<6zvp1K6*>px!Pg^R-f25TQ{ zm|H8KbI~=)q*m+9_3gd1@EkVp=-3blvAin4Geuw@e@n-DhbShUeQWWz?yR& z!NkBL9#7!!?&M}xCC-0}s54;zA;_AYiLB*FkHi3O2da*h-4XmcBg9F1P`04)0|#;9 zi?T<8A8egPZsS4OCPCD#zfv}YM&E}Ws=+I#V=gw+n-c2c#PA5dWO(fMaJkppg^FYA zt-*boKOTxiiFOpVm^B+o<7A@Hh%WvU^jP3f=25IsPOm4;`Vt7PT`#-V?rrwmSg}#5 z21c8?d7{oK^Rt?x`Rn@{6qkGlhAI*LJdKFimrA6>-rFyAU8p(xrEZIFaBJLF-{6dH zs7b!L>1?-?gK>Au;Pd$U3(hus)v|$#`a&_{ziBPHd(DF%+}2RI7h-ls z9yQgIy9Ixr9DJps_FSp8Y@=DG*ns3x#nI6h*3FkSU-{xklnhrra9Ha3Ty1xc;-3i3 zWWA9r#S=hv;*%fR0g|!on~NvVOM}{aDgNc%ovNwQ$V84Hdg&lP7}zI(p_c&hr;2@c z5__kT9l&T82ahWTqMG57Mq?C;hqlFci_zm}o*q1~7<-P3k?RL|oA5OsXxON1f|bqM z7#pZ2SWosvb)BnYN^(unHFR#|6@c|djX`#xy4^xvH7*>J(8N z=5RZ{a#vckD0fEKCTB`7<(xJ%>~*hVLGxo@;iePf3Uf6Bizt6W1R&u%^qLFGo_ z2=?Ag2e%fb8&A+ac|(cl2YPB>dd6iw8#taJ<_FRVPZZcdygt6TS8xtn89oii ztSc5_Pm0Rf*Qy{O)bwWAj4OLvmz9lL-2P{1zkKyH_&nU;=jAzofYOO0KruvhG~Mq~ z+vPwpTYV^qz5*ylt`CJUM}cnT5p#vg)bo4P=X2HKn8;bN`6k2s4dNe1lXB+7*VLW; z&E@HemBs1mQ0dxg>GpwUGdAm;Xq-xi!YP-gw zyY)(Lrb9#%?VpsZf&qI6TCMp&t5gX1b6gQ!jTKp8b}aT|YL40KR4^qU`K0}z%c5#E zt*n*@2^J!cy0L7QQ&f|7O=|WgM&Q7%TWY)ky-V1jzKO@5pCSc*_gC;jy-}p^KFVD_ zza>$X#^Hia)Ub_a~(=P?ntMmcWht z2NjO*UJ6g1`>Al;Pm@Ex({HEXt@2#nMK(f#cf4 zF61+9L?krJMd2Zj>zi&JHc%Fu+qqr(jI{w9co_~Q74-xGN8;!~*vg^3B#qRT*x5 zW7*y-;noBfcQM9KkLDE}MlaMuRsYf>x3zRaZJki+RTE0R)9fWL$iY%lkWBDLBg-PcS$V2H)+W(qt(_)C{| z*`-BFzN6fKi3K>8Qjy5f5z$BF1O*zt2Q3>-7awUH7hrfQ{4lr|ulNP&Dtf83!kX#? zv*WmoIbz^Hv@sk$SU<2~Pn$rsfATuPe220_!DYE#Y%#-GTCDd{X&+sa!(0XQ~fK zdyVm3&J4JGliiq$2Tx^X87Z8ypzI&t!(+ey_qAyY&?TDUxL!on=z=<#@rX>S+~wlZ zCY({+izx=BJNstvBoQ5F){$%`y-nC!dYx?#Ne{6$q&bM&3pZREzbfjC@*EhJorTla@$z zOj;z|Ikyva<-WyK!HLzR0VZOqRsJdW2<$3MQ|{3it8(5$qfo+EYI_}_T7t`vP5ol< zr*IDU5ma4|Xx?VCPAGrF6006P{Ce+w6sp{9267^9*rvC}kj~ z4X&re;O!k=LZFy2N8TyXLd?j7QVepfm7iX&6sJtq+NqV1aMF` zRWtx3uFu(hw|pP7n{?S6|#tesHxIdnH#)4|VhsjrAki zqu_#yx2;bfvv7emYs`$>x6=F?ZwMpC(q|rT^=8G>l({}GEwl5daob;VNB{9(pN`7# zr`5sdG5kXezgG{WbpN4cx%J`SLo~%ud?8JiSGfVQES!TsAzD1&X(ESmV1jMZ3%n>< z>mNlf)y1R}Goqpi6F#hu(3WVx)*`kP-{6rbVFN`PK1V=LD-$y!@VfuEmM&8Lf{DzmSFz=1GUxn}v}pP1ShN!TA6w zq^cJP@q|nur*FfOlU(DkP7Vh7bzYHV_ytE`b7S~$zG|Ecl}B<-m}H5_TC=J}yJ}V^ zCTd}5D9tY>*%`&?M(RNuG|riv?7|XVbBVX<725H)Hi?^vK=M9CbCD#J{-yY3K{nkI z-W>4R!3-#?+&9Z){-BNiStBgLAe@)}^cevHSAAkWhxycc)%;E2f@xIw6!4#X3MU5HpU`ZmIgtcSZ-QJh2za0VYYy@pM|dl3hvaS7)uVTsIAB-0`Tn)iBpTSs77 z;)CTL$#U0ov7qPuh$5+;Gy{kIOGb&#+ZnS4d8C4H%}6sk7qcsK%jB`Wuy*4!X+Guw zu)ZtN=5G)8Gz7}2d9s~Z(J8Bg=DY2EWnj-WMI1ZnT2cnX_Iz6JatUQnUNEk9h<}zL zQAA0BD1%T0FFh79k|G#67ST0TD9n0GL`ZEdUV_6ic^OsvWNfPUt(UFH(5%_mI8Mj* z25Fq>dE}*G(OUbxy+f#!>~ry$jMSWa0@n%S@!C$?WB+q4zldL?vNVKIt-WE|py59f ze#(gR#kOkaKuPWDRU_i;9C5C-{Zj;Y__fimT*6MLTWWSKKfJgXI2P`OPK`X39xspJ z*V=UagpcI9G-`7lOAS~Lcm4$$fIr{{d@(j0Mu|b^Zm8U?6)zH%gV~ik2c2vAxDWSg z7mVia@S7;2VB&5Kd;C?c`u7>ogZiw*RJq(GG|}}lgk0VzVu;^lB~>E-Pgt=!e|J6WGG{@U5=^wC|YU4FLh3pjAD zS#_hH_Wp(Xv9)Ko_D4eLY3g_k+PF#*+ROxT{wNenZEg`mM)tSCcy}M=%(|b_AtewbB7iKN4!JO2`>A#X(DzM`LPx|Nx;9|T!zKhQgavM^_s z99om)Ec0JQUY`6J%5-c&VS>25N#iiUr+}c3s5Yyk9Sn&k`rl}c+UB3_xq_wcTndDQ z%9*f(dq;FJA1X(C_g|!PHUW05L`W!94qlUnCwqdp>!>y;j!R}Huj*}!N#U?%bwgFF zow~8`A=hg~!O+#Lf%>dxRg=@7t!m1${*Lt|Om#FEb(mBr>QJhZ&A!EsrQe)wDMhsz z`X`K3yxLF-KkERb58wnbzXvFy*L)K^2Va7Md7Y?am4y(@Eb8JC zXdLk&b~f-TJ8;%yvO92<_HR&)h$gL3_8ifnJQ0OCjF=QbS&@3Cm{ejE7m)ad0iv=W zWY%cGN@+p)nk6kbruurF##55Nmgi5KsJ8}6#zhpO&X$%VLi*A|S*mPm8jOV^zaBiP zuc;=^;Z^BtJofalEDI15o+C?pb*Gkd1mQpj=BiVBb7?x4HjPV9xtqy zRSzYvj7MK^j~5nMK*zCjKgPT4^gp)qyyD zN`*okf%%kpfYx9EUPheE<$?unLY%wBg1#Q&O8NoF;W3ln7Jh5Nqz8oQaFxtP!o86z z`v_u;FewbZQ}?j+f5cW;&Y%cX1wuq4(9SxZmP^SYku>Fkket&JDkJHSnw|GK)O}fi zxF$3k)lg7&OOp|c)yL0lJg``E`X{S7KR~f~lvTVZUeof*bvBe@1JRMT8sKy!EsSH| zxo9yBr{q|=AZa0`lO=@wDWx-!5D>jq14TwJTBH+hBf%c7w3UJ~vnevQk&sks<3>2S z(WK(tLe2@D0|jNpC(JORtf)!>JuQwTOVai5+f=M_Ew%7`Q_CYMsN@e;j|&s;Y1SUX zGSF4fdMBB(_3Za5+8%b#U}of$=9AYV;B|t6v?6jtD-# z2HC=kRz7O6pYmSY4c0zZ>;nk4EtcXBbZ)oCaidvvI+_S6(u5a_JI6tRe8gZQNF)JK z#!#4t5E%CH{5A5?X1}U`NQnN#zVZ5lLvO2O4SAkKW^KYM4zsgJPFwKVsBMr3Qb`x= z4MmyUj_*gsU(IPb>~B%GdXuob41<(q1llE1n^%iWlfRF0*58Aw9>jch7)EkIxoU={iQyXtss@+{n&f zYzkf{2X--PdiPYus_pJM4Z~6Qz2;e;sZ=N&FW5P%M3iOByXBGG<0EvPvBOcO8{Eik zIZ`%&Eu5 zK_`{2h0;MV6$~(|dXY!HO5{N(GI_cl>X~Sgo^hGSbA>z_VS^1Ey8z=e5Y={no+tu-5I4?dO{OJ9yLO{<$@uTIG9NR7|9 z!E&I3ThInHH{fLmpV=_M%P3xrA1Je(Mx)#mEveh{kE{#P_IGzggBqX!T+;OSx}IxwmTc4Jr3|oS+eFM+*&i zt<|FhrQ3Voaet+Bdz*0IeUdwCJKwQ$R0Pj`$M#a86MaW+f@+9iNqZ^r>^z)@>uN>g zzP=+Za`lDJ#(_SS-vM)pHq8QT}C%vTQm4k5P7~#@|?A&SmA)n77kNz+$UXWKQ zMfvXEs#e$8y8TLKI5!?#ePANAT-cwSJ!2zqkp~ZpksQ6)<5vC?_6xTI0siaoU&ExY zIDG<(wb{$j0L^ac=zh7C*)7#eATaw-bOjH}=9iH|@t}q>#S(uxo>8az1cvw%)6_C3!}Bw!E}j{Quo=cA5_QgyP?y0@-KuBYy4Pv7-)nU7+pB)aFN51wDu zOU0WA05-7eh2D^k%$h{f^eEGJ&(pUEz%ZaiYqEk8*K@HNtf>hV+!%l`XT}|4%;Y4l z;vuRE7Tytx(y$-AQo!KO#VU+F#N#G~;ePMy)5yCdwq{=lQ*g9hB?LV@NixMqn}vRU zz1@toS?KCoyFOZBNHmNhhqw%TRU{%h_t;Sl+S~J5XYyKY>xRVLM-hV+z>#%Y?d=JyGILMq5Ny;aUEI^2Bca<}yqV@4jS}p_ghrev7y{GeHF5!fX$~hI2>?u!7Ye$ZbNk^roH*lh z0xtQxlta9POLNlYjMzcw6|&QPgieIe%fWU=;r>{o1=0@2`Y)mHrJ*TdCn4p9adBZM zE(BP@g#f$Z;zGv772txu7ln(P6^^*RD}2TLxbHmzkb+y{t7ih2c{Dz1 z1pt?sv;hE@c_3N%>KWnEdIT*Zl@fYHp;a45REhK0Gy+DI#8B#v&70e*CE2&(^iekc zZTG*4s873(b?APC=h#fDXJETPRi@^6UIE7q14-moB^{R+{0|i3iE23OoW}Q6| zg^`y`Y@ZAa6(&+5S0*@@`LyMUs2WP-SXlylRdZ$Hg_W{EcG5n(*Xm=muR5ejR=E>|SpGfQvG@dGO&08*5EY4n8)SU#;JdPv%Jfje~zZna_3qKTYNb zb^m*l`61o^{)Dr!`TfL%;2Q8hn9SK0_2l4xnamGxUtO5Y7rOuD$^05xg1MG}X`^xSXOr;c0Q}O08wbBMnbXBB(GND;g0OSg z>crqTCyan5?Nj^Cw%2NKGS&cdAO;hNUWh;bWa7yv^PRvj=rO?m`wlRyDwh1i9bmC1 z;NS1Ss`z7Y)>BMBx92Gkk{5g!fTqYi8*gBvI^NeOO&W)|Q36~mPbW2AD0qs=>+@7_ zqW-}NQL)L*_4&#CHB>0ky|!)i*D=v@I5S?lE_mp8b8Syg13bGpDfYQmqN@Tyha_0~ zn9IB(#G-p+f`ghGEkbgva_Ai8j~MfW=0Bf78FJ)#RaExOkWj_AVO7Tx3ASFqOW zb&u%YM0Y}T7dI~p?>SK+3-5}ASO0W)-&J@|cEW4lD+Cv)=TufCwy$m$%{A@po$nxy z@cQN^U#-vzB7)jppX0qF>u&B;VL%wBFEUM83Y+rVO?IWYearYnn6ZYSFwQUAZoem_D+X zs;E~Urn)S`Alab=uC*E(2z3D{sbPF&y-^|`EFnvZB-QY`1Sk=is1o+1SFh3h&*npH zT3XHbZk*Dr$?9zb1pzPYk7<l|AFZvCFSG%qR(mNiu>z!@x^} zFL^brz9Uh_UemZ)FFp-X=2WIPCOsWTz#Py7;I++xJMcUY5XU&Ud7M)eU&iq3l0z@z zeWE7vA49Lj`X%O)mIe$l_zDG}p_i`K39;-Pb!DUNQ5UHSW*lUr^EXkoj0+9tQmicw zTN+MeUo_^0^cV*)znGCz4p;xd-jr8;X}dTy=DpwC+OP&2aDy-fEw zOow%k)@58~txNN*b&m*+*2Sr})+H6oS{LWvT9;#XvesqPl;qJ3^7u?+gr_!bTrclG zl$bq*6URVB`V;?{U0>PP;?hIyiwD}~Pk8bcHHG=)*ohZMTU+{)?*x2_*zEC}<1?%G z%jpeYEndQpFYy_2KuZ8@HK}{dEE^TuEskP!`Bz79aZP7tUx?sJk&%Z5izE-3Uwg+9fznX26S~iSn^X0WTJb@ocVF92wzUj%J85G~4#l_b6ZWtVbN`F2iuYh9g`~=R@1rfu z3GtAA)MpWI#q`u(m2}=szj1JW-|f}=)b!^an&d*NhU)52tA@Ke!Ktzjca@=<3jFC@ z&a=~{as+odg7?Z1+~o*P^K?I@qa=bZ{hPbR09&o`XLccs|MI}?M??d7=n{zvQnhTn}#ccgs)yZ z;H=JXoNv&t6%HJx6@fu6dR!FP1J>iBz#OoSixRh7z~ia4WxO>g{|3>eyUbIpBmD3L z1RuPOQ3=0?ZbM!2d)e)bO87l|8|sqZ_1gwd>v#X{*hzkI&VFCNM{YxH@_XQR>?FTy zw-H$2mq_YUo3~<&xn8-w!ow39XYaa=!3s)}HG8M@maJ(=X8VcBS#~@mW-&TZ{hDGN z{QkDajiasVcNOcnwBSpz^c6*wBtY=KV(G)pi3;F?#y;Gf7=hga->F!t@b#=T{CKB5T_ytV9+bJ;o6a?exqxy+j? zdVb`E)OUWS8z&(x zIUfI9%lt#g2pwr*eKDFLVub%j-Tu7UqMLSQbKZawR1oFL&b$F7v>=b5Y|CrI$rd~e zHk>*>(M}1k<_*z@m-lyGtU;8jT$eO3GYEc(gguYd41!f~4wv3yJg3NIZ$u}l)qDii zH2X8grKNLjnz*u87ed>y50YBSM?@nQ;ggzJ!KnGE$cE7L{X{~$@x`J5*U4lZT9tYvo?IcwOSF}#GufqdC0 z^_Bhqe?3_i7%Kj?^0)$ED_9jN3|WSi`SdW zlR=m?mzNRny7GUwnq$qCHVc#HDClEahi!2mlk3VYQ2?bLt#6zVX;ZLp_u+*p7{hE$ zu!e$TU~zpKSYT5)F^uCHmDl&z$F5vUzy6)IE2P34fNQf|A&?`qli?`4fJO^DG1k7L zJ-ag2j=4R%GR7ctU+l_QTjF+h1!Ccso!=+oakh1gQX&&B4J;K@BEC$d#ayQ$r^kyW zCWkF9T<5q;q-dMBh#-E>WDzL&oXG+QF(fJe<<4{^~(L!uoSSS*c`BC^n)5L!5E%k;6iw@cyfm^bG^~elEr)FMn7okVlva{=cQXb z6wuN<#mlvL%uCqfVd*^jxk^G2qn{VFc*J*?EFQDgws?!9VUAX?d4XJ8yn!;BZHSL3|q`tcCLhoWHFf?vc((|3S;RNNs9c? zi(O{f3MZHkqM_mft`tdwnXsK#+gAE>vh#6(mL}@D*$>E=?0eF*@%dHMjcR5C7W3&Y zt&pltd75I#&IMCBktJPbYdit07*cz=i2#u3pMP3 z^eclYPsq`XG$F^RpEQVrN^D|&hVf)_?YOsV$2}8rm+84(JAUoj0cS$)u;9$k;O&~x zuhKp9GuP6R#OQf`#?48t9l31c4@QkU`1DxBb+0t1=IIjf4Yu@wx%F6c>}Du8?YLe2 z&e7qC9mFeDc48oS+N|!N@UiA9(p5A!wB8)07`gjX9SXVAMZ~u&x)3T_ePwNFrM`3A zB}Knu+;y>5{p?G+BI)PPzNE`vv6A+^VkL2Sva=P~N^#>dHmNYC!G3QWnk+xS%BVNX z4zM!nHP44lJ0y?)pf*K3phW^J%|UaYm~gG$)>Qw%d?z-ifcYV;CTZLA$#5G0lLv^6 zg-mk@nnCb(zL#k};r_*bl~wU1B@<{}K&+}so7^A~=ZI0h9pS=2ru9K9vuCR2kX2bI zqJvV5daBdX53;m}?jK~DUlIO6a|rd9SMcmt{$X>#t9Y!#=-ENJ%?Df3gO4)dv7+TX z!d{Xxukp~acA7GgXIqY$U94GMPUy;75f|^ltWJb&a2;2J!Ih2u(`Nbsd+0Rqz;yPT zY4t2b6Z@Z5dP<3f2kew!C1xJ5Ex}4`JzzwnCUV%rAyF1kTqy@Au9N{3R}=DLbcMUZ zvfua~CYc};`Hd{1la5K^Jw$ZUF-fl^CUE18SFRUIMT{0JjWMp2+IUefScmlr^@6d- zu8F-pv#7*g%%V+Jf6~l}z2?vXLu`u_t!ni5qRgUFqq@Xin?)z~I+w9wcrgUvIaBQNI}WkK8c!JV5Bw(pScoxRJia}&b$*(N$SA#C4PvVA8K?z#ls#dXE4xWHgmtHo1_ zZeY2eqI>HV+&~GJ*@a#~z{t-HIG5KYtgI-u{Hg@!GUwqku|alb zf^(@1Jw=O%w5O}x@^gEL-woYee(rT8Kex-uU6g#mj%Ymsf!PZR7=c;m=Z1Fzx1{{s zpcn^D=KNe(O=5&<3=qA5b=xjKH^8tQj$SW6H^8u&IIGLg4Y0TjaF?H}7UCW`KNp84 za%-)7T(JP?t&R)=polsa763;fXYfWDsGucgPWidP3)doX{JpTm9gnoo>l^3eCP@ZJ zZ^bLl$7K@+NnDm7E;E@eaq6gaHmFcirpRxJyEehWg%UIk2Ma02xNuh%uMzkf_aZVo zPd3-`a%6U5Dd{!ek0YBh?y2Xx$fk^Y+H<^dIl%@hlO)|0!7fZ_#CaMAE|2F%7yvFi z=GGhFvY=nhj4WGhcVchpRcB8QI*bCiSO$;vGHs>D!m0zc?>JGW?WoymPNexJi=vtt zcCVzwTNK4|f+LDsrTNI;bqUU8PL;PP9#3$XIHxvW>9kp)`6?&P>grmj%<6`aU`Mm&y$1_d^p6W!NW3 znc>|3^kfbZPY#}(kVy{wXOtn%{m&{xoZp|D%&!;x=O=UY?#aO~PUaAoyeFlsasU03 z`HhL#%F<6NC26u75+K5sG-#0kxHTb(*CYUrZvajvKtx8>2MNLX$mN|hH=0}R6U4d( zoC7gtN!FUB#SIBwY7RK!7w?w_1RN<0cxgw#5ypU*=FHkBBT0IevZe7pC0VmHWaXmw zu7Tf}wY3@)rXSQQnqd_?3OwDZ%hR`>@l3oh~qKc_D{_MHn+(e}rW= zPwtIt6d=z3to;z(AQx=5oC`K<9|7*>o%b@YQjOs5ir~HO2yQe9-s}2vdr~YzU=c1b1D6_u4GD>k_?i`yEM(Fe!jOHvfZGyJ z#!*6qX2)SH>1=aRLhSWGLoGx!EcK0wt&> zp5%_WNmRijpiuBI5~KFLbPH85N;)B@g=Viu3#&uQbD@3$@>sUuC%w+eQ=)_0 z=}E7HX;EU!laTdNnx0VFne?Prnx0VF8`6`mG=-r*wD%6vT)IJ=ap}pYX zJm5V=Bsfh7c*n=qWV9sUJwDX?G$`O57iRAxGe}_%Nxk0>KFR&CHgNfo2et%vdj#*b zCwU^7d6wSaQhW4%PZjC?QyG4$sGX#R()*_iTzEZ?6ycc!KXHv`;_H&wm0Xj|S%smJ zYZ83ZYjbiQ}P zChp6_T;rO6u3T5}V5v)R*A=X|1UDT8@7Hw#UX*LnvxL-j2}_u5WRC&EnJG51hdw<) z8D<;V>$si-Q<)n}Bf}0-d-%eI3H@$xVtJR6Px7Xqy^>MOvaf>nT7nI{F+qDR#|CEG z+GD&^T4}qR4a~N6ndx4f4YUak_A6W$V}GjJ-3H1$2LqNaCmSdettY(>%AOfX!BXW5 z!9kSFx1RJ6r6(XuHds%(vR;Y>l${pCbzj>yQlsp&p7d%A3z*=`9Qc&&AGVKWN7~R8 z27pVkeS3@k69D~(C!K7L00>)W30Xs1cR7Oh$`Rb<2;P+=&ikWjEFV+*FVOz9%xZW( zEwk!YSe#q>)^OJ)c(1M}bK3;(=xENS%qK~;QN05#_aRQYj|Hz{@WL)T43gkc&9X@n z++EsXlms{V1@DnxaI?GMCI0le#e&J9%z0qXXAVjZXdiBA796T(c;T!hg?+fmmZY{1 zcR7Oh$`RKDr#p&M$`{<_gxj+OcR9%lrSjpj&y=s`Y&CLi{^BqGVwGIArL?u>#Xs#B z?yRTU&;#pw*giw*{>%03f3h zx2?ycFl?k&F7qf;xxnXFOueW)gp;Y&VbZ6I?AdV^pGQfIDB>C3WcKOe8E)&z^i1x4 zvXAl1o_>5+RBAjS!gnftRg~&5#oF=shwU@y-LeLoJ(h1o?cZK8=I8nZR@6}mUq8b& z6CygFm5AFg8Q{_mMi8%0&{NqO53%S(+~VD>4oZ7(PS9R^>DDa?T5O<>0Kr|45{ebm zK_P_80typ{cMJmXy*a#NnY4)|N8i@?;&Z8po7EJ*_ zkK}f&$#*y@G=0iY#$kPracnqB<>(3?CM2mt-f{yV~BR%*8U9K@)E$sRZRIW{VI zN*om4c8Q<`fTDAZEdUh#hC;p=(3bcam76 z0U~%BT?K9#wGh(vwL(VhRd)l;kF8MCN7p1kVW?RG?BJtSyVr9j51U5njU6i9f!gEh z9n7om^VzQ2T|cS2eOxAYA_O&_z`<9iC#Ax80@pX`Ns-8Sg5sE`Cq;3@6HjGCJw?&g zSD^xcz{hJ7w1*F*`E?0es8DA`_j;ZLqb4?W`(q-)U3>~QMbXt+ z(cQ%5()ci*Q1#8}Nw4ap=x#|*dew)cfnKI-@NTaYdO~TZ)019ldO~Nm)019lNo}?~ z2|iEkNZ&$jo=H!7r6slbhV-N>O*{2!{D-0oWWe`~`FyR>I!dqh90NpnBbPBwDK#e5 zdPjQFt1+q8H>D@bHOfv}g>qOAj+B)s+!wnDcSk4)fYe@HsuKXk)GPr|UGpUXN;FT0 zK)xt+(dT3-(LZHtVs&0h^dsq7O7ux>$NW5NG){L>q5z!gw08iux+#+Y^wfC(XzQuc zG!;s3a)c+|KnG=2UALd&jb8Z1?L&z^&(`h|Kq=8raos+}dla36I02yOtic07(OHAn z?Gy1y*5Co)ldQo5z$ZBZg9eCC@?=K<_#~_90Psmx)o!n6{@q|=?U4D2bgdBRBWnC} ztO%g-Z!CBbfMWA>NW4L@S)IFB>EP#BN5UCRu*|Ssy%W2;%VugH7@oz4)P@||$@_>HE8N7k$@jr_ZKyIogMLaH9ME z!T@X#RKrTC;%6v5i((=efKxpx?*k^>O+AT)rw^ z_(3j@2lNlP45*ter(J-6QL}-c zD!{1Oz)uQ@dgM$v)%=4lEwo4}?R^E@x)zrJ1>(F2E>FK(*_+F_wk3N_i9}@sf0^l)MElaXUR#VLxe- z;J8dxf#WIdPjD^?Yo_<{l@260mpNZDoz^UG*VsTFo2QRKpy)^0%&aXjfzsv+(Etb8eOk?d-X`6T=Q1%kwS?h zgqKKt>ygqJ_q5B~feKA}PW$&qN@Lu+%dR8t!N)J()A6FH?&XrVr^lVcOVDnAW}p8PnS5CS%%E^5&~~EWsHNy?a_!Me=Ao zr{SZFX^lO^Q8GB{tM2LkO2)MA!O&{PwC+J7N8I^+_2;Qgb%L>JK{e&b3O&tfryTJ3 z2nL~WTKh0}9Y3DquH)M0@rOFzeomPlbTc)KyG~A?;jT!N8sSZqICjZZOE3|-vgv9T zKY%Fvi1dX}(zOccsbwe#(3w12%TS}KR$RVc0?3r3gTn7aLAhK@v{4@lFK9Pd)KP-c za$Uimvh~5B>6w}(KxvvC0-aua`hp^6uwbkr70n*9(*Dh1)*(>p%PVj*RPY&*hlSn+`(McrrXtc6A9BAO* zYok_O(6a7a8LY`}C-dF0d1VyJ4i6KpX1h}Wtx(Io#R#?jQ>K1iRj&S}Tzq=%Tzntj z$+uheJvzSgNIt&vY8~I{Q;1k*ea9wiui3qKeeCMuWYxeL~C`1fk!ZHM*o-OJ2A;>{&vYCx-XT*H~q@u5A=w zCW?_BH_fNR3B>?jcANOtZ8}2&pE7)3G!8!l{t)2QNUaH{k!#ejwxN^SULIrNZKMLV z=`#h&{dl>I#kVlleB?Iiyw_dYWUtBFN$ZrVIC@em={N{TM^e_?4clW4n7%^2sb#D@ zzI*eiz_7}`y|a*^j`N2&YfQ>|wSKpXo`tH3^I6Jc&i8R!N27ritTNuXa;jQ3SQPy7 z>0D(xv-`2A>@Dkjf)>de8nZIiC4#IghL+-qxM5^zH6=|P7H*)iW57_?+3IDH+l7Cu z9wuI+%oS@fG z3FH(9td`-h0I*4M9sLIQE^dzjkfN(npAbtaE|kh|(5l{b4z;dKNb?}pkHecpR&C%% z?VPo)h8w{4Ktu+50QLvMG3)`33-DYIzz#u-rF)pSejm2QBWtUhFbo2))$fSXJo z628HNw=b(aRmsHqL!9KSlaTRgve`THaxIhzEeoan6j|T!ax^UY!0?+^l?QvyS(!9w zeGI%s(|bG^EwnAIW;j1^$@koM#W1C>Lr!Lw^7n4 zm1LKXO{-{%mVXlR81P>MQ{iHzU3bDSL_~{!w40S+8u@-F&&F0k-z`P zuyh_`INij$PR+Wy#Eld)y65)lm=(_8D{dVkS6hQGozuA!gD;zFP{6r|8g1cuM+J=) zN!Kmz(KI?@&(BrjvD+(}q_$!e8twJ0kqw(q?CR~PMdCxN^)f)o_AbH8I3?hyvUq=a zxMI}c^7PJ>KTbmsfQFnbNi6=$R-HDI&@hhes0Z^EHl%QIY+~9wsJ2>giaWaaMEwv7 zhBs(wdLx+uJ?40WvuurH13N)?QvUH6@ib>=zr!K$(sBkjh&U)%W2*mBimCJAg(|Lnzi4o_1H{~RF+U}F!#TfN*>npSsjqvfHu_ML~WkXF_ z0T*p-~!ox zwX9|NlLvUN3U_KOVH&h1gH?B>4b7A4)>X*aU>(>LS0GiJeMtntuj3^+PU0JU2)Bis zgwyFCSJm*rdRzZB1Mt1D{pFZD4diRo9rvR}9iw)J09EEXK`O9q2K1-1n)Pwj$pP#W z?;-IF;8m&~Q9xABRv4htZFY5KnR>!FXC-}{qF2hxOS^P$mSgU%w#G;Gacb9VEWj=?&>1l;_x3O zY;lWni^z4I^yAnnihces4D=C&(=$134AL(Ql8&HgLD&S$y?#3N+I=DvCkxc|`q>`9 zcp;Ei-hfxDmN;Jlz^_$H7_b0N2|$#v08R@)5HSF>JDr>i(IntdlKoORDLQ1w$SFx% zHAwb>$vC{T*9@k=dSbYmIpowX91>FUV*hOhNM!pUSZT+1M|>=Q+6?!s3`X^^8f(Bh z`*>vxCj5#FZ6)CkR2N-b+jKSNyhf#0cWf$-kCBNI8sCUWI^58Hj*3wr34NXv7C2@J zFVr0S6g74%g46uWoYE}xIVz=4fpdD#avw+QsW@@spxvKoFcyCg+AH!s%y4`znZbdg zn#?cRaZh~4K56o_5cGr18hakG)zYqrSXn}ZOqS751W*>I;F(ja4%I{}1Ej9+^y9e#cOl`u(1HqOqTH$j>#cJheoEn-dT4FV$MdMhXP`{4=bz*D0) zRIScS{j5lEq>6c0$guQsZ3UB2f=;mwPKD^e3T*_nD;}8o?J-2b!&YGj@BqV~8GP|e z<_Vb;DVZ3}!W~jFi95V=2?~!Msg(`7ty#Cq5tV@%8;!I>>eX5^aIcISE0lo%(ya9vcdSUi zB+8Td>gk;|=^f)Qgh*Bs-f72KkF15>+3fDEcMf&;);m|Gdu>>@E5?^aeK*F!2I??1 zbx-JB;-l!7MPB2^kV4bm=iyix71BwAblyNCiP=I8V;2YQN2}a$*=hhE?*ZJiPxJup z+8-5wcBl$;Q5RPbL8z2OE>-f$@4`E-tvWAn?d`7J%B5D zUk~8EetQA*EAa_-a@5@+$(DVVt%dgYlSB;KcQdjQ_WsR4Bdh`ITkvGWB#g!;?*CaW zf=Bau{4{BuU^8exQd#q+!c7kV7zB8sRz<~^pnbJMj`ApXle|n7q#Pc?CWMf zi5s?8JrRzL*8iazVi<~&)^-cr$8gp6;CT&GkluH9wRsZ#O~uQ|;?mwQ@2rorWYOZQvd{VCm_>h4eL{&c=~`{;1jJQWs4MB3Hk2A3k0 zZtp-=qTJKEyn!UWw|9_tF5%v#Cx3FO_YRIn?@pYUOXFNjN~CHr~tb%29b8- z5kE(ZV?~f zW51ep`a3KdK5#bE9%aap+UXf(kJZYuxPmCloeqy&RzTE}o zdPY{8M2C@O!ZB$b>kK*O^nG@fwSM;9tS~Ne%_DZ@XVONOaL&;n$?N4MwD`polIlq= zqiVH}C-2w9J!tpWL=ia&=XLs=2}?N|ZUIDzLA89~iG5&Z1N#{BjjD2vS;m0;J}_Xt zXbd2XYNBkuU*rSX!u71!(m-t9-P5l@dwF*cgALk!`F;hfBwenS4x|seF#uXURV7s~ zQ%NuE_rq^yVSOa8NHYzY)4{Yj(qF&bbBaaUgO$N28%P@-jp zL-jVd!bGZqo79QqvD@7$Ze((ViW@1*K_7}6nS7Y+M!Gq|eDoiZM@I;?$os%e6n8GS z$N>d5@%7}*F5Y7nH-Fj}x5U^HsY;9u&$x@i>efQ|1ZOc+&+=y<#LSqaT?EjmlYw+% zO$1ntyoegXmswdPzGM)Nj6)4_5q70UjG0Fvm%8aOCfE$dObUsc6i=|Tps5gSGst_< ze7VHbea57!7@U@>VicY#3I-j-;b1Rm(0#E+DuIF>a8J{ z7^9TGJg(2e_!7&%6ypWmcEplW7hYorISqkdunXM)*rb=}mCnB6w3bSNo)Q7Jp6{yS z#ws-i+whzm^+9{nOAW9j`G{gVvuX{lT2XG&TcOMudFZAW>seCfh-DHu9k_rHs_7N+ zNZEMq=*A0_rZ{^x4fVDYTT*%GVuvN4`;Ecun!&Vv?APM=;g7}dGarxNM?ae2znp%5 z)4zXy?dtl2^#c?BlnJ-_;57rH&t%gaA9$oxwTIZ^yd}$pzZHS%?I8_l#_Xg%^sN-M zeD~_@n-$upn*EMK;14nuladqQW7=thn6?^9kL!0S7w4-Pl`%Gc=bR%3y*F9azK*J} zgKG+e>dUoui%F=B_H8mZi_K<3KYQ+7Opda+mjDX`FJ7MFeoH@^9DM>K)Xy!3Wc*1n_3BST$y^ z>e=6~XD{^}I7)~NqoaBb@&daf(v|(C9%tS1^~O;WgcTxSoB5SyBWeM-sUmY%_N$6R z{VMiT1)I#Tv~|mr;Zd5%JLE1fx3iaZAxzG(nCWb@j{z?ulw801rsliTsiP!q2z#zF zVLYQCjh4*^eB|~mF6%dAdi2Yom`30XkEeG-e>TOxgGkh!n?uiC^3A&1H$BR({^eOM z#;C+1hwE)Fs&_5c#6$3kN(V_Azt7iUH1@$_jvUPa5%e>maheJXIGT}ZModOo;T>=c z$zI_62+!U7$l5;O{B$R`MOw^b+8Q0WvZOg}*PAmddwRZyYsx>OYxYOikB-7zQDbzj znF^mZm+NPLq&^>rjOX>{3IU-_dh19d<`V2sS@C~;5GEFL`-v-TPP4!k%j<_)6sokFBxR+-Ir!a=Pv5X_* zRMF@~Zd$?VjQ7E5!JTOX()I%9Cnp$ae?|cLQq+T(5Wj6B@CfES9x)Q z-$}Vscu*n@Cp<8tEoMcy*WbEXiPep89jui2^?2YmXHW&4ny&@U&vmJZ1-I7&rx{yI za9VK!I6tq-@D8_q+8Vuy1V%4K8SUEApX!Wud56Yv#@=;-&aFW8s{+-7VBbmE^LxX) ziVF{GW#8xZvfJ~eas29%K9+I(nzC(p#_`FrfApw{E-Kjz#UP{5(Dg0)A-jVrKq^7P zm!o8~)hrsKk=|*Vb)CV18kn!v+i06c>t&WS2~W!B_xf`ym{pN)wQ275=Ulv*MBR1e zFbwJGs^o@)VLP8KbXEA0oK z8r;3Onr5xH=N@EigaVkn8HK;`=Ed4O7BlpCGrNO^ai~DEc2vjtz)oEF@R1F&L!>Wd zOi+}Er2+UK zEWZvU_Mymw_SYvEn4po*Fnp|Dsshp-qQ1qfeemzQ(yYf+IcO^_P_^6>JdE;GA@>dq zNIX;(_qjfLdsLH81CY074si|V9(YI8qDC~Rqe=tC=xr)kby6D0$eK*G0-^U=S*uj82qhcl5w6h#n ze^5Wn&%!O3vs!3zZx*F%bR?h5;6CJ28QlDQBEunyS84j8v?I-7A;=ipc+*jisNh&V zjG=+5djfFUAYxOC9P;tj!n@6e(O(#BLNQ@fGv3w0z6SwEfoWlH} z9Wt7VQ!q+K18%ctp>Qq5YXu9Lg;Gsl%M-7~uOhlV~78v1B9hI8R{(M1?A7BXNF2D&`1;oj_CY3Ho5!f~JuE5Kx`}u{*w& z7_^5kvuV$3pd9dp!>ga{M3DjD?tm}(bUj%FYhsRtF?c!G5WyJa09sMV7!>ME#}0MI z(t+%T*+p9k3@(aOwma(NnV5AuE>1QFaWd+TSd)qW=11g)rA2o6yo2kS*Q6r0%HA#L zIA=JnnMEtO@CI=IH4V62m(4m}?B%t^PF`Q^V56*qnIAjuHR+*fCUNx z<%z5>KB{ar$pnO-z7s(qMQb`Ah!+_kpj!-GpL4$fPcmZ0Ouq##Wmx*w&DD+Rw0-_# z`o5aInz8T0X{Fnmv=z+WL59P}Rd#odPArY>m7jPR}kW zjS#zOC?MvTaSM(!|1wU@Osc1&#A4YAHp3>em|+uHnjlLOe~ksHG4t?|CFZ>>n0KSu zA^uHqg0C)4@Zq8odJdYEw$5-4zg358U!!$SskfN>XhE8e`xXoe?D$R{D% zU(Cb4a$?Vca#T+dBG|*NS$Q)qP)!M1V4`+XJKmqpKsA%ByZJE4aTr83jdgzJHDtNE z2gCTOl>=<18S{fXNz+-Tp+v8yX;%HQI1Mk~oOb@>tI<@+gxgPh1&k)D&mzs&da(g|7l-m!D&8}}(QH1dTs!I)yDlzgPoWC0g5CO~x0G`b9n z=36uwFz{sK5x9ZLL727770|ARAcZC#KnUh$tVJBe7WC5)>*bOsvzW`|g<{llVsy%b z)ep|^+KjH~eOQl)NkW}S!M%t&lp*S9-vZFhI63txdX%a2!AE~; zi8^F0sa@)IAq|@%Q_B)*R5+w5g(uR?f;3&?Zc13CM8$IZq)`HMxra1LyI&>^>F~6s z%-ND-i+(X(h$`#BTF|A+biwK78$5_*x{O#UsiXB0+bt1=-NjIcdSasNq=eDdG&Q+W!G1(IZp}-FP7G&r1)i3urzF{Cb?>zO?iP< zp^E>LgvOPF>Yjj9e4eaqEpA3{Fe{-tXYa4k+DcS|ot-$2|2s_6LRuzeE?2aEqAASd z(vrF$_Mp^$PY9xqECZe`%mE)yCCd6qI;iZ#@GkKfRGPMr)NmRJxfO(oK0d4s4yu;z zfWJkF@`&uiwW+cy@uP22MMLO;Dw?3SW#!VhZsY8G6mwU9zSqHmp_ViP0X?*!Rzq3L z$iHC;3}6`}fUpJvG?QEEFXD$BCn1qlF!%67dgHzPXh!{(`fXf!)nNU%`SilzYzY5Q z4Q2z(tOIE6=kuKA@Gr{Xd@T>Iip+UbL=z_T$nM|htinCef(N6;+KtsO3|VDP=CRMZz?e^7lqZCL4z|ei^@WF8g|67;AD)^$+Q1m6w!aH5r1x?7Q>rp4~Y z8IGFnaMY&!;HbrMChj1X{3nLiEessA6kJ?_v;@!8w(8O-tme7mk72@SK3WX8JU?bW~u{1z$s$Tc8LU&jk z1&*8P_bsaHrBokbcwU2WdMwXR7^Q0_AIL<{8bOd-2*M2nF`%o?)_E18zQ#U``BgR> z>nvq{d>M*$UI%)tK#5rl4$3;SEE2bmF|MedM;{4_q)vc_NpcN(ml`x%SjI3>0yQYG z5C%@~dhrwcA;~#n^I_~k)lL;(sN3ga3XyIldmJFD+bl7(08!VZjHUxbMd;)Fp?LTy zMqJNfeHlcI-$_T>XNGXERK1$Sh9!V!*OB1WKFtGfQ8bWzJjI^r+QWI)u7^_dTeC( z$htf>Cg$sHY#M%vm(yjeJ;^2;v<1K97myk$qbK!CS3&DzWS>2Qq36?FTL z#*ugRXK{OOEJJyF#eojP_8Z4%w+0M!x%{TM#PqfQG%ndktNmwjxt9s?VSAoM8iD_b z5cUrktBbJet_bsJ&EQicIX2f6_=?a;P{^2KtaEbkXKdQ|Z`EWLZ9dPc%}@H8tqWnF zr{j9?^J}*b{(x)a60+vi+yOwfb{kv?+mJU8^WzQKl7c2!Q)qfj!#pU(pta$rsilNQ z?F#c;aA%gk^p(a860#z5pv{0HZd&Q1H+qux!ZI*xgs+`qkadXa9b{<;U{qzGgd%`Z z9Y6*k@}0TLvawIHv9Ht;Qn3$ZQqZ?gRw<)yUmtDzWN9+W_NnNQiiwL0sZjXwl}40~ z)k0ac7alkZbB!`LN!<*jteRQY8WXjB2eu~a!VY9j)RP^!niO1tf9nxWbD~C$Z}|pI zT$HK;XB-a3!_0FWp2J|jbVd80|;hciY z^$Dcx*1@~u8VO;8S>9n7H`gvjUXAS~n3^@MDN(r1c=0{>&%-?5_xQ{AFkg{OHREBL z5!)ot0>?|#hDmXOt(2^elBUBy zB7GY!Mu|oS04CW}8m~9tqC8y?Z-C@H|LKN`D@0_`ihp76D7)D|!+cEG_kA7nHDYKu zo^Q4aA!wNN|55ku!IoWjedpQxoclVD+o#`s`=x!3TGEv*p$5xRJ2Fo1jwM;KT@j3n z@*h(vRgM2pwM0tt2+EbRts5+yCb3P&<;f^x0}VEj0@jo&I8_R9m3!19G)vebW>L>x4TJh zbG6*=w&eC%1p7pj(wmoBG+LE`Ih3Rz^OTx6`HVM-Sw@H{zQv_A4a&U~-+b9P&@Om5N;6`4zl>^99EF7pQqlJXF=Xkm*9?R}8B(`Eu={*8l>+EPW zD>C2Fe|z<(@q4b;e-mzk@uZRnN{et*U0p#Lxx&%FJ5Yx7Ww;o>d>Xr?VpkvPkamH} zrho^+^}IYNY75pxBiA=5pjRL?OMP>%K;)uXV2cl7maEMopfN*ZG}3{9Gi{=+Wn4wG zcmdfBao*J8$C*#QARQ_3NvltZPfD}OYWik4d>U<>{xjC5|4BhdvzU8jX5V6n!~!T+ zuG)i*eMwh<_tL6q66HzsSk_xkULR~Ho`_DgacNfggxEKq!_vPp+MUsBi;S;ti1t`R ztv57edgE2-ldi@b^B2lCeM)bbbsO{(`}9CtJ#R)ynyZKv{&P7NjpPY4`0A$2)@=pO z3C1u0Tj-z{a6S77jWT+HY~0M)A;7*i52z<)_z~Y)7ygcTD+}vQlFu)#BA{i0 zvIbmDVSm@b{wmnt1oqb%^{`r4N6%eN9c6Pw>S}5gLF^Zec7cmMnY5|IMtU)?OFS_X z;*T^k{5u*E{w7QCB)M%i74QH#<&psJOnQ>fb`Dq$%O@bnf-yF$VF(lKLa}dnx#Oix z{}WMz3pGC?;$>UC3}eT-7gLv>yau1Tqdcc@Hnaj(+Vn<=dhGt* z4i6POZsd;Q?!dIHAAbv*X7Fhh6e>u$RBBZO@KGx&5Ix@`Cm9brdvX}o#e^hG$Z}6t zc%Hiw;xb|ZI!i?M-H?%`Dw$JdWU*)h3bZ3J#_(@0drIEKiZIX+_Gk<^Cd2I>F5B@Z z@ISWQDt{voK&W0Nar8X|Sc4tDKb!q2@t$f)w3~|#_Shvr=gC$u zbE&7c!kfMX0+E_J-=9b_>tSRlrmUI-oVrX!=}OE(soxJJNe^f!hPcxuc3u1&=Wj7Rp#;C;9=$_j0(wm%|Od9B%OCaDy)^UO|=F4X%aq zy2}$2p`PIeZ(;8b?OZBZHeKi6KvViG$x$_@VE`bRMU0JCR(>=2pU;4sVNs%bj{hOd znU&ZeH57;{J8}KiG~9L?_^nM;-Zos;Z;=zh9af|iS!${IkF(W18$t_)D$PpB|~D5h{7%MTk)tf=xGmvD6#bS zc3Xv*T;j-BTzy?+a9xb{i6_Y)`xVX3B6p$`tsKa)3?UsKM3d4O1RlVfV?+$tw@VW) zv2#up-wL%Vnn999OolZ@zS4rZ%{Prw1)2?7LJILs3gNLXQfx!BdhYOBI)fBq5Gv>f zHQuMoT5IP!q9G1CaYHPgw;F2g1e2>~>f=y$MpM&W0xrP2Xrs$M8b?`m*ask^Nx@SR zBlhbk3{VgB@&g4?lt@g3kC$@8=PIi{)HmHa*;EG1hU6M2yvx$0Dy_ zx()7J#Kaa+?5xJR?1}`4n$=73%?{6GgKrmU?ox1zoq{A}5PgfYZ6x}?NN=j0ctJS) zra7Wv97x2BcB>r02N$`S%Cu&=qT%gmAR4#`F=q;b_lSZ(1XIvQG|xhmprE+-0F8D# zs7*ZvWmqii1}Xj6hkiAM2^m8uy)d)}f%t;zL7(xDFqF;mBi#uqtZE{F)A;4C28wS4 z&TntMq9C!(rzZV3pEKLrWYJkoQ`gWEgT zg}jP+Iygd|nGWcG=3ati)BhlVjq0$2d+7KlyrQ}h>vRXzk0WtEqAfkHa8=KC3DY4J znNqFUd4*|wg}Fn1{F%<31A3S{xf%gYYwmV7bGH$5cSQVZXUrWtl30{3173*@a}g~0c;5`nrg{k9Y2jE zw+mT9906o&hqpf}2JvhcohOv-Ka*8^te(E8^3T<(JqAik_x*}j?SBGw5D@=quG;_P zpu37r>4P#Z#z7h7Nzeg~SLGy~m}XMy1!Z2Rz@4EqPA#!7$@$8DIXa4NiTcH=Hsxh- zuGFlRI)F$<&Znp2=(X5k_F7As3ByTwK4~OYxlyT5 z+)zJAvcgNPw03#STr6j3)^9DTn3BF?WVK~t-zvne zd(TYzXeSufiaU^j!vxyDfX)$`ezrwGTvLn2I24*`*9ti%Ye`fmVp$}n|pHlY5C zy-4L(BPs+2IQ4K@Baqqt{S;vf?Xm}?_IDK{;U>{m8Ii*;Gyui=X<(`USPaXtQN8Iu zD6J7JbY3H#?>ats;W@qGz!Tl2e$zCrDT}bw)6_+GSHEgKCXY&TZXo@Q3ao@+(&c2w zjR8gAA+!QBz6C$E$c5m#83_crfQAdi0%SSvcvg<58L4DSAa=;%gxk>pA6!8Nyld%& zK?A(oh5{thWtb7iY!gnX2>r6phZe>2J`o{wV3c5ow^97S4+KaNK$Xz0>!7N4#biq4 ztkv%g_nB%0K~_;Qdr~1_@UE<>X1)fxsao4%S-A#z5?0eJh+zl=VPW)_zRoo5Ow);f zWuo_MtIcLybFZl(O=I)=ob~$vUGq|u9&^$HuLwR~w&p=}kJj6n@tkX={lTZc2GQ<6 z_S+x*$8+)2oAhR^sr6LH{Lv$vb$@}P-4VP8MEJt5g=lxH#u8?Q2H2ShSu3ORV(hyl z@U_LhgIifQ_L6VPT^-B6p-~-gl%*eE?J5r5`xGvB?94GSz_zbl@P4S2;JpR`35kYS z9$GlgkY66fFo~0Q9X_tqOF_PztO9*~z^N4V1}K5s1j&iG`33SeeZ38D9H`tTggUKPkeK3j#>4Iqrsv??@+=+Sp$S zVU-Gw<*1sIR0Ik-q)|Obp+i!Apv;nrlk*x$6+PGR+mb4}t)b3$8j-9ip(|}kg(WV(f9`8rQfWxqiQ`yRs`4fyMX@HHSrU?yIKW|o;GmOZ(|&yw3=+dQ;o@zCX(37X zgb_>LJy6`jLkMEw!9G9>53+=UdpV?6KLhL}k`dlXeh3Rfe!R)^X*^lY@Ad`B=*SXLb`PaKByU$3~Zjk{k##wzoTK~?HW7_)Tq|Lj)@bU zD8Msu&#~6Kv^b#!5hu<^WV=Zg;;k52zv(D5GVAhKz#uojhqnxl$Rh#OZy9xh^@&dx z_#AtqLTf3tS4?c?D-IiVOb$3$lNJXNPAZHUo|>;@3>=6Kh@AOROC||{y(`GjAH$8J z8)nSVT4-&yVp%j{gVIXGF`vaAD)6xvRmZ+;IYz2*W0Sl;(2U-J_Q0Va6P30!ptphB z0+RRHML|H`(xxyjtRaBC;&kv+3n=b%T~UX~c^`gY>A(qh3Yf2W^;W^pFT$B!NSj3b zh#8-HYU?Ch>a6sv(jhJQgf(DL^T?47Gqa$yS)dqZsDn{7W`RcUDCQ-&EDnB<0Okb6 z#ro$n%9$c8$Z^a;kgnL_-d4+Dpmcs#vBXTi}hYS|b$IGR>+rB$i3AvDh@ z{Z#9p^peu@Mv(tMSwX5HJq=g{duF-Ri4UxoTtdVyF_%hvE9*oIJz1N61;z-c+OMSh zBs#&t2$uWD;~F6o=hF~7`5`onVw!qiOqfH0+BIZ8)Oa1WuS4{tifG3+Gru|otHD}; zYDCCXLa9(Bp<5O6_sK}SpC4si#W<3t>5Tko9L*~UWR+^P_$7r{vUq9XP6upUYGmAD zTvm3Ade+?Mg7OAS88rlPy8~IWa94{GWV6OLvqfpgW_FJy>@H6l zF+z%vmNP zTp?apSQHyYfa^?VP>kcnqMK4;0`a=Ku!97|(*Qs`G5!YWc#KiEkdAT-do;Vkk1-g* zPtiain>;W=wv|9OdN7VS1ez1FISxS>B5W$#$hKN_VjI^|#yMgU%G3hzgx_Oq>y%9J zZH2ppZwy!XRz5Se5QsDHfU~LF_{O#v)Lo#Oy}(8*SzFC+(H~if$P1Y{DFq>r6tvAY z1s?&4XI0CTSj@$2iq~ar1TL%z)*NSrCBLGItkd|_iQwH$mDYZk7om=1=<&P+Bw9mL zxu3OFc-`A*K%6(29jub~o8{Z5#R9XFoEJ{No$}`?&-_E`l#Bu3+=HKWsE+@m!bNHt`tu*@=dRkkvSHAM>$tc&d_7$_|bs?`*n@q1V zQF&&hb03vvRBexXAZ3{dR1n;zqwqlg|drXh_0JOOz;z_5F%eBpu^nYU^%?a+YPalE8OVI zvD&1~*B>gU92;EJJG@cXL1pMFeVicmzAt+xcJ9o}U)is{zrQvd?OWfmd(YnSuAM8f zcYAqBTer1K8}GwJ@e)LXk&k9fcQzF{LGQzVA=b(9g;@KNW!{m!zurl)n^+dDkAA08 zP?e9$k$_9)hI$vj+^C(|Z2aG-ck^_E_Icx{QL0Xy4`f@rceH=Fk2dSaYtph-y*D4y zU&QcmG^zLS$@NmKyycqnOcZ0rmhTbor)Xn$kB-*s+~X5cYC<5K_nMy#Uq=G;Xx*@_ zRF%WkQdOLerC_<$`a@-G4p+n)(P+&Kqc6}Xpt-#ea9<}R!!%>uiHz9ZQaLs$!NnwbWP`jg- z6uLcDpQTdC3_+*Rpd*N_Ecr^I(vjf&-E2xI|HbXVZK#wMJ#9aboeH+SUciLV?|^q( zeBvH@BcHyAeH$`WsC^+i*i}cRS9~ryL^ZZOEPDsSH ze+^AnJu2Y4QH4v6KP3Uotb~dzZ;i#cOsVuziWpsY!i`={T$Rb=2UEh0Upd$v;Kg!= zmh;4lqIZjF$YMd3!#j29DddvsCaYr0At%<%`1=TbNMazgFUZ%_<@Y~t|5bza&Hmb8 zIBJB%`gkW|xAIr=V+vm$3{Syk@228q?rRAK zkziw;@V)bD+Iy+aEaUOli3 znvOO*ovHXeGRe!ta6h_%-$Y~$%V$p|^CIT&4MJ3>CN(l$wesQLMeoVJ=C_XG2gHcA z$w;5;K|eo778AjL7a zT6&1r$``=Wj{4M(J`wMr&aWAeebiBY@E2;n^$~O7P)tFkpP?f7svHntyZi7&;^A0$ zHy}m_yr4jI+Pu8f4n#5zKDIiE@Tp0zfjH0LT zH}#a$0kmnIj}Qg%Q7-Rwz}!jGqlhP=2?=S`OD?;B<7&@tJ^l^Bl6ekuNZdYV2F1m}L1Fz7KTeqgc_y>u|VE!W4id;b!N z8%2D*YCSX#hV@43%bpr;!%p02!?3aoU6WJ~?xUyssQDWPX>fP*Vm~i#eFZWVw!z5n zWI+_tebQ=UOcxntAyQ3neU8_AnkNFptG&(Bvpnru8Q2Q0xV;0niIWrLzGxtjxZ!6>IC^=^AuD5)Vp)2 z71p3Np_rzi(BLSSzzYkzVS93f;19%vKE{R0AHiIM(@g3q_1&yhWKVs-1*%IJV2q9r zjg33*Bp|P+825M41qE6)UBH`Yo`&E6ywDqenLGT0zf;JxoK>ARsJb7*b>SJc3+wT} zMTK8sL-k>XgBhJPS%5Yte;?59AL#rM=zOE$ah7aY2bHh`;x0#3eUy68ND_@^dZ|Q* zL9cgHh&`dQ#j|+XR`M`=#=r)n`^-;+p~B_9Os$OELg&8BhWtVp-G|_s7eea3%!X8= zTK6naKbZ>zymh_FdoCHia)wD9f>(ee@G97;5n7l9w2{*?yBV>GTi6JiD8Y3* z^C!(msbG@4d=>s(zd~*GN_FcMlPRM!d4Z|ccbic?e>WAuPycv-uGxtv6&YzI2ZOA^ z`XxGhSPrV_H|g0hjJ*F&;ZG2g%7f${m2!S_D=|o5Q2i;c=pI5zgkcmR0Afd%HtS2U zO~S$%uRrB>wh2$a5mSsZ=-;?)Hoo~g*zImDnW009E|QqsgId_w*dFednJ^lqD7SmR zvwb13#i)_j+7H1293p1q6M<Cw&Pj$tzq%)qlbG#>+SoV%_bGM`SLqg&dFf%*ZQ@>u-<&N&q|52aF- zd#o?Hd)3~U2R-r4zTj4RBFuaL?1?HIa04>k3{b_}90r}W8o2tM-Io$ZL~rq;9E8wP z*MWrQCOrX!Lp<3rv=hMf?gwN$RfjJ0X_aLt-urA5?Jb<_=4q!qj@}=&d$y2qSYDIe z>T8dS2e4CpJ%DPtTZG=3?3P1$*3%e40|mOIDa0kEt%DkRL$QiZ(u*dncUO~fqKj6Q zkXRsj33SaUlqz(ZL@?qxudMA9DUMA(qCC^Q+)J%6V!a1UY#M6U{2Z$d=Y(^Y{ByOd zjp66K&8{jCJT3C+n`VTwN}mk@_+$RkVECcv)iJI~v ziLpu?lJy_*0Av{0DVI2IIuH+B1FlM;N&Bq)?A+}rRO%Aqrv3SBlhW4w4=)uf>iQ)F z2dik6+y}JSObPVsDe0*B=mM3fUpcQb(O+T%J%-VQF|jKkn5n$Zje|Mf8UP3g}bn-K7q&)TCb9zpV8o`Un2GqVO-v+hbogz49X2>osU3hhMuEWC!bCx9iv> z-5d`tr;6yXG@j^)o~b*#n*BR{&7IE0#1q*AEe|six$R+&l2#6jU9p!`EIToaRm`@RGrxHl$JuuVLaf;CSx9~gtWWc72YU9G*1L0{3ioZfrk_YNrc6G=apQ7zqH*2Ga>Dv zu+Cx3u*zYaV5Nzb95X;Lus=S_gt`jqJC0T>^N2$vXSvNKMOOocYjF{r!0Gg$3rP&2 zYbi0{rsE7_l%l0k{)kcY;dH(I44>W6s^Cqftnh6uYV(pc`sox=SUa>M2{^ zB^FiZlT+svioJrNIIS@I(XW+$bH8_@6R=bB{x0@fJUhj1C zgV~td(s=v|EfAZ8#aQG3i-LVrPVsz7S|wp3l=rL@3O!gEg&yEZfQ2)$jz|GsfOHP7ai!GHZb;PQ^EC{IVvI9=f3VGbYOB^4Z-wwdsb_qs^sCRfW=n+sIL;~@Yj9R`IBlbxpqz=da8jk&4 zd>XqC8flBj*@e+`xs}ZSkBX3{TiKT3D=#=9d?D^o%$~lBTgXycni!MjO(vqIbNpd* zTrA@F43vvs@m6Roxg^*z|AK@b{P=m)gMa24^lqsns$N*baffm?>|vX*jgbK+Y;qjZDKellmaX+KQw3I{>u@mEG2P-wCIL zs+W1Xwe#I4lh9&n(~eA7Op!=OQRNKHo|&Veb&-8=R8yUhb=2x_9gDdtjP zH2_4td}&y9;>*iJ*1-Kn1OPOIG#pe=b^Pf|>@=N^t@+{*;gTn&9aS@~Rw|9RnV0#H znz6W_W+g#30_q%epKF_+rH`~`NrXNH9TU6GP>KpmP1V8_w{heu-?e1eJ%q~za+!Up zm(eH57$ld@=%6h)@u|+Yz{IxiaJx-)c>C_oH47w-(+12HOK= z{vGAtb^JrZPA2@D^6z^79pm2({JW8VCI4+WTDtMr(%7I5de`JJ-krt^{JRVdH;4+?9f87yHc?s#s1B#*ujNje<>9kQSASn z728-S_PSJzG}}^UbKedu6g!cMk%q4R*Rx{#7mD4Pis{gTe>E$%Z=u*7sn|}6{mQJ^ z-i2bXO~ptir&WpEw>=BRZcoLO81I*7#da?gdrd0F0pay8&5G?>DE3XM*j|eL;;h)t zg<{{BitVEqMndk}c%j(wRBS)ReqmN@$3n5&QZY`7sy{m`w!Tp88&a_iiv9eo*l3~H zt*MxHS+TgA`!-xCc1tRDh+;oCD>hgt_UcsZFvUJIE7o5q_Nr9u2*rMOR%~sd*v+Zf zQHrruEB9@6q1a|Bb{)n3<*eAsLb01tv5I2r=5~6#J=Jv2vlU5*)w_o7)y14yM+#ZeF|IF=?xcx0|567(zNjem_ zzr*dpxcyyjH{$lcaC;zbStP6W$L;TNyDx5kpWD50D`&v&xcvie_r&dg<#t!x{x@!S z#_fOSb{w}aal0dK|BzeG?-5A;2e+fR{UdINaVz)2Aa4Jd+kV{sPi{$6sL%d{Th1Yn z@B*k406&p~6=}0l?~J4HZi1;`63dkd_7 zfc!39f#MUo0>by{3jDrXSAh3^U4h)+))law(G{3|kFEgh@8}A&{;sZo>I1q0rw{51 zkUpd<5c*!Opr-ZDIo=)#^*X+!*5)T%(UNF3y^Oh{2-VHb|M5C|81g76 zXzN3S7Pitqc%5veBH2nGeVvHVK9oF0O$RX6w!eiQkhitfgXG(|K-;Mg*umZKZ>TYC zpT6ksy|6sdL;^b%e2J~J(fP}3Q=p+Y+FnhkY-VFR!3MC{URo=Yzs)u>1;4lkm%!cL z*Q^4>w2AvnU-fU6TYVTwGt0@MO0x_#;mH&5+LN3kg69B`rjSMCoD1U#1(VXfQg(Tm zka16=zfQ!40dQ$8taIb5aIV2ZHTutme`ovIaBm+&*jVumt^DAqr#0HN@%Qp-ULO#C zlMXocR0->_0p+t?Wj?|B4(1!1t+W}CKWwaH>b17=;!^1Rm<~mKnR98vwdHO4Mg4`= z3ycOBa`Qsa#B~%6vGUpld+mh{b9vSh+`Ma3gzjlqnQT)*!1du;dD7HdLc#jaT?{V( zRSXGXp_^WQs9ypR*bBaNdW^M3Njt!ki^P@9;K~;JXvJM>pi-R<>XxOH@5cE~FIICm z)Dbl$APIcc*i+jX{~Sc8(S9r2Vf8fWnjYy3%M}V!0KOu}IOr)6;|v&}ekoG?kV%nc z8WTCu29Tn+9V%`|Zi^3_6w5@4A2BI1CZ9}kewn5y9l2`UboW&8ZcRY$0e-)x2YKSP zprWZ~R6zCS#`HC%HZPw+7{vm_rAfN01wj_J*t$(UFw58_EUL*cPR!))YWX=(xW;5}bY zbO_m|PZ)cj?kLy%?*9j*x(0(syonk__zcX5IlQZmvj zk3cyN^voael@|kr1Jymxr|W0u-koPX`Cmd<{OIk{9dudnqtgi`qGQ=YeZ5RsEgGCx z8??j;L|JsQBM+o%D+|oG5e0>q;5T6S6*Wi`q7K9ucb8XRPHo$IA+)tK7w5IM`rP7+ zt;IL()}@i~BRn)758AJ=uNllspD!oT<`(1NNLBBDcMs`h3gcZ(0$#Q%uY-c6<|+895jT(lMM;WCVoN@ zMT>>V^Z7Z>b3<%{4sB0UBNR)>#cEwZJAP|WPUdiu{6vxDU`SM4rL08Ze}wXiqqOZJ zJk>nazs;L9t=bK6XQdsBSPT!+IX>C__VI5~Xp)p80Q^k8Dpa_21k79v{jlFY*;S)w>F5CwLLfSDb0*n}XN{yM;$5xF;t0^GI zgsi1lPF@r}(H8t;30HIw1sgb{kK^+hAQX71n0i!O<@lL`!SL!!K?kAIdxkYM`o7fA z!!@ngnS!N&P%X?%l&cAV$m-uaP_K`DZueNxh4Bj~G47g-3KnY_WjVnC5A3rNz8>O;iaZ?{decQttXjWxje8my@{~ z$wS1|`t_d_j|NZcikB%N6B^sS!M&Pa)zksiB${u^n5if{1~BJ(v_MWh{alZElWUBH z-e%0>KLj(48<0yozxkQv`eUy{dkv6ldK9E5y(MYJW&}Y>$PH#7|Cfr+>mCrwDYk`u z0u~m(b0*J>ot?w3{(Jl&Le|D>l{p&{8U)~Q18wFb%&-^BX<9EcEL%--+8HQYt%4Bo zHVZc>Rk-X`r>bWGC(7p?>_Ich9m0g!lVH$tv@YG4cKl;-GfR-PTFxbV4TC|~1rY?R zL_HA_t=qv!$CjXtu9{aVJ)w6+b76}hV{84!t(lp54gCi3uAq9lE@eP&$w4(>=J`kl z2jo@&CdhjHlLj5?3u*wbLbr*nuhcBAvhw9|72*I4eUX$Gd1Lm8&B-WYY#=Zv`Smh( zOjFhrn?Vj$1#8BN`DBX0-5K`yg>1r%PJRJ?V_#~(s%W0WN#uyb z#V>HURxwX3KN$(a{x|bxj)Ch}5+U(1S0%{giZmNU)#&tKM@VExOZ_6D67ol0PS^A4 z`gB~!pW%R|@z3(-@Aisi#Zeq@{FLQM+y73|2tSa8W_KJZ{p6a3XJP_D8N814QPZyM z{|H-{EOh5W77S&t?h{>{BNpacb;LqyRo0|h#pZXrIET{VkX_nTwjCnH zBZY@?l9liHLOY50!6~9xf)B47u?x1_SDD~hb`FX`=P^#z85XrMN-3hmk{qSrQ8sbk z!j>4vg0qx<5M!7s5$v*OX1-$CL>^=%LmOxknx^$=Les#LsJ+txV?bh;i+E+f0*(C& z??!fWF#&#s1H`Wwp?R+33rk`WbN-RWmECyaex~Sly-Nbl(JfEr|6rWN7`l>PJ^c3R z(le*J@1HJ{##9G9;a~7hVfX|a24w;y&k^E98#36mPIXv-Rmr%-K+#8il)She(z*wd zz<$gQrPt(ryS!mCx~QdmAwDG{3}%E}l&u1b&<6-#>t5}CDllD?G*{;BJWLM>{^Kc?=@yK3nANgxPs?Jt7wqFWI9EdgI6b~N_olTm2VX4eO3L5W<2#v!gO@FrKjTDFOFxUx63lV zs?+sH(%|V7w3-D{3>1NtqFwXAv7}?djfv3+@+$hu=j<5IC=sYfjm@zI&4@6>bEyVZ zAtB*zr@lpW)#4V%^xR?0>!+&Ceq@XJZmlJ8bYnUXz|$ZTKypiCf?2Wsk*cCHr``Qigh*U_M1D(Q6zr7 z7$MN1QL@L$G#t=1u|8YmWiNiT*Xmqol$q!(i*)SoxuTRFqn{TEuCxbh_A|v6{8;d6 zxf>)vu+}aVm2J)QTcy%hD9nMCZ@4m>!zTRhGqy zI@#dLbuv=OZlM~& z)=>b}2@TH%z6t3l5i~?39O!p+8!ii$5lPUc$Sb~lWDvr zbAw{`FC?XfX|eL7c?lk(S@&!Sm1Dw!k>nq&2B|#A-URhaylLy9Z2QC~+8~BcIC|7S zw)w;yDg~dQhI4{(bVC6L>W>W~;nUMhf)*>m$|%^uRImoCH=F!U+^iLi^01h%lvqk0 z%i)U-g)HIVH5D4>)AT^p7ZiG;t`9=^ljNYd@CZ>A^ zU4c>W!fC+fcNAu!kN&bioU3# zkGF|@j%ve=bA7g$=v33q@>5>^GpI3A)Q;YQVVu&0+7Up~t8;L1G1(O_Dg^H`W5u^$ zyT zDw>0UeS+%vgC5_iOcagEz2z!SQl7M|idV@CEm>vs;3v-k8TRzus?*#DDlAEES%Z=7 zL`S<$Da26~(cw3F+aY!`sTyaUpePH$udB+}mIuVMxibE3x&=Ix4zKDCeyS|I30>PD zT@iJdC|i#nb0YZ}D!f(-g*OJ%A?>S(q$)izDE8mQuP_o}XDR;SnyR;N@!SPE*F zv^uI_f1bR4A6Wl*S7XEYDZGU;^iGA?(yly- zO_Ik)^|%NX84)2UMmSqm`I!ObO}phBLF{xk@7hyCaSV$#! zkWAx+h7>tEYbZyKa{OV_RMtSPcF;dHvdKqYXIH2^PmfefLHrL+`+k=0h5;7D&*of* zjXnbLJ0>$MrOonTFLb7vPA;ZI{QXMHs&jbTc#k}ydE#%dRyuG5x7my&ujM_XW6&dE zXG9c?e~-DZR^Ib1qZ_FGbD|~DE}Tz*sz2`+%x8Y_>wbYYkzPnk(<}t{1PBXr_h4nV z{&1RxhOhG;Amw@cwcq_{=Ib$Uk5FFh&!w6<K#?5V{Vtso>QtNDJ5+uV;|LssJa1lWP5 zPA$+o1!oh0pD0+oqi#tBeedYbC{Xpr-_55ce?%@aL5donZHwoABYc{-^o?l0G*NEe z!pnRDGifCN_XMlVdxv+3HWOj)oK=q8mxSM#y>SOR^`v>j&ujTX{94LJ_fbeV(JyPA zqF=oF&~N6pZGG|n`k7bNvexH;Hm3`;uy&3~!WE^gk{_M7%th$C;}*!>!LQ8Po@+6(#9A@ZR98A#MxXkC;_0*Y1;8mC(3bw=@L{ zV}RrxoW1USS+8{>h^l!=4R%q?BO-y#%~EeUL3ZO?1_HS zFZRq{a5gC=nmj`#554$R6lmZSW9{!GKRQelyOIQ``If8Z+uNQrWv{C*{+w4CGg#rg z?BjeNuoOqVdvtw3S_+~_LSlp4CJMdbs{Td9lC_D3y8>Yt?StblqAVUuRe)r|+y={q z^1)shvoJlF&pb|xrl(Y<+#uZEGuollkzWBEdE>Xq(& zRsBgl;iAzK1IxVIe36(yCZGCSTU%Q&!;a|#8tky=+k^wvaZh4dU3S1`(AY&?(=|zv zj*J!b_4US4H}YL}C??HP<`+7QyezaoCjELj{x1IL3614vbt@f;YPDdM#gkr9xq8sZ zWyqHV0O>{O1YL`I&P5d5!2We*hfUUp5KI;sy`C`^o~d?bQu0i#jYTPZpuyviE$Yih z%PA=c-bOB39#t1_*bgrS5*~I3Q^epjKd+!b%E0`>cmMLofBU0Zfs`5e$_iwfsCGjb znk@w~nVN_y+nUx@zj|XcW(-m_M;|j0={E6nY2#$4GWD) z>3Mj zctcml;;?x$(fL(aLVg8~CtMf)@+$ca{xqgis|kMwQ%R7Kc=cq*+*Goxx8vJJH3SX(6x`>McQ=r_v2!}9<-{zr z5#r}5DqsS~w^5X*`?)B4&I9F1?vBF|vwHwm5+Pu`2R_IXn8$m@9}|buvrDh@EbT(v zZ}xipL#3*-wdojKZXs%P$N0)6$Db)3Nl7#zL3{3N5~DhetcVI;fHBcweJ=W=vRBi6 zZJ7iX-a;vuU_S6y{P>4UWmR65_NWjXG+XJkMAulOK!aVMX|Uw$254GZicp(?Z4wHZ zFB{&l*p}uMWBr@NyMlFf@=INO67`@Q!T;f`s$`T2fJrt z=u>DiEoDa;d_zliN0m;zAb)OMjHvTc?C@axLSl{=o`amB7C4bQyqPzp5;1~kn70&2 zLl|)UQP!|EDPRbWI;}I|lQ1m4R`5~nNTA!eoRC@=%T33LHaV)FE@QXow-hDqT+-$E zKL~+h$3vHFzC1AXE+-2zepq7FslJf*y)ZIIuGk~Dsh<@eTDcZ=ZfL{gRh_>Mx|Kw$cx0e?F>sI$h7FYp#kh zC;b8s3HS?k!wOJ0=5-6qkI0Ba3iWxNgQRW}*QB$}sz=v%4^rJg4sz+|SY*6J=1W#eGT6YpJkrPgw0MZF;XB2bNcY7213h~R=6?&71E$;*lK9iR6?Pbb~ zc@P!N%q#If@TzN3;>(kzc&eJ3Gn*K2$oW=*819@hPcaLKtC|u&^y+Kr#dbXaey^ly z6ynukOuT#if0ar?oiT8B(;#ua$@~_^W~5?rbs7=~7e=g~;il5G6XpoPcn(um$RHh8 z5QlTiUeFsMyh=5^i=G`{LKXV;HPm#>Bej@IwefIs^P+Xf}o6YtMv_1)r$Wr?n!N;$ZkV=rD9`^Y$}By{3a`>e{^3 z#)_#A*elGlGK@hZ$>!*mkjefQzimNzx~lH`E%T9cMY5+RO$mm7x?@~oWE$zr@Y7B- z%O5qMGmuih$XCE#9rp(ZiAYFo$W`04;X|==pL}SxTcVg(=oB>30C)?-Q=VY^-Z5Xk zJSYFJedzoCX<7vQvYh ziIjx+Mm+Y-$o0SPRLLUz>fjWs1nzOGh-5oO_N$28bf~W#Pk)X|&vs*oc+-N$Ru#8) zwEHDicd5e*E@~`y0rkQA;UH;FTTNjrtd8sx0M~n+;cDOgHTc+eCw+qmxikQcb6JZi z``D7w<&$MTSsktW6HEED;xXbA<|hU$V>tD}RH4l;2i{Apk#@oFuX;~Wj9_3691bu^ zeBV7HjTJbyjHi+_PmTw=;akmx)K@!<&rN0gA7I1^8qqlo7BsE$H6W%oq>(XB0e^ILGBspHM18? zly_h9gK2;WB6J34)bmzd#fVWHjW1hsbkF$ZM1irLcj>lHaaU0>l4jNDM6?0;umf2vuCTL8NpKE4%tRh`2l;d0G|L4{IFl;8P(C#ZOp30MK-OC<>dg;^ z_YkMt$?b7ltZDiU_0S|4naU!)ZC(mNi6piG&1qiJd| zjXet$?86hv_!Lh9LD#PX=E-n~>gCUb%i+vV#r4wXk_+Nr#P!LXL?rwp zt>N7LVmP1dvZ{gRuJ8F!rePru*&Xlye7v+lb6jM4p`Y<4zFJ0%GCO{A>?UO61g zTLo&Or8^De8B>q_G$=4C0g$5H_}f(1<|kABM0|%Hg$YbFTK-# z&Jn*HPOom^tQc;!cVCAUeuV1|u4lP&N>2R&t~#{v3|B;qX4!`sZgIViXAodgaiv3G z^kkyRfh;|(aLB3bs#3zm_`;!m9em=<{1`mvJS82}GdWc4(1kOTbm>?7bU9M(*JY#H ztIK+Ioh~a?rOR41(FL@O(Xyz#e!AZAsE$f)AeJFFe`Tuz<=)FNNOk|s(}OBr?Oq>r zR(eb2>e_O@J3s~xB<-ft+EVYWBLw&Cos$c^dDL&eTT=PA@{V0L`CF$ec5;@t`x=bLw{@orfYm&@4||JKox)Q~=<@(Q2!e;+`HK}q&x|sD>t@Eh{||R(M{z_SgqfVzn6^@BcMfGx)7W zkF{e>keZuuRG+51ov%%IJ)x;vi}=)@)|Kei(q9}vF4JSIrbnS)ZQlnqa6hotDAx?Z zi13Uyo^lVScB&)#v!OXTq-~KLHYRq$Pf94V;R)HORwip*a2%ryI$7gWe3m^Y%Fum~ zMNE|PnPl37R%D6YGdi4=Wd=WnE!e!*ayY+x3UZ~nLY#SX6&ka14T$u< zLPo)cKlnEVis-)wwP+18MzN>mAYgB?PD7{1s`|>IGw=;1KN9hS2GATRXCQEBBmG*WPg84wt;Dn>$JSi+bRTjp>r`*Sa{6+;w#nP&64rWZr zsc2q&B}1F!pn^7qqwio;y{ypUVg_eT9CbhdI`R4|x1m7IS2m+Cp9~n8PjvlS!MkJ; z(tsCWGP8J-gf75N4%?x*E~n*U-)1}^OB5*-}4=8e=oX8JP6TY4r{RP_;GKk~lIm1mxiE5MmxY`U)b_3#N2lgp&V@8U1U z=kzH(S0Tk?_}5FTcNJe!G3p$jDJsg4_RjtkZZ4Nolk7_+X~cyOY6p5?TEj{f8@aRl zqKK*iO9Gth*EYb+G@~=)zoTyWT+zu$4EQI8_3aL9`2Ashhi>?J#?lOESO@rvYBB`` z_D-k`Kw^IdkjPUJGgHek=LL}hW?sWep1NIKFO**Chi@m#xl2G6Fp^Z_M_htX*xNc! zs{~ahS&%0hu`o#Nml?UObGejI5PNF96;m!Qm*q*mhiQ59vMOLe=B6P!j-4L=eZCY+ zWw^rFSo!NkggVbUu#paXtf$^bJnHe-L8%;}W`LcbPU+40_YU7}0E^q`fJV@%4+%2A z-oy5lj%~( zbSaPy;K<`j3qfoNd|tREzjwSaTc5S)MIrT^YUpnajM^=B=(U=j@3nNGE4!#p%yqG# z5Gk&XS53mLgz?ydfk2VI<)vA$&`2 z5pf9I9lO%4P7O}CL;NVz=|id{X*Kj}o&Lg}ix+HM)w&lpn=-g^cHdA8Q*((u z1jx`nnf|N>Mv7LI2c@To7S8FYL~llG!Ob?(s0OPA1&Kn}$y^t%3}heKTEfz#IChJ~ z7}XsJ)Z%Uo97Y@&FD!`Pwr`3fzg3X5vNT0Q1Hn&nJ@nW-78Ee4(CVD5-2K(QKm)Zu z(JIMcit%@Ps>70DJ<$zL<{aih1F{+=gn@zq77A46kwey97*F6>JaXPAViPkBKAbEGI*jUdB|@&jT)9?dGCR?HRwn zsPt|EUC4_yJ;+z(W3WS2p+l0;7f~=Z+Zv-!lNPcGA?i+bcsjyaC1_A^a-<=B5}-;K z#n@6o$)^+O%Gkl3bFiU)1}*rzfPhODgIFjpK3N_?yS<0Lt1Q#ajAGQ z8POxd;EOCKCGIPz#Apnb31Z&j36Karz+3PcNR1YJqzuQ<05Y|{EJT9Mwjfd+sSe)< z#jP0!r5(Ne*dPq-hofR*jAelal-6&qckuLA z2ZRk6QJKNlP~p+xeY~0oDNsg`zF0Ib@&WFo&4Qy3~x>1V#I1( z5C%C^TKKx@S-Ly;?_vd`+v+ts^G50z-CpnF_OH+i{W?TH?gj)@DZG?UB;vhi^hT7> zqr*B%!N%?x-BNdXbJ93-3QP6q@GlRH+|@y7LX_&n*VEBkM>W>%(cv5TSSne^T4&xaE zIi#KJ{#@g`VR+ZeL+&Us9j^6HLj!i3k<*HhMQf(fswZ{Udz%`o96T*60( zuell~>>lpXl(PafhY9OL*3B0u@@_V_vFr@0Uh&iDSbZJM+@?8xb-l?gJ860b;SIy% zuo{4F#tGza)o*i?4%Xf?`i6QhpS?Oh1Ig|gRrNmJyvmb)OTC}_n`6?cY<}8{x6b;#UO-8{qxH#CyN_!t-^hMgow@X0;&uof%3eqeyXjQ8+_=`8Re3iWhd zJROavBl5Q#9UhkV<>>H`Ea9WWgYmQxPY2>@e?09Qn3L>{r#9syB}#;@*3Vi@Q$`#o(K`n;16(yN1E_wS|7_?a~( zm!BM@R7iZ4lQd$kCx?t;J~9*m=%uS8D1DlC+YeyFec0}Rzz&*aDq-UXs@YVTo+S1p zug4!oQ#V)2Hrf(rTxSk zA7sFE&_AiKX->oOA8t8t_duP>zt{&a2q9HZN7Ne5!ppNdTI80X5(#y}>8 z2lbpE!mCD)rK{7A?#bO) zyqaX$HxyZ~1QS@3JfAENlSiQ0z)25yv6hQ|lCR|OU>fB>I8R@gBNI||{RfQi|D~~* z*{Bzqx$7~%D6y0y znWgCZL|3NYX8EzMtU>acbteMgCt@cxPHCcR95N%vPvHkC!1(p%&YM!a1av z3m;nPDMA+NNh!COFvWbq3M(!zGBbq0i|S7@Qn=F_dAjAU;(jhv_y8{xFTq()^Y$Rb zf+ve-?bS}`OLR7(;}Xted5OFNv|F!-whJ%+z{&SbAcJQn*Ym66Wcy}C)k@p$yygYf zh8@vBb^Q~QA+X(SqaL81UEv~eoorwzs7ABITFHZe!%-72f{U?WK3Y$Tj zko}seMC%u#5=jpJ%BuZAfr*=VS!b^kktC_W$5nvDcfx65h+<5_vkzhrtc^P=XjX~* zc(EO?Vq|hM(kh=;L?4o8u9MxPthZdE4F)KGWxF$5TfOo36+nh+BT}WK2LXrP2$T5X zi=~-l;)XrzlCdnJbvG)MD|B)_pAmWzG!^R{ROMwA?0~uT4vmR;drmU_wKszG# znh2y6cEO!2bfoydb1_}(Wr|t2`7mo~uq+!P=hSA#=Q2LThV!Dld7o6*Q$d9_9BETn~n^CWpy6{vvO zquktB^jqY?$s?3ZocX-);`%ojhlO~79Yi;Oi{7&)w(U==XFY+rKKzJV{oCht;GZ>Vqb;k}`9Qe>xpKaDT{+(euAJ}P*EHX=DQ3QBQ_P&rrkMFY(w^@_?fI5>+c?|I zH4yw-ch4psCOO+y& zDJy!i)O~H5_opR-^}v~4(~LNPt!?fIXyvbK$^vO@Y^f$7o;MZ>6ZMKun~6&NQVd*( zJpK);5DrI#3UZjI3O9{5X=6dgN-EHiNIbv=9_zfcrQShvKI*^^hfl{A69E z7_S`MkKSJIU~phFaz7hyc{F%`6Jmt%(V)nSNMbLYq9bb(n!eA7(VE`@2~LkkKDVn6 zW3K0OV`3QgZzM90!PxPz&0v1~s~ZfFDD#7frEf2*=PA+tGc84HLYS*OAw^7xws-)H zgaeKWU^2WTAl?dX1X90cY(D5EjSbvVvV3K>&Zshnhd+Be(Fhq2;W*n&nAl;$x{PAE zDq3!M!3^u5qlHo1X!VfiC+}s4JU7z00eUcLV3;1cH**8~mD}q+1H0OgW+T~t0H__? zP1_tL#k9dPyjPc=dS68|ZQeiZw@jN49LUoqKE=Qg9HZ*o(DoO6R~kEuGWe#KaH7u=NC z{i=k^Sj*Jp5!}xUwmQYmq+Wf_FPgMaS{=Hv=Q0wU1y2~sMh2L?%aol3NwBT#xdf*0zVCW<4wHfh*@tzaK=sc zA}b`B++{RINA0U|n6w(-t^vMKNbtgM_Ov)!)#8HLlL3X6u6S)jJ^(m=Hh~W(j)8{L zBaJrON5H5P`$abDQu-M|eZqN548<<1IyN5t+%hc9-Z+sb8xk|W>3-h6>qmH5<2!;FVD95>8fx^617r|pW z62K1VSV7SYE1~ZZbrZFEATyNg2qHd=$mp!9hl=KZaX0meYK1o}&;Rc3I&tg>oBWUh zK$faqNCLTIU=SmiK;36~W;fp@Q+~XgwG`6)cFGj)Nw2g*Rq))Yf8+KV1z6I1yeEQ4 zM)iAebFie#+;+x$`H@Xa;JP$T2g&kXuMP)_xs`Yo1F_ZbI_(FNiYjq!*wRq5o{^kJ z;yUufFkhqk0RWwrNN9r?RFFvpSTE^S2Y_PBZPFgb6`j+dw(DGx-IL*@`f58Tb)41g zLLKb3J6JEz&aSI3|B|;C&N@H1)Ge1{A0gZ0i(^cQ4}~J=8LX`cYsABQisWDN@OlTk zjsU?4&uhgR;ju64&SvLBuM@dh#p>#asI+;qhokluz!T}waI8+cr*s0a0fd5QVao_5bG1`e zaPi5Gp@AlCq5*)YTqPC~7NyVmAyw=Y?=oC;a-)F9u3WzK#%jA-3kG!zCsykevoU!P z{3Az@~G6?Z3*FEgU*ei0`aRdYW}hPjg*^)gd(Eqozj;6mcu`05a%Ii3lXi zAiXUbIRzCwp~kkDdbkq^3O~{>>AWFO75m3@z;0Z(3P?fkM1qip)+kdEDUCdPlYEel zJ$aE6se^K&%5*}}1Kd)>nXjTxC)EIq{3?A42+j9P?-u)}cUSiBk=(yZz`>j4!AEoB zAG1#?WrtwFGtTzA63%#<1ZU`3V16TCtFZ>kyx%O}WFFUou_gkbew8pj>0_h}<2TVR zyaA*WL}ti_l4&z62vL$bpJv( zj=)j+k1MG8Whi-pcEg#H>2yXKb7axU6sz&Wi(y2WX1hVN-H{xEC%!6z^~C1+&rq($ z|Clarl4in+9d~bp^T2UD5yAv7?T_~d_Ykf2HF|yzr)M({Id_J*)jxkNM4CP!H-S{v z#6VfCOF1^;Lq=?tEYVG$=6{^MsLyUQyXUr<-86gk*3U!^fpq=Mo^tK+C8cxGfk0Qx zXAAx<0r9dt8jgJrdLYw%97WW#u93$|n({LoGdoijz1w|<<-@tA#&WD`**~84l;yWZ zW(8XlyO3WFW=LjWM>LZ|1jeoJu{24}kXHUnMYBjuVEzoLn+)aHf!dEmxOSg{TyRkn zs3v7&jU_w^=1m$MGJz0{L$-h$;ivRE*Jr8smcO zHp;~y1S+|`(W!Vq!HQLDv~@<5(nHl3e^FrX%rUS_yjx^+mwC6y=(ZpkFn8|TOfpH0 z$=HyukS~)W4)&s$l5l{5)-tP{o-0qqm`qQCFena$7=ubl0o3vZK`sgPd;!)iD|&UfuOM@s@kr zQ@EU9s?1xTPq1ZX6B6qe(uEN3vyk?j?-(C(3HpRQwI&vo6iQlm5t+QpdelNg2>4b* zNsoH5J7t7!3O^I-+08ncIG`AS3vk9e6Ku?9Qd^dTw)L*1q70c=o!+8e;&kY;p~k({ z)0SKXrqp+FR-<1`k@ni)2-lDy5+}cGp`%BvnS22%`0feY=A7Cim_t7DIpe1&);LNA zz6Ln#B|=tiP4nu%XPvUG ztmyDecU2tJi+}HkoHU~1=5z3!N)vk-1zSm24=6Q_O~{#MOtH!TRCEu zbU`^mGn8(Lvf0)x$$xe=-IC&$}JVIsW zg6#r?HAU8@yN%9wZX2EN*==;b^Srxeov$J(GT^(gsKKFL!z$(!I9sDvC~wCb zH{MM!Wv0A!QQl~TH2mmPKFoYbSJQMXW%1l?kYwvD!9@Mvf*J5D&LI*KYM?loF6c!D1CDd+Kun%Ey9 zVVQM{GlZTQk)Mu^;I+&@*Lp=IJ0rifzVIt5+0`5{Zw2KH9>%9(jtlym>Xn1$1G$r( z><7~?o8{T1>F%VxJzYx3BR`zOkG1^WkjHel*r_zfCICulVVVT_*5bxV^fw(jkJeW4 z706nWx!732U zxolWR`ANEdiB*-Xs{tHmVF@Z`07(8ki6(4%&RW6TD|m?p6TP1{tS7@;v|L}#?MFu< z7kz-k%&}D^Jr`=tn$-(%aE|3&A{FRmF$utbo_nUKXwlOrzy)_wdT#wmo?M-uKE;#k zvJMQEJ!!b!3>-3yU1#|*5x|A=bYk1aDbd2s-IwG=i^eZ=`<$oXX7Gc3GwJ>k_fHG* zLQ7A|_*@BQo&w-oxJ*F4h}~=^Js^`It7dYCHqCuE%a1HM)ds;MW711fIk8v8o$LeQ z%_@l`{f16-P-Jj+O*oFu)$j(wxw%u3IG|)S9l6qkoGPRwu`whHnd%IWJ$H7`3Z?e~ z6J7TupE+wVPZkwvqQ4~q@Ik_}Y4MQTk2r=THXl^`?*zRBCHC_WezO3L@8>50XZ!=! zaf3*VNDV(Wegvlh4_myu`2o}uvGK(`xf~a-X_0wq3#!o?H#n+vP&wUMu7;+RGT11>kwnfC8*JfDFhSD{~W1%!kP$IeH z7ZbJ5tn(68X0u#0KWx}weN;<1Eq-1Z3lsXu&&C4FvvE~QW)&TLe%w{!{FTR9YdN3S z&e+o0VQGKT!GN=S0jlnVu#3MK4c)iO@*p^+!=@i8luOTW%F zlG#qSZK_z-Z9i2a?BX1ksI;UtamPpssIW&va8=Vm zEG(Xd$i@N_A^KAa7*U#9w_<4{#rKhE&-S^-7M<-F15jFH7FXmhmK=jvskrLyT%kdY zBD+R3LXeP`xb#2A)kdbmX^8vkgIXz=pE1bhx4%Rfle=J-83=>=%TldtqJ~LFd4KzP zm1u1JvHcM}Xj~TZR-{Nr0_xR+O|A6djdAnL8V==LRpqL@bk_$k!VFC5=-TWzfy~3q z%VHT5U;fHqyN?q2Dd&jWW~*LDFWIC-eX)unHzB6F7?@VMq>Ne4N1n1F&OG(T-O8cI zI*ypA(ue95lZu2|zar(tL3vOVT8Q=N&_by1O}t$rw6L!veuVkmJvz*f>>Vaj4i`+s zUM}GV5ru2s)w6~EoB(~84A%N;pCzz;XM%3EaOBQ74Z#(iQOs=W4BfnY#DDOw=KIg zD_gR*rd->UrR8g=7p_QIda_N~g?cFiK5Ivoc%!M*l*;2V>&YfVp{PC82yl8&8DKxXvyUC!-#^sDzOZ|Uv= z9Y6(91W^=m!4(x0H7c&SfIH%XB97q3j5_1YI3u$-qvJC3|IS_NRn@CX)vN9>{-&XF z-#z!9bH4MP?|kPw-*$x#W!u}wMFMNMJ-lDefzq*Nq=L$;j4Rm3Sm8Q{t{AKI5t%ht zG^mHTkF$5d-FREh?wm{-n#s`|qtH+I(6n&YA`=w5of@o&pXYuQM18u4G|rUm+UPdx=WLCTg8Rw$Dj?o z3ic{Bk}l@JUf}oEN*LG0utv$tz~$QV$cf~mTb6HDVd|9cr`@_&eqYaTT9L>`j-BE< z&v!8SeKWlB5&`2`+{uGUPKK=6OA=w$JdZc&`AVc{<^9rMIu_uGSQZ3vV$M8 z=gUdt@ZWw6NMR;-z%?$C53xPKyCWG!pZoVx*ExK(VK7vX&- ze1UfON%k)?HcGht&F~=7t!X|gT$~SN9fQqX%@6U5XWauJKW{F7o_O9ZH;YPGzo(%& zCQ&}cbB!%-N`67jSJI@O9FQmC6qgDM)l`ZO07O@s>1ry)3y`^}@S}@m4k_kRnJgsW zUC#<>KChPdMXyhW&#R?L34bQ`RG1K4gh5I7!bfDb_82$Fb2AS9yJ{d%3QT-zK`IZ1L)93dv}6G14oOh8qIs>#V2rps{u% zv#w`IhmC`cn+r5xRT11=Szt;pn!QZ2Mp#n{_mEMtnpM7FUiN=YP30uPDa$yl6jaV3 zW>Y%UK{_`}tj=ZIp+o&TlEE?D$+x6Kk?tXYilR!otI#DXW3W;YmXKdbS~7S|XBtZ- zooU)C=}d1;HJyp{LpRm3zp}vIRR#9=`241HhC5b?rkiRcUSA_|mEtzi8HvUC9ts3k zvyP9ha*D&n?@P2N+y^OV=}!DE$|qRO`!2uuayW|!A2m;bvIyFTCm((j34?_hzJl}| zOrr2%`zW!2ja&8<63IoCWCAZ1hH?qfQT z$*K6bE{6WErMO%MGCkEo+e_1sdaTC~@3OVgFW zLhfY&K&NSto{TGH{csv88+(>f2}d^<21{PLsmS8NuPdtc(|id-)J#Rj%IA{@M40rN3tX;^?lKV-bRzodDX0rVxv%@boGno! zy?ze;acmY!xEiw2?ceeoQ5i^2gx_5)PLIzK?8@$SO+gs?;6oE^);@g(+b_< z42z2CQbq>Voxb(@0^`C!*oV067bJ7Q7mBVXkYd5~O`2tt;9gs#jFl5 zIo|g5J-R4Cc6DFVu)_%RsjpUXwHGiuat#oeya8L6eAk@lCAkq`Py z#!0C(7@mBQk@p8i+|w@@qrQ2-vP{z`DIFcu^A=Qk5I@K9cU1cvao>ZB% z|KwPWRc0{G<^C}48jJC8Q4NcVi}4w%4u}1;!&p~e8uokL6=2ds?)C?~9?}hpr~{7UqUPI1H%w>k2?LHk;k2`%38)_s++f3XFJ_)dpMH+CaS&KS34f#Z35<+Puv;c+z@4|>LEWf=r@Rqxbj(HJiF$K6a&Y#Pjmb*yKo-e|BQV`K`9 z931J|IOz0F%dgnz#)DI8 zKp)F-+8M2!l<^J-xtEc{Khr!B# zhB1^_5annw9%-5zsO4^)swGC=UW%8?)`0OabG@kBVX8E-_A+&Dl`4nB&Z%B83Kgf) z0npSa(|rQG0VsmA9D>XAh=!v$Jq=L|N5k^jiWI}vVM!@UmU@}vAM?kBfIWks);xlo#lf`;Qg(i$4%t45^Y(>-e@cwGj zlYX`$ca%Vrkvv{Rt%+>$a@}v2b8SWn{7V=<4^P5x5 z%{ZB7h<92lO?^9xvLsSzXgi0N&&I>0JIAb};hpBZJ#Xq71r`=n=hWip5QGV@s-fvD zE%yh4OgNjs-s_KySF1t)MMn9g8uIFb9%_P=7KGNMQdbR!GA>qig^QxLureAhrlvNEd8?H47=#kD{1l&l94@Q0lMD4HE4sdMprnFw((bSN)buG+S`DOpp++u0 zE(Cs0#Y0fKk+rE_W-Qz#yaQfUkGw=EMUy1Ot#F!(!s;=VQ=%7xtUhUG!%Ld*WP^|; zTTu1H8cO@HsD9VbWFV+fOUt8`;;z~;di~y=6UF^AYLLT6*H&Faw1)?99KCp;?^lhN zmhT)1H)4raZK@~7arcA_N{C92;KJa4Eq%x5+6AdIC$MJrW?6plHe;y|L9wLAFmz3= z%VT!GtiS|owHWgxwE%CrsM6DnT(6{VCrN4K(2#9Ml}qWwfSrt9j>Mz*@gAEKJVIsn z_4A`W%|4|3=%HiAeS<-N&@vumuh9t6=s8{p6vmPQxD~dx#h5)@W%I`2gmp=?bSYa} zdT0=zW#>vo&?x!6QBBhX$kXA?m#T$djbOE;@frR%0sM?Vn_K?7Xx+by<=;e4rfFKH zZ91lFdZup%W@tv1X<3$SIhJdAmTv`CXhpVZTefXGwrhK~ZwGd0M~>-Oj_o*(>v)du z1WxEguIXB??K-aOdamyVZs--=taKiTfXf(zUzCw?+1S9M}Zkw zfgL!38+d^q1VI=?p&44C9Xg>KdZ8Z%VHidcAVzc_(R4($h@!QeZ5Bxu+7RmMk6XQS zBe|SO5nQ<>#ie)_FAt;;5ujM`S~BhQxb2(~mXLN;+#9pnDq&O}DBaE}B&%@?kx2H$ zLaKnJai7U9D`J+&i!rNoRdkga-06x19BD75itv=>ff^!($Zk69usyTsmPN&$T}k8P z)^MoDwOm}zc6tEGdQbZCAS)m(WYx2aNTpRH#xjB-B5^$cewFRB8`WUfBTdJH0pP5A zP%yv2l1Leqyh@*Hi4%v>$qm)j3}dyHR5;7xU)1b%0??}OLD8d@*N5Xg@1z~U!mtZ# zi4)*wlgNeziBIPTll-ewu&Igh47>e_L4bpTU-kOqQ+fx_hV?)uYmJko4kBK^H&C3G z3PGvZj3{4FyQq5A+`t)=7=c*tImMnQ_sFJTP7o`y zU0pw32KUI#r;JlT#sqUr%k&wk08mg~&fY-9Jgw)nI7$tsv^0g%Hi`h{p=0vhc0o`3 z4+u#k(#mBy8_Q)hSkiY&udp=jBa|Y6LWA^g=wld14-s*pzc`n1#-O0f@r-SqeT<qA+_dS%fdRf)h?a>VKM(qA4PirMfN;SUq6lb;jq0avQe z4_XWvsHIqtJ213h5AoC85E+Fpwld(Gz5<>TVL>Yv*q^JU}z2Sr(I67{x6( z5)WEP-f~fcST2GCE}Yb%+PHNlP6en7KYr;9`Df$W8ui!(Zn?{-TIw^O>$NaRJql526@tJJw1BPZFx4A(y9Z@yql*ziy58T5Q?fq397m|_ zpl_^s_BNY|=)lx~4W!V`oLFs> z_B#k-HEMWSpJ(PDMLrCDTo|0Hsic^9+5NRr zMetB+wza0Fq#YrO)%xHso|tZ!O8HDAPF)QR;7p^tbI1W8>7UaRI6r?#&w+em9d#Z@eTIk@>ld&JE-;Kmy=$Zq&I)2*uzf z5!*!p-cu+^L>0UXX-2Q>3Br}WSg}Qyx@Q*rngMMX&xAe#=}M?#BQ-Cf94!=46${)H zVOzCds1DKXssUoDp$dftyg*D0#u&LDt*$nZaOND# zWqF(kM=J$(gIm-wnv;o5V+dywLq^Ytm$X(>CQfA;Cxc;!r8~q#a5i2+4W_LVqBg5r zD$OE8-HRH?g`==skjTreyVDaB5rQ}SAOr7Z}%7=0vN7&cE0|tJ&)7SM_3e`uSNyF3*5`CfHdLNuP;X zmXmqGWKnY>ZOJrfJPQsgdrP%(fqA{@>iMcfIdpZh6+vI|G8Nbt=Ji4C6dNh(PwG?$ z)>V|wZzTDJl4aI=sFwL)c;j@`9`_PpQ`rX7Qb{E9<`kK4wibbZtfsW4%SGratWqGb zvov06mjLWP&~879K7G_*I?5(e@!gu`jE9`_HV(Qt%+@QtV0DGgaMPDXJ&lLPFU(!} zrkm`~o}1e*^n-rvAuiA5Pd4y(8gp|m;JUti-z9T%cTAKo@>>M0W0V^c<(;y;Pr0;P zwexUU{?n9y&P4g=mF0gxxjj*SyexmurE_!p`28JM&CT7w^>xj;xy!k}{<68b>$$$2 zE05;hwr6fm*ynx*A>}dmFXZ}*ye#)0=Xx#IcW}Le>$h{gk?Z@*@=tSpCHHUTZ!do@ z<)zQ!`U#_`_if;bSMUTQC`Yc`NIT0{&dv3>{u+N$FXuT$a}|CcdEVUIW84q;lltq+ zUsIM#9lFqeGM=mXyN18_b0h6m7bM z|22b=@qQG%Nd4;m_sjctF)32-YnfDeUcve60P!IAia)xl>0^EQ!*o8+^Q!#M_$~BN z-T!%ce>?BpHc|e!W%*vpZ=NXsyR!W60cx`R@5}N(rd;T#YX2X~@=sm2c78s>dxDqh zJsE_+^#RIxwJvXzH&FiUiT6LNEMHnz{`|811m(|}c;6_?{dMghD9fL{ zuKaV$@+RezZrzmw~yL9&duD*t8bOL;{{E4(js3joFAs1z?t!<;kl`V zhwCIf%S_7id8c~+cla%I^$_JRoGAZOehVHeIIH)o_V@Ar?Gx`u;8WW9B>f3qs`mx| zQvP1bt%>rx%5vdt@=stEx`u4@xInL7_f*q#^bY!yIjGuA%KGc!cz#*_(RJgwqbz?G zZOD3%vB_0%Eqe&;PV-H+7rj3JhWf%stNuO*0A(C|X+Zerd-$WtxxeCGVE$nq3jc9v zQ0l#q#sv?L@+bAKrF`E+`76ruKJUrARquaGS^kf-yMLnm-DUY-@c!pcl)r)BvW|X& za#=T3J8$NBnLc>+P zivLy5zn5n%{;K;QCmHGZl?ggJ!dA}?tS`>@AXgn@zzU|oDpMAJ- zaSunN#wS1A_;_>f3Q@11SV@mGY6H5XV0^xNTCBjC5|?!EgG`6Xvi+ttu13= z;&3s_!z-?qH;a2-zp@5-dF84r7HWUWcByr$9R6D3Bgw3{TK6)gsOfP> zG&a6H950KNPqd-KWw9%^T8GEyj+8f|fY6%K>e-^@hmq+dcA90rpNH0SK7WfgON@(s z04rLI!l2bE^~Bm{(C!a7rR6aid8au$61_O zsh23<&YjG4KI>9h6w520eg6~;qf(mGDC^U()_t}Mm6nXfjN>p%b1%kOAxg5(dF29! z`hGP@t=6N1&Ka4QwX?D*s0_A-HH=)}1jdjtn{Jdn|D{u4#P%s(wX0N6s=qa`;*W=AXZKkI#v`LPgFSPsM~63WUr%~tzZPv1wJihTAqXZMG)c%5@)wWRlA$b zW!6XaBvawy1>)s-ltq4SC7F3E?s)?q6p9=0puK|HrO#_?(X!3lOx-*P<0uL&{{ z<^AQj*GYx%l|O0PjxsaNEjNmND-5l4pI^MHHFyPuD3&VLZYUFTtL}t)Dm7y_!L`H< zE!PX97jAzvxt~MfiI-$yq9QxK?Xr?x-TuaDi??2m_0lQ5n#yIfmRzbOzp>WF1qTJ; z;we*Z+d*cAK@wP*@*H>n9VNa-tj-Lr9T;e9uT;TUmIqGa#JKGQfwIyAPb@sXT^LG` zAC8w79y(||Aqy7%h|4nV#!iyq3lxCVIJ0x}bI((|wi{WV7b`n)V|;-8JIWbePYmtC zTePh`(tsxlJk!kb)D2YZQv0C0DP^GJsp!JQCCN*fSqLj;Ja<0ybX2Yx8oL8HZna+X znzY*=;+gryUknItX1YPDe6Eg}CFcBY8e;(kxw3qGutML;gG1Y=*wl10S0$FO(j>EE z$1K-hVd<-MtgGuUa}wWA-N*^7$cjDF`b-ga9^pF{Ik6YuD(0t|y@UNDvBF3tL29RI zkOgVxoF_hLr!<ILcvxDOc#TalR&Jm{69;v zz;u)s$F_yo;rZci)`^hG=*5T<^)Llf;gl1hy3iX=?hdd|_Ffd{)}x zMb4(x)js}1*~a+KF&!2mQ@qJrk5$G(@K6~CWpj*_nI?EW!oYJ-ZM|q|vwjemmpWoG zr@MQ_cB8VF1CSal+#Vk^UaqHLP3IjbO20vuXXQ=0%Oc0i7*>==F_RE3EN`c~C*r~5 zNbin4!vKBd1j>$sC{muywtiP{n?15Pf*Ja=6Fff=X}#PEm8tT(-Ew8ta!TbP+^#%? z!HXZpK5S2UtXs?W;}cT znyIPqh;<^{I(%UXD{#}?QMO}+NLFSV-E+YS3-4e%$%Uk{jJ-a*_W~1E>}1Lg;LbKO zNn&S5`kRr+wJIIP*9s*p8VbUSN4IUD-~rC2M~f&feu2e+^S#1$C>g{V)u`vFjkN zL{9EM)ZMJ>?Xt72dQ0*ki{mJh*WBo-ntony}km6@>>xfyX55L*;y z$)ithHr2&Bn4m-vJUJ4}Ij+zmZ9-w2$ttp9C3(~|ZCtMg2|Ah|~H;b`KIj4t#@4B&< z#?E7>H$zGpaE1;EzZG0gX4uhHD)B9TYV z*#3g(@vV;hPHOwgvZ550;Bv5dVpDco!}s)%ZN(4l#E!j)eaka50(8=s-?s^Yt?%!+ zcK4Kn!dbQnD-RvzIJxbiR|r%06{5mJOZxfS=Mh%6(^IvYiYLo&XduHnUPOg&p3(jsv zrbWak>UDzlTCE4VeLRA8u_3A?OE_s}2p4JSrS=zYA7*8{f$1e7VPDktlJ@)Lh|1Yf zpHU|!dVapztLEn?!JnT$u7;ggi{|!aa-tdPlWSaDHmN^BZN=#}Ta{iozjB&MZH|AO zCONkGPRWxkJF48Cqo$XhR6UU5Dexu() z`m(K8-CymT^+C5#5Y@(&N+G{aOQ~Eyw-h0kj&f6Vdd7Cl2<=erS!i8@6y;8L#&(Dx zO)?ARL=q(-inFEdqr}hrC<}8p1)~wnpf@83#EW{Cs{%KNYhXp`&)AL~=1z``BoeA^ zdFk?u?ZnVy7AMHZ9F_>deR9TjJQW0Hsv_h>#G)t~%-Bwld0v;60y|?IfXXvM53}M9h^cdG&*$oEC}7 zSso26XN|3iZF#-mS#HZ-h%g$_1_vcKv4(Q7l%sbaG{jtWP-nlv2D+w)>Q$69+Hs$k%k6RMYxiZR)Ec{&V_6AO zIC7Mi1sI&a=%4LKFdrsy8pN*euoEWH7k~9LVtc?$5_<}ct1_g2%dTWM(+f?D1005s zfUOZJ#Qay!3`7nFe#BeX&pFefc-sP^*FHlKq2I)rA}8-bhy`ye9KEjb%z&h@frn@T zRP1>fa?ch>di^s5QWE)LuGmT>u|yWeTY&T>jqOVnW*oVsLx^Ca_!-#hOB*w?PapCQ ze2+shDnZW*zicN!q?jAYbiqMB4t&dg!>mA%L<1)i)Ap1VCivyNaR)%yI1XS{byMGA zy_(UN&kO{6kxFtlY!!vda^AE9An=s2TsKG@g^~vj@fEWIkzqQ-1J1NlWwD)^U%3+? z>RExXd=JBljq61k$7qt@wlg5mcUz8+U0x~I{+d~V zKwob`k)DO4Qh+u5Yj*-f=#ri$b2Ai979#E2X9Xg)S(v!vp?JVK$qK)2CqR(zEJckK z*$y5#PWJV)0+E;s`=OhoVoba!_ujD+AQGhBh*7v^BE>(8vdExc%`v(_S+IWlTN>Vk)$M+5Nkd>2Pq+-%qmd$Y3%-Gi zSSZab4#?INqce5lcQqDt+B@`|q`kxSKfF2h_1@PkbnqF+A8H+-_bb!H1!J~ z%6p1t7w#8eB<)$d%0~xGW{zDu#ludK11pb{?`#~Mm;6r*g!3cjNrnW)yR4nRysnsIa2g`R>Mxx1cec)cV~sO3z4J%)vm0 zA%o)<{sw^`<$e}_&+5{y4N!$)tC*8b%|w|B-8{lW#f->IW=G%KcxVeyCdvIVSw|2H z&Xqb?m8G>9#JF$8>>jWl8>iCuH11w^I-O$70^hX{r4^$N5#h#Fk*xanHd<@I8IUxU zj*jA!J|I#TYn3QG#RG}n9WzuoV0cLyhA}$V@7n>d%$R1|P7+M^IaA|&|0+Uvrc6Wt zM|DEZHQI9#Q{T7R(9UMYwKJ1kRF*=A@0q#x1C6&#^RAs#ffG25F+rRK2wOODwolxG z81q)$#w+LAX_X!%UkA!?W@B0e1L)0|6w`GR*N#wGIo=O8_6{)Ok&yQk-nE3OV_p5B z#vWaU58zWfz`l=5|E|9bAv zp2r@vX_n9t%ga6FXf(vQ@n%2Q_`F)z2n?2acyNkHqu%HV%Q8tge6~HtrigZYk<63q zt+?G_1;CNE(gHYy2Z*{+vQT1?6T9HgH+JKAims0yoHVyBoObQ}gS%=CA5--5jz{ba z=Rwo?(5_m;4%n`JAEc#i66T9)m^ogp_Rqt zPMg@aJU{!jU9}b_M1i1w!Rrd^xEX(VSFNQv{?|AIh>r=GL)5SDsx>92UJnyEvT}&4 z(MNXGTAGrumL1!|4bL|{|2KBkS{8V*;|AyfGaT0~>o<4RT8huTt=Jve;&PJk{MN2o z!*kz+C7A*0bhd!_w|CWAj8@4_RP39sBi68w?qJhqg`GOz`=m1LqD+5w!5)q{{E~D*+}L#Cms~R=p?M{U+-WvUT!BLiWtNfH%9sY2eSg< znb`In$t9h#%(MIxI{+e3I9hoDPAT|eLkW0FmG}8<95~Q(1~_ApetDfgnzR5EM5J2u8{C zIRDdG8^Vh>zzf5&RHP(q_ftC<4eMNjF>#}eptH>RH!}ml-kn&9I1!OCL-NJJEsqP(wsCPHGW*lzI7I?xZq?9;5&hPaKrW#3uZQ zom38?010Zx*d;=a^B;Fo8O^geudyZ^hiv!uf7(f9MeKFzanAE`98CS_uNoiuXX)Y4 z&N~vZfrEaIVKwtGdU=jg|M{Qya8kU~`~Z$iI4w@0>c2Erwu-nvulW{iLM0MHJMGZL zCoJ**y0N=R>Ebgx%u$M=1dEN&f?;HF^y$U}TMepE_ZHcnNk>jBTwAA=7X^Zq;pyYJ zgjG7R3ZwsuAi1g_s?=zh5{h8_wJj0cc!umBWyV5UUxf+^at2@v`61i`#08;R{=PMrVIn3jQIYD?>qCNka-lwpc= zQidGkcK$bwmrcQ5oz7trdwK%ee5qhm=E0{qbOLBqQL^AD>hN)l|2cJ(Q=6-DL=KD8 z5SWHsqD;*&vRKHb^}iYqZx=8UR~BEPXp=1;ds8mK%9zhF`x1u0cQ()mx_`^WmcCQ9 zdU1W0l5J@h6A3P{GPLsOG2+ntyT&UP_8&fI+;d?23f=p3e(5sZNs(+?Ob0eWXC`_f zFENobLg#-s4o|_s)R`uuCSQ)AjTARwi$Ge-PxyqL^8dbZVr@|LBDwt+1l}EmMRULj z3AaXeNuwCYqkm|8rsD32tmH#3VTuSvNQCSBW8 z2tqi=odBbmg~Ao@u783sHu4WipQ4l5uFXO!#!SheOLiZ=*Z{p%d1PrAuV6epVc3}+ zg(#)|PhzdP+$0kr0sgTwH>qeoKA)%v1Cd4g{U*DX@ z2R3PMwWVscaqvUS0@aH0m?Q*W(ma2OdLoWd3_HawGc#>J_|oRItz#2V%dD&gk0DEi z8{0vc;Kz}xIQX*WR)zsnnFR5=4hL%@YAxptJLy+5%VC?SQYZsTMY~V_9K=jKth_fi zcbG2-&IoVdRO_2K4*1@eH;+!CS-$chU)Wenu>(FVKmw5Z*L|NDDa(EH4)If8F+(*o48OAZ$P~yonY_{iV3phimmv;f=uLI@o+`MN> zgHw4Vfm?0TJ$VP_!JH!r7Vl~(M`sR7ufpH^*TM)Z0CJB-iy<_JL5EWAN4gc@ptu~mu z3j3K&-Zb*;#N_07XY&iz<&WE0?l`QSy;FpP$|4e()XYq5hdy3YK};xe_>Ild3|(bH z(;wo3E$7rTN+^tEX=37%7H;DyiD;M5=<4228HWh<^4h&OCQ!&rCdUq?zf9K7Wvp>itYw=A_x1} ziNCEm)uF3up~&&J+Rs*AR1PuFF>%3=cA9>B^Sx;-hB2K4-&^cmV<-x zzN`77Y2#j-ynxN0Ca8^G7I#IgTd_rmn4P}+=|)RPtw};LtVl}Bm*3rda;wqqYGskb z^^_(}@z5g+O+?35pxp1dK%|MEFq&#?7B_2weWVSqo zWGcadft(}nIbZzFx7n$Qd&O%YPRT;_-t!GP&h_F6hsYrxQjN{;+v&*$zbn)C6ge3z z)`=B;|9M*WD9iBW@UgGvksT`ceOn&&IGaK1F7Al|nXf$O2QKiwPz%Y6Rscn@#idS; zPjTk{U~_cA*3Be$NC<8r5J}+|;pL(ELlYxFUJzf2faF=^ zul>!3b$l<0l;!emT#~r+fv*oVk4$5EQ?g#K z)kVc+!ax`KY#-;dYn%81d=&rQM<5?Usf3|sUO2hTH9myG2ede+JOe0Eh0qCId zXuKlsn+J{ii?8_VZ&FMA#kw9)f0Aij>5V}ZkW2tmph-tmi$k;@5*{+08ndscoLk^(}a zhFDQS^sCLz)1Hj$V_BsV+h(qNC(f7_;%DQKv~!mCYv)S}U)=xMO`ljW=qVN zxZw~1NE`|dV;`BSRiBpgJ}y*7tU1!d$-IlXpNM5)H*R33ztMbfXRyF1+I$?8ra*m) zzodsM7%!3}_|4{{J8x?3mL~@im%NH3#3u8a9skxWO|IR?Q&f$(<&*5#$MM89f4lkc z&Y`S6bjqj+>A(#M9XMVf%J=<`HXqt~d&S36X${fJMe$5H1@5t^dw!>RcuH%<=Pn2< zS|Ti{S{Uuo;i^AV+u1k!r6-5bOt31u}=X>abo=l$`2P6#R zeY{ICLb)HSPOEG5OMI?(S-!JLg%~W72;L)lj1X(({a&-Qk*=vgNSbU^5FBm;642Bx St23>*!`XOt`<$)f{Qm+yD1BZ4 literal 238470 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�nxL(``tfB=2bo8bgCWjy4al9u|F)UCAx> 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℞>7+N3c>DhN%oe95Z+izH-D||#^IP`Ze8ubHWa^?dx4-zp zpO0@FJo-hiiJP5Aoz`3T=J>7giN6xRJ$_&O?0e(2Z;O9+!?R}J$rt&Ke^Y#5|Mbkx zUGuAdIX?EP&A$}?BFVs;jyancn8#fEq@UjVyeGbV$4ejk+W6J+sjrXU5^uct@u$Bb zzVZAMUUuarFL_0L${Aa>KJJF+Tz_YL@SIo1KXvIHw?6;spS$k4=RWO%7d-h13s2ei zj2B+B`{|ec%roytHIY<6qRQ?ow~}pfDIZ`j9&(-NnIXa8U-<|Am54hM=kd!q!3U#~0&E37#@AHQzMp%6 zg2U#M?MQ!)3-}ODMpeZb2N~FhWxZrFjaXvZ&J3}GAM6{aUYu416rv$~JkMmWzB2li zQrxac^6E3RLz34<62z`PXAi`J5qTTAudRY#CscPzz<=BB4k0Y(80C)p+=I>45h0Gu z+apHY(U`#hgW$*?$NVT__-Nqez9XNX{0!hB7MYDfez?ys3=s}|6*~^=nF0W}NLPRn zEk@ILdp-#aCw8+q?GZj3reWAod^b$Gj|T$xiH9KwR>bq~KMJV%3!#K4Py`Y`h@vIb zh9B-r5OuIHKp^0h#5jHsUP?9)KL{oz4wfH;j*^ng4+2H=X|9S2JsL9Mtw(|I&jlXEn;s2# z-g4yd1UOc%cYIjWxE#GBzYr78 zt*-mpM73~TXy;qGT-PRKhbv*4M+2Qdcf{%;IirB{{5C<`T=%x~Gr3&bCgh0gHElAu zxIV8Y#!Ho^T|FKZM2&-KzaQOI0>s!aql*Qd0JV&nSccK&u*Lzw$8)`)O{5>!^V=j>a3%0((G;%;)0ZDHrX7Ya z?^v3@81ixe`#+c=|4i85+9n>H>pAWGdn%vZ&bMIvIYNQ!>1~o>xSrO|zpwJCZ4%_Up3=_WsOzRSxlLT>+xa#wk7<(y#r4r` z0z0{KAhjoem1{&#S*}9#-vp>__YbMmD% z9IM|IIP2Sd!HerLZT2C!u4{AF0oS!{7JaU3+N8H}UEL;`k?X292aa&HQ?Q4KWBCi= z=9Mjk?85-SY&-vbUG4DfAwX8dGp8RpKEESyI&Hpg&Xx4fqp^yddcFHVNW?RAQ)H!qnSx1+A+X>p*rnzgCVui(uca)TWe ze4KK`(?Wh1_~4B5qd_H`ju@Q9U@V`RH`Ptaki)IslhXwa<=%(M#JuG_T9qj`>FUZ$ zIYwVuOBF*PEGeod`^~oe4^Rz}p_R>(2@Vj}p7SAT2t%asCT30TCa_Iw6pU||eG<{{ zW55r43ze=H?>tn1o8HyMh9&Siz9mQT<2TVT{2R{A9)_loPwBMdiTuTvb}vI~B&g?m_@v0dm8x`5KYqWB6=GK^hYlf^gAn{^Bd6lw;uF|0h)s)9uEqZgO402ca)&q zAyDpkqbj1zb#-iyXj}u8@sK z0iidISVWF6WaCHCTQSQ#+}_Stb0O1x1#ENDGNXj)-KjgEG=V*`0`Z<2~LSv z0S)$-DI{(zhj^ogc;gsD+~J0p+YrxSh@CLRjy~qyZ|`jKsqD^u?&Bwe2?ZFQTH{h5 zM{~)RIiBmw@o)fzPNAr0@9LBdjYm_~4C859u;x_WB#5Tzhhv{&IRzg)L2+YF`zhm1 z`%32fgk|FAx)MLv2|w2@fu9wS-f}^CVF}6$1re0(X}N+*9xL*>mgbRa+V9qH6s&}b658y*gUyy(7JzTa@U}JpZo68=B&LlyZgR8 z+TGopg-<5UbWc|9@e1f|!!l?0s&X7xX&hJ8kK^G0<;oJ2D+S7x^`IaxwE?Fuj-A_| z&KpCegc2vS__~x5r?JHM_uKhAf)~5FU%sTTmyk5FZ$GC=B*)UVXtZ2w4pY^!T zH9WCwc%mATG3$HeP#0^s-Zea-YHQ#}^HCZi)soa1A$> z4L7Rc#-bsol(?X77hJuCgcyRW&#>TXA6gwF+$`ua-ql^t8nSM&>VUzt*s)0|j^z!41mvaz`HQeYL9$Pj%Rt=9W8ged*HOySY^<~5LYPh~=sAEzz?qgiTW6Fld zs39M?@+iO5H$2%jTvs++r-ti_hCk&SZgLIRmJQdc;o71h=Y!a*PjL;`lnvLY;hLf$ z$AwtKwXWgnvf*kqTwOHe^bl*f!8Ke}He98KtBQskCSnbba}DRphI48-S2W~o5o>so zYuGCr_SBFsfqC?B)QB}a-Zh*p8_ufXY|)UDN37waT*H~N;fxy26b(6u#2TL98g|Qu zT{Y|$4LO&@8XoH!cFKkwHS81(bxeuo`q8doyKKmTkh}OaW*E#9e8Ur6Ly}H{Lu^_N z`GA`rHCw)?AqiX>+Qr?A;E8mBhhnMJ@O9SQgB;K&`+~k{->EZwb7%9etoNI&gQ!QqY~`yE~<}I}aV-fAr9C zRFRyMXDtQYDZaZiYP<8$;p_C!@o_vscg|AKo#DINUfZ3AZn}VOtAlQvK{u+%-@kLa z@9#qT3;H}(nN(~+XYkn@$r!n`57vXeFM-+7_y9XpVG zF8FGqyGxr}U`%GAQS`LynI(aWpB9rnhOIlH*NIvtRNV-`mLSOQ>sc#c}?E{DlinUhL`aB&s7n6(2w9 z+O#4*8vPl5w%Q3Mfl^vcgPX`-w$Mjp@)pAUb?$B9)^C!957{+z;XA7|984(RY&K7B zS8i29J)wQDE#+jA%6wRpa*$cPL}mY}QPl&evg>AKhV&Z}U)MWkC zzz=-*z4vSL5bX0c+}=mr@6L9PB-R7`-QC^R&L7Ky@Yo_Xm!@&?m^LH)V|4eB-e2my z;iJKehSMzI`WWA-ihA#JgQHcmfSzwD7p)FLP5~KO4p%;^N2>p&u)h>MOSNwlc)%PB zcz_}h2++UK>|}(9f4#Pux!OL0-&o`$t=rP|`RPziV#MR*FwgEhn01|KZd1j+ev}(s z^RZ|?S}GOVLPBhp&~~5gJHfX5+-4t8FRT)K5>iW#G^TPSv6L5utkQg<&t9e+^n!Nhpe4! zNavh}&!~CS&cCi6a{lx_>;!7>Q||iBM%)NKz=O=$6nO}k}$YZ<+`%Q7kF0QQg39{49E)a6@K(^x>U;!D@K z*(DL;1DqjnOUB2rIc+|^1*&}29i$fJ>61i9Sv=E-CL0qFUzFcDsc%CtYN%{q!^k~qns1xlwD9g zji;#NyJ(B+5bXyHMV;v-)z3p{XtnC( zd2wV%Q+x$UxHZXW3^GpU;>D3ml%7QfIl;7@UlLlDah{dZ=u}Cg^(KwP`;NUMf(t@Y zhQl%UqpUoXB7clK#zGujpuPRWH0}g;sjQIde<%eL>5lOAs|O;?t88xRuxKk5oB3p; znLGSguXrmadQ@3J$g~Q5Aq`zsmJF6ay~!5cBw_WKFozm_!yVRe#LRVs)NP4U$4|GVMa>OOB)RfmC zCX*ThKye*@c3!3qeXm|pKYs=fkydbR5?Z0Zotv~>k<#%`zT1)~DS%@#| zxG*H@%D1JCW?4AxFv!i;NC;^l-P~y>da*^{83-5jQ8W4}-J52VkZ;VX206M_i~Cc$ zpX|^ys{hT~BGz}IXdc7B-8*qxbfLSqep|XdK_$x4V)p)M@$9ksNrRn|sXv7_)i@wB zCU;4aoqo6L*sv6U^|}kUaa&ZNG6AnBWmegW(YLXKAGZXebn&FyFaS#EiKd{SIg!r1z}Mjv3?|A~>(-e*fh!3LBzS<4 z(*9(+L-&}gd`d`^b}Kp#-U8h*jWrO?B$Ns7P2@K_^;dY+5Jh0#6D*sj7)SeEu|LDi zc-Wr_HefeIdJeOd-NL$v(jWB`ZcH2)q~6;iojF6wGEW?+?Yu2%d3;eg>`KZ~KL)?Z zwDL)wknv^GM_54FkxZ-{8}<*Pl<2VFX%VZyhjCB~pZ5kG629JY!22%_ys0RhYj#Mr zrs4GB)}XOcwFZK>ZK@TjHPZjZDo3W)lt3JjS~CjF%G4VA`H5O1b^gatt@)=$I(;xM z&l>CP8>G%8l{`V*U{j%WqkrES6QhQr-MoD;x#7HMMiM8VL2v7QM?7dEGnXpMqQu#V z_LTJN{h02PdTOHPscb?*au?4b=n(z9vBCLTQn@8wJJ(B*2q$%;pJ>tJO{U^R2>n*S z&Fjz;w1l+%lBm^x&_Rht=4r!3>lw#(O(M8E4PGKqjYZDJh(xAF7vSWSx+UOL4`@cN zM<6hm{a9J|=wrsl%7&!+Xx5F@LaWNLrWyMIci%Ud9Ri`d^D*2LuAn9`JX^)^7;jzt zRJQ1?N!H0`-IOtz2QgC^P4_;nGsSu74f$(q#FIK55acqcG&97S)5ouNddeTL>K?#D zqxG?^<<2y@LX#@aVDEXCNBgg1d`_Cq@W<94%^eGgTVDr_eeMKK);HEsDT4}Ni4X7| zJ5ZBD{VYh0yLJL6Ps_&iD+o@Y3E<}jGmSM@u8JNkC3C22)_7Z5?bCXdr%jzG&)<~j zX0epkQ!D~m9F7t_j#cvuZaE6xrq50^8gN(4U+-Ki`3nrW)xF<}w zXf1i~GY94@i_VOn6Sg**c?=pSOsf@pID#J+wE4n2Csz7CZ_ACr%mB5P%>k*pd$bD)niItL{H*bR9f3mn9P%MCw| ztYs#|VPB=r+D)C|4z+n?4w~2mc~U-S-+vT?U~N6qX?QJl!B-lb>WaTWIzpOFsSCbm z$$zu2e3eWKPq(5R4<$n^!C?m$z0=9>S-qmbz39l#8X_IU;w)!Y#OS60hRX8!_CNkj zoF<$@xh_~e58@^Ai$h6=KOVpAI8NiOy!)hX1ZEmDGtoKuQ6EBH z3xixoZi$d5YmMF0MkTHs`^p{M!I^Rt_(q0b{wUxp$e3$Q+~l@Y(FhY5UR0puTU!Lh zcO@UFNjF88%TnW)s*xyW7ZI&>dUP2}?s2=jC-TB+-Xw2#hrbx&>;uD>{GH`5R(8L~ z-#Pv!{9VQ0)%;z<;RZl$_KBFyEv2@M7T<=jPr&j~0h-GLJ~R*+6H{)100OpocXdzW zGo`lGK$d#Z^=f{(4rhy(5Q($sV+E!g_(9_CG1DD`a%)2F*Uorba)rH|y<)?I|JcWD zHj{5;>BmWUdbDN0XDD_P$}*$)CSNs}%dcJNugzvncxtCx>&7aD_%xiyhoLvzjsxp_ z!y`eCLWh_Rzg&8zK8~`*<-`pEVMt+np;uCP1so>PxpXq~D5UZ<5b&0*+L|z{>QME* z!{2kWUW`SSG%Z90#WHV6*tO5*v?o77*0umUEAJiX z69Be3I-|cX>)~pWA^*apAwDrv(*YaTaDh?Ujy+cNKHOLvoKiY z32Zt~SdkD@#HXIlbyvCmns!&J!BHY!SF!NVH2Oa-D z&NqGnt+>|MSq<$OJKwnSSl))t%!kK%dvJ_ghdPtVFH*1##J&WNW8Jxe6hst`v1j;YTL$ot z1QcNQ^%8(xOen<%;bwPrA4hb|KYr=AKRl^ZjcKjTKnW<;+#b8J15+s0F;)oR7%sTd z)@E}S3(_SPMB9-P(rp4{B#77WcP-}?6kx3}U_>_p-_frad}F_oCuK-`>;&z0J3kJuTBqAkjyp&+QA+r!MCn{Mvq+R$j1uyZ7iMiCSonm@ zoM+JEuHqT=t5cA7T6dt$mPBdGMCn{MyT3n6FDBg!-#4Ol(f}F~r!0U~cnYY88m)DW z@c2sp!}KV-QnWRqFu?stChMx&iZ&tU3nM}s?8jX^Xl!65=^;D#(SzX;)f)&sQ=Jp| z#UnN;^r5J2B;C-`0?KGaJptD4doBIgHimQAAJEL1of} zkTp3wBgm47RmA84X}6CcKrPM2X%aMw8pQ1Yu|S?Jo&XDpNQMrM5oStwwR~;RK_07k zV$fjO(kixaad%4RSOl6z;}A`+8eWovQYDp2T@Nc6tF)cChBX79DN}2ziT00dCegT7 zFq5l};!JwoLsYcHOinxNZguxqoo6HXSw4v@HO#D5h~Y4GVi}fWQXIDvhBOm(N_y5& zCkEaTO9Hw!GW0(C%9zZTQut>|>QvnQYQKPU%1yUA^EO#VKAsqC+pj@D4sy|v7mLDf zQ@R|LnKT+EEPV@9?fVdsGz!*&`Q$RlQI^YJS{2%n{9i5ef1w=7|JA^Mb%|LP?05wm ziQzTm{_<`!=UAMw#{fi+wdx*&`r&}mZnBR85{fI4Ko%C}2a~zMI1PcB$mUFW zAcQGfU8oU?sh`o-zi9{j>&>p-x4pT9+`Ei(-;s?d9-G+Iw)e01Dw<$$YMb6IA^9}f zP-s`1qsw6nr-xZsv3u|e<9--mqo#%H`mkQ0P3*T3xTz?i$C9lw$4qr9%syPvR4jgS z@l=T6*};`G4}WAnM+|pW)rir%XN+tD~(d}vgfoUR1uXd z^bK@K8$`3f;yRi5HFFZ(&+wtcWt!ElC-gYEKs!o^lJVMfAC$GG?hQ&_j2?Z>@QtW)(gemg!Xz zVP1oY^s8kQ;Wg)=tzbP?v=#6)!1|)OGa~h~Fn+`O&f4yk!D02ppphPemK%rV-V_Xo zRp=L`l5l1g!w98%GCx}=Xt>dv{N*)_xWmaD3T4F?DrN+`Qvx4>{7$6HHkHSxvO_;NKdWbJ4 zY}ZArR?Ra)$>Gu_nCZ(Rsw%PB7K6T)DT)b( z<9_c0(&}IOmD|Hc=;6>k?a+BLp2S#xP}JJ>l<=yy=|$V@TK< zK|$E^qXiG~y22GJr)=qpB|U1fhZyoA$Z=@j3bR1_Rvn`}Joswi{h@1+>+5mE;v#T= zM6TZRANe~bYRw^v$z8}}R5(+@)d(Rh?<~r(kVUp0p?P-u*HclYY(75|=JPUbcwH>&mFE%#5{t+IDhg%-ZChu`Ov+Gp z{#6+^rmtKMS%>wzn1d_&tC8<=he_S!rxA(beNR!iq)Q!!UcJ zF~DpVTy^t+E{8!jdWo~O{o~o^ZDgx5LiQ&)=@~+oZ^OW|&v!0@4F^9ijJ4qbJl*!_ zM28SCxfSJ(4iPx$(EF)(CT;1#9zvTYUMUD#br2V}_lcxcIzlV#JryDY z#ap?5M*U8c4PUFCf(lO75@0S~*uj7Dxf?{AxY=*D&hQ(@IqGjTNcLsq;Gh_?g*2GX z_>$~nz#coT@;s`%fsh1tTDdFZ%Wsvlu@}BI4S7DAhTLEult9UHvo-i?F=N7GwuMl6 zlC^eD0TSBjMGdty1%cJ)8D74CB=7^_%p2+JAOIQ90^>#>Y--9wgjte93`xt+Kc(Y( zAyCp4=*82+*(I$GKc40&%A2iq$ivaIA*V3SiyYxJ_enfYrvAaN+^HlUS;s_{V}m&( z&7~010XH@S{v}+4Rp!5Xh#_}{^SfO}V9Nx8?083?juLGb-omx89NqE=x%=f253v?R z?GMUo)!0HLV!#ueB_=!?etTZ41)HADPhYt2je}&uu48GLZ1?;pxLNBl9jQcIv0^Ej zV5xB=ZXDX6I?OoOa&rdw5eSoV9QeX3UaE2&auaxOjzxNSb=<9*3aA}X$0e=}|7$Fq zf*c4xSf$HSKt?6Sq*)S(@W_utP1@1eK;pGbnkd93EjVG|StU6!Y2BYY%8&wv{a~=RPIW|h@35FgitzX3zBOToyfeJ_U-&O z?ishbYFSydm8HD5A0^azw8;yNh+Nvkq(OSuZ%K#2!x4z8!}1rC?IdRF@#|#!rF*6a zV1@Ye04zq((j`&ALbS~)ez}b>#n`y1o935~lti_|%N~xO3%i95ibeD!y~1dQJrGGdgH$ns6`CvB$ez(F z*e!Ig03EBP6|fSybrkz$kwu{)FZNkXY0o_lp%}MQ75$^WDS3Ljm~M_UG*T(-*_BL8-7{!x&0AbF z?&OnLXr`eiQRf`=+?Z)bN!pm0Y(@;uN3WscK7&n7%a{)YKR8}Mvjt)dfbMpT4PrML z+saoTV2$tTK9em46t@OjT`F&2kSK24wUg~61va8hnYuE-hxiOyaf477f?Z0j&Fk;_ zu1p1@rvs6Nz%2`+XVgN(T|2#R1fr)O8X~@YQ-SEGfylg>%Yx|XwGeUFPAD9K=%)`2 z5#Qzs5P{Gu2z0U24GM@hYL>!|6|-iuNN|mxHSoTt`_tJmZq{rb!mM%EPGJ;8#JBlb z1IjCyEpBAT@TW3s8$1UdI|R|wfXF=c%Yx{NT8Ox7Cryq(^t3}m#OIYNIC?4&xkOtp z$_L}%=xMbOao5gP7=h@ihlYp{xBwBnb~$upCs7nQ8i&_-MGdcUcUO0VTXBbY?eas@ z5uc)}Ky(=p*`YIP;+$hE)9#l04#J?CugOEU!X>rydvQRro=0Td`mb zZ3Xk5MaGDtR>{Tk`j%F>!#sf1f@@R{c{7PF-M)Euon+K38aqjuw$GyFL`B<9@pg=M z5^S@F)k9WGWv7R=2miP^aDZyIfQm!%I_k4Cy0_i3h0M7c&t?H*_`ADpTjdvxLo3Ci zcGH^q#pA7MH#NGq)XHkwwPda@?oSKtqW9YO2^X~+%@(MAh57UsJz58fONUs5f*MfL zIwQBHT}^Tr1UJ&qCfbw;i$5x+*xkw!r7Vg7l(B)I4x5pQE(2+#ctAQJF@$2EH%Q~+ z&PeF;a1_{d8J(%E%u2|j4AaAhfQ>{vFAf0XjDkw^mxcO;jXpV2U<>@hKB|jzeHZx= zR`2R3G?5zQnZ<2H`jYu6HB!fiLd>dNS+XD8&{GsxP4_#XO!tfU0+c=Hvh+brDcOlt zm*v!AmnAt|hj&@hMy}0>zpHRxa_Q=y8U54JKb*nG?u@pWf|IGtDwV6M+?>Z8so9)I zm8H#?u0l4r%m;$Y*Zpyd<0=ae_ILdDy!mIe3#kxy9ArJ)>n40`b2Ot(RNIDQbNTeB zgWJ${z8iVhc3n|?<&$M!RvYsy3Q}-!)WXwlyVWH3Dz^hJRot=#14!Xo1+B1ypo|l= zZ6HISu!Ag7kd1#{qhuzfjNtqLiamV$0VlGYA07S_&JXU&1!OFN*6o#AXz>JEaRU{A z9j4Ox;SG)8?w4B)ksvBmZV}tkmPIu1vA3)KfA-!5%&zOY@4N50b00GozyKIv0Px%k z5SSqV0wh6zA|(+ABwhqb5VD*y4sENg+o}Uv6=_;^Qdfi|Mp0tfVr(Ur9mQs2#q<|T z36oD>tA6#@(6&dK$psK5VOd!NU>cLsxpM6#bmVa_@G zp2yy6ulHVSZHu5(ju%Tk`YfxCPmg-{*&1@sQ0guau$V)2GxB=G0&ragYk`ntvijiy z&gn$_J^4}#gI&@pTQEcj&wIN8P=*Ly#-A4q5oO}KA(G3fQZ5@wYznhrk#5agwi5sB zm9n?cj4@qoG01x?)(3PDLB2FJ3xb762FE5_2<+$P+0Vcc4zgFY6!%0 zy3_@@-ydi777-{u%|G$$m|0VkrWQq!OV>9*evqO#i=&96vyuu$NtB0)<@F6@B;l&N zc1ffMGrvn@^2MVw{E(`G9aP0BNKo|_)B>R(h5n_Hn?D|j1F2C&L3BlWdhpjHX#+0@ zbr<2|gcDECEgwi$XzE;ij^=co=a#cxa-Lm&0FrXc74eYemeZ=Pne5n_<(5NuySR%6 z)SFUn`PM*o@LqeyVjW^`IggQ#H;B3A@KAEg`8e@Mf&D5d!`W{sx4i672;?idBtMXW zumu4#e2;D@80Wtb!;`{&sGr&yM}Z%*b(G;!){EU<1i}Rc9GBc_iU34&hj++aAqH6q zm%(VM>77}lX|y5LBit8a)vl6@$A{|Khs3)|!esO0LJ_{lMzO2FVT&?NEiy{$?0|_8 zua{{`cE4wu&Iaw8P82jngKt&X^9BoamL|F;;q%*os2IQ%6)R{$;}+TmeL6vfcFq|J z>DN&dic0cC2y>0sPOR(8c{Qo+swjJ|?Xu8y?L4NukSWzmD}D&xwf=L0v7GISARX-7ay>fo<%NNtQ>Z=I0bae+2M-v$T$#XqjqYC>d=tJANUYT-cFpzT9JxfNcwui zeA3lH3Iyy6b(I(?sjKkdXGQ~ynHsR_GtgQctr^SNjvRM~IR?!h?xO+1LqE^e)$L;} zXHJS=;W3J(^oi}qw`{qCupB;)wG&v5atEB{#8OM9ua7MNyT%~hK`h50D3*h+!*Vkc zIO#alc&WIy92EAN5cn!d5Q>Ck&nu|Us$!gzZ|FjssUaAtRzb85}tOj1RFGjTvFEK37}>m+kI zoFn^-ti2{U7aqg!k8R*^CYlX6^YJ2_)gk>H;oOkTmevhd^|&< zGvq%j;K(eigmZR@GkZbjRIE6yMbZeRAgzKj3w}zORfPArGP@0AF=e*r0o%d|UR71I zD-_~$F*;5LnjgCO}pzSiy%7L$Tt64B(A_kS|fo zCeZMNCv4)2?jp4Ans+IZihtfxH?R5o2)8Vh%knM+s>l%;%%oTd;a+(nQ7PPO+qgn4 zMcUjS-5y@aH=H2#Ov~I3C~43Vr2Lbxt?^GOZCiR6+fm}>T6MV&4vV`tD)CeYXMyw! ztAZYxM)8;tnwTaeAz#VDlPQm6MxZipaxx)p7oQIV!K~v23SsdkA5khrJ;cqAT9!{* zR!UnhlD|<94vs$<_Wdjr32#m%O9YOrU75n#Ci49syrODb^=Hz-_b4ST4kN?Ei2_lk z)aMd)vn1-0EAf4tMx=ei75n0fv}T-sD;;vKNOyK}7Y(Mw_j9f|uEcK^r!PE4m7`5^ z_=qb~{tQmf$5A*)jHDo2nTWF|nP6Au1AAmH)?$xV4M|f`p7$~KSV-7j5POuhWbARXQsdB&y_ksq zVqRHwO_$RBG2n~~(a(*&mlw8THlu7(Fv)xt4ki$==rq>|O2{N9v${3s+>rt&cJhien&JksNPbkW?)%Z6@*cG_)2D3KCoh2EQlnFA> zpH2Ex(;u_rB7;=CWiiT9tVfzXQB*g`AjLzRCs~dNJjL|_l7kcouSGpndGp3{AqK~{ zIm@Zk7@9pSwn);HlvZ{ZwB@#lg_#I`!_Aq5mF6QlxUxB;P4k%vHZi~wzp@z`SG*{N zgZ!9wFB=hL%X!>oWXk)u2-73@G*`h2V;UxP4mSF!CJ2zsiHDrZDXcwCVH#6LVMRCB zVuo+I2`aA#q0ur(uP2bBRLhSAnTfS6F%@6p0SI_vhKi2yWtpJS65H&2 zEq$Cy9%620qBcC;OR<7p^N7&g2CfZJ6zd%6)3#niOhx*Xohi2J-FBv`cu(4Ws!Q}v zJ5v$S@3J#-BNP8mnE3Z{5~biSLjtOzoHcFZHfad@*gbB*U@3g1I3*@;k4$GPxZJVQz=Lnm%1{n3yPvmY{@!`)aikTX3Sp95Pz@ zE?&UsIo90eR)Zy$ZA%tU_qX@9;cRes2}*h;8Vb0mWSqL;nSV};sD;nPJj3|8_<8Or zeva=X(W9Xinh1j6GnzNZ0X6|`sKJ*-6H8A|1K>UwH&GR2TlrZ@C1Rt4Segus+BO;6 zw9U#>mX!# zJ!0`W7MhbADiz(bS${g}N)_XtT$=f((s|P=rs*BtMncbgr9C@SZ+5zUobjzjwUW7m z6ag5_9VZpYkBksz`!jiF1sKlmU2tp9LRGeGyzj_lD>Mov!^+=2DfB*PIp=zK+vkJUN4YOi{zqsnd^Wl*=kk z>BQi2f|)uv8=66ZAmy7<$1qMCtgQXv>fnFzh?A03d&4=#w5^Qk2^>|IU`@vuznPA(;EDnPWjl+D z7dNUkz!oLM1OLgkRG7+TkZdl`*Wgx$4_-4N5cfK&gM{eXsss2W%{-#l1h06bst%be zdMbc}IuO9?nn5Ol#`L%#@yn`12f9Laz_RUUuE&CAF!iIba7oVa(e;HWEW9X0C#L0% z%Insb(k!66lrCsPfkk~iRfnuN#MEg+k9U#31~D?FL3I!&tgSi_80k9y8iTt5)nR>g z0P8@4HFW>RWbEr!b+{%W`u`hpT3>>rtj-j8`^{7xWMz3@(qznox{*#^x2& z6(WTK*{WJ)5QNh>L18Qbl-5DxOxNAJ?9Z1o{SF6%W_Dc|RT8Tq!gQ_F2Pd>z4Ri#{?YJNX|D34^TK;W` z;mpBRLTwz^dAGVBogdpgc-#Y-ROF(p%0(G={H(I$r&ktg&(3waN*=W?8Ds008QZ+L z?wVZBeskNww(zawZpW~Xs@}ZMS!R#Zg6**Wo4GeALV80%5ekn5UQ}Sj!zxQ==sh)a zMg)msR9E2Af~no8yl#tJ%Es2=I|Yuu{&(;@t@j<^vi9t$1ex^#ztdPBX2<)$br3l1 zwSSsf`={3UPc~x?yf9-nW_FqeVz_d=b|Prl9${jDvH))kvY?ZDZv#6k6qYT?amU~? zwCe_cI#G96$4_K9KcpkJNJUUtHumN^qp)6vnX_-j8WN*Pfmazr}3I7Faa%D zO#xa#xrhMMuEIrBya9k2q%xHw04)Nmu8qE`c1xfYo3G5_TAd2a`n3#F7JD3|AEU_Yr2iP(rXs(NhOmyOu$|QD;(uWQ=2p`CF^=d|#T7;$fw(t7NtW zO<2lbpf5+K!0$@T-1&rU0u5_upw<%7^HSXG4coL^=S2!2_C9%|$>p{d> z`X%j6rfA|?`uq8*1t}}px)v)6Kh7!lJ)xGrcSSXZ-+>ZWV>w^R*g9L}?42CHc!ji9 z4n#QplDT8aocygT#;%rY{D=-&@lRG1L4ihT%kKfe1ivZ?T$BHe`;SjP>)~3ITt6>F zl0cHQLWODqonlwe%c5tkdqK5nr~k)FY_BrYXx7@Zt!}-eWmp4BQXTvwfhDc7>RW~{B+@)$I#7EQ8{w(3DEKMsC-KQ*_5Ux_pL1QE`$o3>G{e-QN1`z-uOsyF2< z-$V94iIH)zV_nTey^n0vEOeFH#0H2neYzra48u}a!63Rv2>~$3d;KLlq2FKDi9n&h zAYZZ5Ic)EZTE>jJ*huu@QCrCbK(76wdEEQS%&^|0z||U^H#n2YWpG~;&i8Ob=zM^) zcOFQ4=gHIZ&I9fBI#0H7K#V)Qu!TMyAWoE`pwpu01jDKJj;+~g!{q{USjK8V4s446 z@gr+=x*j_Xpf}X%_{y{WgHA>)o8_P;$N0rzQybf_0pg9}$Em!xjO+&RgQo+CS0a8C z5TkC0kx+o4m#*34jluUo-s2Kd+yH#{PJu6ZYoM}rkXZx1fwN^OT%^AUj5GaV-dj;y zMt>lIqcGieY=9!yL*e+!v!u9ZpAIMt4I1z05h1unZ#RYwOL=c^3>$K8K`gHNhLJwO zEy$LHWx&40Et)D-xJKt~yxP<`u(~4QMYw2t^Nd?SI#WR1il7GO8v`}#XU-c6glD~; zQ#SN^yG8E>R^GLSxB$s2-`^Y z?w!&}_&S1cgfug7T0Ly-JIAGdvMkC7NbgN;rS`;$x}j_MEXrI$G5}5TXH}vS!WJx5 zIF$B^tEH$;xi6-YQnjOSXOk=q#V?QD=3T0!SFThCUzEVyNywM>sMq5Ej4P%@(tEfB zOS<7lX#kverSYO{SgtnJAAroLc{!O$x|h*|c_-Qlf5|7K$WWi;EVjv*lbX^bJaq0n z(a>Q=c`#8Aecz3p#L_7t*tHWJQ}xTf&xX_&`Rva3ZztBlQj?p!HA_vVRSH>5E@m<5 zFdu3WQ_B7qc}_C=K+APDwl~G?HEdb#1uusv(Bjk>-_bhVKiHMeEhvV0A4#!Ix~n58 zQrP0Ae+Z$#c|jR16G7#oJ=2;@4|xJ;Mr@MS^kr8TNMJ~>y!R=@J8Ei0Wh8=#cTVn7 zk_gm+r`z~fEF#rWKnN94gspwUr*lOpqMzA`0nGw=3xguIJs|}vAYBinL(Uhl2%R!w zp>%rs!goMBcf#0Pi48s7zgO=#8em*TInYL>NPy2{N$phQME#tC_xPxF2HPnRpllzu zHwj%NKa_&$TEB3R=Huc+PYj9u8~-ni0^PXy%&(eKs8U!YD{DUu0#@w}@G={95QRG1}Vf+k8*ga3KL+Bmw6;f7nlA**@AekCunKUjZRc%hg8&RuO=Ic!f zeR@W(cUQU_{(Jp(Cs0-7L7!s##4vxTXRp#X6U351%FF zz}g4@+-6Zfp+1tzVJ2ZB$T%)WJ5N)Otk2EF!uk93j*^{d{8pURblwz!r4h(BPcJ3j*7@T19iB9C)+VbYRYEmm0bJoto0iVX)F8+S4{Um)fEzimizA$vDj?0)DWU1kN+C zYFM{E1izIB)S|-3?AE$v@UPuq7mI5MMW>J!3pU~<)CNdm^WdRUZo_T&-Caq6BXLUrBNT!)I24B%JFnAaRWXP1)*yD)_=EwpYCuhtxIpqOfBX@C1 z+;eY5&(%r9sLgqRxD z8v!wW?_+pPHGy^0|Hx^;rg7PgF%-nMtG#8F(YUB!e%&lHxYq!z7-n$}T>B?)$$4~S zp3Aj+=r>bvlpF)tWis1e>D>lPnfxyyPA?(^Lbn}cE-&uw`Lbl9CD!61Lo!3)?M4N$XvMn@$SY+hVqy1ZFOmjj4tWZ6HBu3srzE~z;X$u-tAMD!-bt77XkcGO`7~g@$bO5SNCS@#|dNQ** znvqtTvgy3R$II)u;y`79!Ec!S1W@L>s{tQWSt((m1HC)M7kd0N7^)uvvvVOslXEoO zBsB32-f~Cm8mIz}WC}4o7v9Jp1J3 zr_BJRq~WwRMrGMdQSXO8p(s(+E;7TqF~hEyAs}u6WO(hz1<0Mr+^0rMVwFqJkwc6L zawyst@)oHthq^ti2SDC5rA&TkA6PvUazS?R)4fYjE!w zwo)wxIH5>@$t;K#b$mU;ut+K^`L|6UaI(^wvhHULkLiQ9j(5_Vqt6XK)l1mf_OfhP zw-T!2TUTUQo0VWHKD&8@PpeWZPHh^T*iKfuCfund~wcTmIm{%wo`%YaRF`LD%m zQDD!}+H#`+gPBDtww)5|>VU7sPLP|5NDEsNe4~uc+)6d)!JSxp6kKollv2;nJ2Ihqhj`f-0sp1zm(o4p&DP z)8v36?W5+9ntHYbIqD7*-Q}pPQOpg8A}s_ME6*HQ1yl@I%ZOjjf#&L=ikX<^lCp6@ zNaw($S@iR#Am3gbscxU?X1$HrQ}mJqRV&Kky7`b)TwL&#D9&bYny9ZT2HyN*k(IOIG_igGf>K>?4DA4PBTk|^Ek6r z`hlUnOo=;nOVUzb#mGu4Z7d`%e(1ln=1PR1q`dk^K&9 z5QXWeXb1RKy7&z1K_XzP>_dw>gWAAHBWuu8o+to>L@*EWnrf$%XKIFNaO#+AKOBNC zWT;aS-43Y|GCZJSkhy(-?q;%3M29Jh8ZF*#^$5ru@0`BUXad+obVZhhs>#S?G z>zZxe9Rlu}PA2wsESkInNfpe3D`oz|ePi|@TuNMN#v}>DWkJh^253xHWjqW~B~#Ou zCKWB4?AIfTBTo+KY&-R9gB06`jcH;_OLyW>-X)G@V)j_dP--SOZd1*;Ey72q zoNWD@;*=Y=^rxGZ%QZRXaOdQXIa`Q??-&NmqB}&#T!sO{pd1700RwEf{3HyxNv>p3 z*v3LGB{x~%5UIm-R-$7LhbMC+^hcK<-bNblQCqhR&8!ESflH`?X~+US)-8MN`ub}@ z^_5;S_+LdrwUhC`q;|OSI5ffG+oTsAuKZ~PM3j8?gfD_=>1l{Lsve3Ki_oFzOG1pA{ZrQ@{*r!atI|?~h-E0nb zV)GgM(GSLplsKWdYi2*rxJ0tSBZxU=L-SisnIHv%vkp~7To-6Zfr8AH|2BXXCM)1dj zhtbx#8Ga=90q0&Mx$?kIa{)(oB#x*_FOd3cJLzRwE;-rZ*}0bsLRA<{1uqx;I)nm@ zxwpdVcO-q$ZCo;D)R9(U;AQH^6d9-df9a%mr1I?|^Y4^u2gMiZ8e%$J2}}CNq|fs$ zu)ysN@LXmU1U={S7;1iH4Qg(ga5gbu5+!$-^17%jpdT33OIEYPMZN%rDTd&Zctbaz zSo!jmGbaq5QGAUAq)`WsrJOnfYXCb+;tu?e_N6>Tuql|AsUmR+Yj$D@%cyCLB9JTQ zt#Z%y7$u1>tW8N0qL|PPZDN~iyS)EKgOta;u+yjqh8q`98t!2%tO21!tc9Ki;0f=m zWCfBb3(l~J8n?`ZlL~y25Rpid!&TA=wy6N!-$P(2V&h+PR1gQ;!ooJ#oKJ{%wf}-| zHL*=*WDgsY1fi?)ZBTzr{!J59d>_{$Y84o)*z0dS}b)7!R%QQ4^ zE)-!4Qgp|Jw`pm}5m1)><+0At>tuGD3#yu;%<3C@Vf+u8M+6dc;$YaKD^Ukd+XYD+ zbMgobiuL9v96VAmaq#diPUN{UmrD94xQfv&Mf1u$!eJwvHqVL2)ertRBmS0pZ_QLc z4f`$Q{gMiO~k)m!%WnBYo z`abog6rS-oxANl?I0A}}v=Eg6`|wxArA6l_8jFSY9P=R^1?Gxa0}~n+A%VwBE*>sT z-QXnZk<1Sh)92S2I4gYF!H6ZMT7dAExD281N)an8Dwqv!TozrzEH{e+L8oG?x!{G& z5M6I}Ml3`hU|<7O2+5>%VTLURz-D+x;N&TrWn06{W?B9@wJ^Q(yrUO)Sj_A{jS6S> zsHt<-f9Z4SD;4b!mib|&@3@UdxQ&PzBYW`Mh8M1FX|G|M#5i+h$NF_B3+TJNG4qVN zNk1{0_pTnP%9~kB-(-|8K4kG!VgplVSU9)ct?TWgv01E9Oz}CD4BX_e8tBovWLtPc zz(ZjSo5HayExsAF&LFNKEM8;qHrX2U%Ov8 z(rZ;(z6Wq);pym5z-2^?k)bzHE;`EhpluI?@rnZtO&uZVIrD8q>@nPtVlM5CkHI0t z`gIxgX$klEsgP@0u&(EXr05BvH}*=@?sc&mh;?(h32yaY}Hxs^9(Bo@pB9v17hHE15)u_i?EJ{mwzyjlj@F0&Ui#Bs% zs#&yHTahuwIHAZ?8Glic(F!I!T{^awVq|7V1qQtabdGw07GD+FYz_J==Kedz13O|1 zO?N9sn>kAA$)hGJsM`J(R0q+Bnd8!-VgRV^`((Lesu+h5&Z zIe9Beklpiy*mr;kKIx!|SYU}czAXHnJ6)9_2EJjT7CeG13NmW&C7Xu=$AMpP$GPEx zw&AXsY!#-2x8O9u$H@9vMD_ zF=?@;nn&U<$=Ap{ASgF_*`(VAg;;JE%<){magJ^(WRv+X;R=@&{5bdPT+H%%Fud#I^+?v2E#o@{TG{NT9*CQ^0k7oM#uzf z8TWwT)zioEfc)=)!I*L>c5nOza+L=p7haFt2GJ%~GO%jwrfG&! zP*f*f8=0nXOcdmfzs!p-tHeU=_y}j$?$WEv=>gOluCmLU{|$8M0kzyIf#_Y#{NIbl z_!ttx8CEF&H>l#m+2cHXR`DvZJyg)jGq)IXEz5d#e6C$S+lLCk z?g0>vsou`+LhjMroTzq*Om)0 ztEExhDFSOy4xDlV;fD@%zW@*Db3>Ee1||08RXE4t<_mJ{-?b&VlRXHj7*8m77UM|< zreiI>V0Bsk3@k30pk0}h7-16QRfVdxB!rh7ugIF4c9&M~OLs8`-zin*aOFD$qQjMM z7mJdcx9eu8v&413O&2AwksD+h(gEc5j8+q#Ed`Ek$z*=C`sgAupFI^!^edEra^tot zMEvWAl#Z^2Vz{=giT9%@P=b--(B3bMP-=+LrcJH=LZxYG1KoA)1m1epnn4ZKs?Ib8 zi0c@K@@!(oCQ>}? z#Oa1S!H$`G=ogCT+pOh8b8*($OA9vxZI^v*+4EBSoD}JGu z*4`so($h;8gq8VrRi0XATqm_iO#8?}2hSq0|f`U+I~iMc0k1<4~)9HZo$kug5Gp4J2fd#hLagv;~&ncC+;i4ctnvF-Vwm z$fvWd?6Q11Sn{-dI&<4uKAk)36gI=AqZJ?q&-R$WJPh<$0D0Y3Fvqu8L5bPqi|z6a zN&mz~_v$5@0TvwlCKnZ@V0=5~%ux-v;-j6$gyk6Xb=4_L_g81$I1579q;&hQYx>-{ zJ6?ueIEO}1fedffnm(ayWw~HVb5fhOrcb2;C|e9% z%3i*VNhXsoml{=NhU~u%y3V*EJ9Q~P(xV72FjtV?R`Ww3(8QuX$pR2l47kOh*RoSR z&uWd_xLR7#hZ@W~{HKHsY2A1GC1FWS%eDavFN?|!5uyR}RxA!TY zbvAe3@U1*)bqxZ%p%s4x4B+7}YfRVSJ-k+@4f=j=Tw6rzb+7nSrA>uF6eD0lnzSw4 z$44rt9rrQ6DuL(zSj*cAu`RGt^P#DnsppPV@Oa9Yc-(_uNRF$ezkw0V+M3X$qP^&% zRfIKT=_Vy2LQm*94<(~2pF#_a!vcx|pHTj_ol0TpxJa8t1y|%@Vv%FE2(|9Q!W3dJ zb&eNJMJqshZM`fqljX|TEQzFQ`{sG z`8N|C7CO2MZY}#m9TE-0{H(r1FKJ6>nYo-0v2%G;*P9`4{*sD@fkc>H zQePcWwMaEF2 zXZOAGS-W__F1XU@HS3@EGqGZwwe-(| z0>FFb!qQMu5aTM215lwH6BGoyB{pgCnRM}cl~SiC1!(TtNw`vy~&A z0aB10)a|`;AX}9F)9ID>z5luIQ}&r^nU1(q(%v898}T7h*VO%Dw-tU58-oMj<~pTV zki2UIMR`wxhkqu0w-{WLc~~`9)saW=K+!V`3yBZt7JA44| zc*^?!0>B*~z^G$GxW$K{I#hWt0iA~1N`Ep8^t=6a#SwN0;hstVJyZ7why#}CQ4cr?!Ns5@Q-UGRUM$Gk`m_w<0 zo{7Yq!MOjIylVf%#IKH9HTa&8j% z4#KtVrFVOU(z`0R`31--NE9|$kEcPnJje|}w8$sVeGjX}#R_qyTpU4&VEAzMvi$2> zzcdpQZ+j+6{)suW?lC!14RYk@iRwf4*soDOpjtUm-LI>a>bVp31P7m0ZxdI*nzuL# z%`q9V*bn083Z10*fMhFQr+%A)Cr54PlWj%Q;SnRfNQ?1{Dq>~t-hZM>#Gy29ZRnuj zFK$WN7FpRg;#ACCLon0VL}v`zOBCNIoK&K?3@6?_2_$o8ACEu+ENcR3+K>R8D9@-J zMX{v-6s7lDIRS&1mN6x9Y>dRFn6!`sDwSplp@{GDsi*0f_fjs^S6C|C#>6 zJ`o01+Z}_mbidE!HmU)kHStO}7%)S^8S=92Z7n#9wuoS)UPfZ2x=k0Q*OxNrC{z#? z1KOv?e>q5a4=z=IJ?oKX28FNkeG6dEy5`*g%y~CjW8JtadrC^&sksJsf@?|DSeHA! zd`&FikDLX3p;>K27N8wermz6f%oOq`Bb_o&k>o!+LH$PSu2>%BR;Ztn0+IUhn{#ms zSPf_3%vRSxaI+q@`X0(|r}r|`*o@L4BU&dXs(0E$#{1GKzRzmYICj` zJ7_vP5LOd7?JjB5J40@BG=lAh)F^r~m$)?lxW9Oy6>4>Nn}4|ls=7jVZ>5OL&58l#4#;G++rQ^<*3D$-~U9KBlu#cvw3dX7db zZo=3!A~6Zfl9iGp)t_3vDat&$fw+}??Z$bpu^R><>q=EUvW`IOQ2_|UmmVN$UAH3+ zizyb61@#$~+v`fbhm^C5IUYPJlSwfO6m4fY3d9E&9O!?F9Fis}P)^Zjc|d zJ0yM^C5C`~I!#?kFpDQN6|Fos%3T7zispu3Sui(#&%1Or4eGUGQU8y3?~jUZkaotR zKv)nfN7xr|ML;;1W*o|dW4{>Tyg;CdZL-6#{n1|Cr&$7waT3E+ zx<^Uh#vzhbB@<^sOEB+;c}5@^6b*NQ)Ny+Zu`nRa5i#aE%w9$#?U?I>Eup+7nK?dK zAeQ5UP$5Ns;`k7U5CC|JLYlc-fv8kwIdn=Dc-`%Ro0KA&3O7+CwYfc13%B6*z5Dk;tUA^NG{(lCv@@G4IEr}Qg6k^oFDl>9#BaoB zvaa#6ydgfiumL{$`D@Z#et%q@o6NU`sxF;XpeUsbajl$olFd>8GLKAeB&-TT8v zu2{W#O^Vh1%zMF@Dl8)e{Ctud0(xRa2|M4e7DrA@C@$^?9p7nZUzT0<4w^8q_>1%d>Ov$ps$BPGwhK6h_DI1gn zCsT z#-i%M2ts>Yg_|SSITkz$cHZqLs(WnAytuyTqu+C)$}*=urWcq{9as4v+XhssuQ++;P*$~Y_*;jRJ zz7XR-OjEv^WAp!TqF9%oyjD)vuXx{Hk2>T3>0O(xL}&K2vvp_uiyNEqLmQa!m#%5X z|6n6spEjJE)Ar5X9)oEy6dxt~s#eG1Ko4Cn1Fxp~HZ^zR!lGb6TKozxa;;BluQ6GE z9EHup?3MPNZ|?SpY?H1JbiTRUBceOQk`RGbL`AI^SxvcX2N*a=(1#;vg;T>oM^H?W z4b^d1s=F2|;%ivyE54?L=N4iYO?7#TzPa0DiK)E4X0kdtld^`bm7WsH`pw-Qp-W@f z-{9RIU+GmhM{o1X^~?L}edN*?)Z*8R?FattpA%olSqv z8kS=N?y*Jc$yir-a5Hdzu4X@C6k01^*h1@{5HaGWqP5bM1zNw7w{rFS;fhLYT#=UH zSg}>p&?d5CL=gHj9z#S;%|rVA!>ndeG$FJydzvWPU*c~&{d2247ayVg&DOLfTp(sh zpkj_~3-xU_sUgM*WU=||I1n|TtZOr|LL{Hmf$iiXt9RZCC+n=AsH&{aFwO}3)7j=^ z5ZbmR^WlslAI1B4;;8XIqa`YaIAz(_l$C>H@k(9_9 z$AUgDwBarX5ROd)5FHkPxIYI_dkjGBF#xs40E9z05KYc_+5*rvpT7Dk`O#c3jpBNf z@L{Ff;bUBy8Bh@Tg(zwtj|CLBJ zLs+}@SV*3#r1ylRsEX(?kgPD*Zrc}{V8gKqYHVtyFf^37Sq!0isZ*Vc66OU$CR-B{ zX68usJ0MvTFf&??);>KFGaX?DzG}j&)y6zucFD4nrkWO>m6=CPX^tJMEiF&_zu*OJ zO>O5gZTSPXqJYz05NId5L$8OGOTdsm1*LUFb2UTi9&Z+MiR0V6b&Gh-+5oSCm*7no zX7@C6Bt5UnA;bbgXV_-;x)K@mTi*dKo}kybf*h+w2Gyn{Gf3}CKOTJo;&R9gx%*q1BQl`^7iG2MzUp_-Eo8>y`gx_+J5hTF z4Y($`c_H%ownjt4uDs!^*03*cP*kDBd+2sM{g5>r%Nw4z2Hg8c^R|!0HV-0Ulr!lu zSr2fv8E(|sfV1DV@Hb>lTX;dkzp}rY;?074$GAWqVLBrep4GJ5{vXH=CYHz4sg4+k zX4rot`E|2P2BsKzFqxJbxy7c=qFz~?@mV7$1wd)mz(J-@XlYZIvvFci3-q_Gilm^R$;JPc$-G6j2|0qNeB=P zrx(CP!f5q*D3u5xi*uerr8eJzN;?^qCYwBNCIr7QyJ2AmvJD)zw`yyB@LweBz^NBr zJMU*mU(0SX_G(X*XgPAsYxlRU>&1PoLfSsS;t1h(`Dm`Ts;ww5jDFGnH#9Er&tGdt zU#o?zzcAj>*Hh@iUmWk;)u#Kk3S#(y@s7Se-Ss~>-p#AQ^R>dtkGxSj`j@Y@qpuZ) z{>U4pqkm<*qwA8=Yqr+;qvPGY8Y#V26aQo59sQMRz4mN1%R51@Fvq$=zb`AtL8di{ z0EkOfkgY3u6`%^qqU{pX_CNZ1W7KN?ZLQjhcHq%0W-LA6>9XpP z^-3M$|D#I!{I69=U(gMxq_tELRjkodn*b>A+q+1LdG+r;`(%QW*-F2}wSuV9_oMh% zR*zIF%8_ia_YS)E$GNLTOwrh{RuBP&BmLUX|N4;&giAMvJi;ObZ_^bAk~MHY__eZd zzEpWs@zhPaH~WzN7J9~qMs=*=r136((+8WAALOBj^|%klA7Nd;GTt-6H{A2AUTgOp zT}5%0hFeX4=6_&}sa$OblKSPr$AvX?UGbuBTql+8U*BA9M{o}cR(AyS^&hP~NqR87 za^?8Hq9dUTVp|Jn4gh1qrDBMs#~;pN2c5+-7*V%-cG zxJu2S?pF_2vg{=lfn?w+PC+Fc6#cM8HP5I59)Ry$<_qj#rMF{m`;JQCLLu;cMZQ<{ zmM64P)=b(asQ?3h_A&*Rs!8Q=f<74@d-)Av^T6q{=M=yXSOtve{@WF9QP z<(2oI+w{{)vdIQctJ)!(v-c=3+?yXSkmb-iJ z3GlJ2&F@KH)kh0Mo+o*b%C=RIQj?GAM_?sxt4;4W#@Dx^DRL>;EdftpuHra`0;PLt zG(;lUR2*UK2ENh4qzu$urR0`bx)~_Ni2w&zX{e zrq7wGl3gbnYj}pnxScaJHr|=f8LVav90qd6Os)Jy?W9;L0tqfY##Jj!1zfcXOlKt? zKuAvO5_h6x1_LM`v|oL^rX8oDApfs(@};H{x68jCTN_NarrO7Kb1KXb=RVP);DQ zIq5`{lW#Tmd`v0H0fix^)$VV6U$cv1 z{g!9z@2v+lX;eq)tEVsHDt*UOqq_52SCi5hZ)`QLnkhRPR??Vz>h-jf`jN^@&HE~1 z)Q9EbG|Uy5a`S)#N=iNbdzPuo&rGsX!adxEJOfE5xh@%>(hjoB`cOSY{{6ORPM^xeT3P1b|$)$)GD%zu?qaBmniB2c8<(ptaFP13d)z3xkt^xhozlbDurcT z_#QPXX~^wV@BWzmtQRP)Q%#(rGHO3b#JL=&&AfBX&^a=Tj#L3RontA-v^ua_HwT!Q z!f3tm)Ke=FXe+F?rlREWLr-c^iD`SmidW61Y*#5aar-zq4YQ}{*OkGE3Qlq@^1akN zK`kqs)|$n?kyTHj#-bWN(~L_SvuUD+m(c#RaD`dor$d{O0NsQ z(^jXM#oEa@kL3KLVvNnB9<&F1+W=i@Dg+99LtBL#wbp3>rJKfOTfCDS!H(0)#8uA> zIjGHO$YF0ZA*jAMI(hfj>kN~rsT=>g0zOJ#x3z`%b@k1@KBLNzGnqz@o^9WD02q;k z+6N%Aa12DAfvnds#qa|GS#JTzfQ@%3Mu*k#87Yrj_-|oVNyX~TcsII2yzy={^KK;V zN38yW(=3bUPtp;hWgOX|%+7|95tU>LE+(Bl|iej~i3znT$aH*5g zNd~sCW>92Q!!79{wg-xwuGepC`;bFnreMb!Kj{gT<;vfGp1D$8lO{BnR#qziof;JH zudN}~@OSbCayn^vF>fH}h=!lc8@T$>aCJ)iRJ`0IG>4*9E#;XPI^ZBy2Yy7i7d!9+ z`P;k$AIKZL1AqLHtc%`(|0{2x1OFym6*}OXob1T~z@F`7zpC^9eEjYIG;i>?|7zaA z{l6HlPW=SKd!?@7`F<(RzpP4;HELs$!Pi6zmG0n*W|Uc*57C{V95m3c+dLtk(TujR zz_#^CZ9Nq^A=NPJ=?gQmVlC;HIBE;|S2^zD_!W-3IbLb4 zvbB0WeU9TT9G~ZyaD0K|kmE}nM;t%TaWBW0Iqu{51&+6Je1+qFj$h)4&m?`7<1)vu za9rVdg|6Mk@p+C1IewJmA&y_<`-eGxf#dBQzs&In$FFic%JD-ye+S2palDh`M>*cb z@n<+5oZ$Io(n6UQ%dyqDvbIo`+ds~q3V@k8|EEgYZY z_*RY|<9NTZ6>V0XY7tsRM|&evOgL+dU?CO_o7!zBS=n-p^)KuR@BO%xfQibyaz?V6Ea z)2}n054R)zXI6?}XKM9&m%K3Vu5`2H@ovA`v|qR>eI>H>X3CVdj7 zD6PPy-U6)A_S*IBpe-g_+OF7qt|zjGi&|ooHL#YNfDDp5Vqlh+UMzl^Y)T%uJUo@C zzO!D=&*(mcw%OKSg&*~x|DsKaOOIv0&~Ex#D>+3zDJ3}^mrSrTlv<^$**&BS9-H zbUdg9S;w5&J~kLBZ_%6R6RA9 z%<&pwkx!@-c_3*CkOP3j zbb>kfDHog|g&f`?Q}(TcsYN&>vu8$wrNK|S)IE%9YnX+mXJ1POOF|BMU4Oxf`YUo(NBR4k6HGN^vI- zt|q5Ajqx83_&hG0#Wd**2dcEL@X`732Ag>wB^@n7-i8EN>e-+);01k!JGT#|*}}i; zmdQ8pN1>PycgZaJkeN^6V-}<-<-Y!WUE_{ml;^Zl0HX{|MRP0}98gstAVGykLtk8D zX?x*uOp7xV@@hyS{DFqgFPNaCz^y7?s9DkV@gp@%`9wjQo11&{WLA zJhC586&(&Fe#Z!t<}x#=dU%HLfM)cdr##kAQHCD&?(NvKVTvAdW(!v6gTixk3b{DCn<(=ft!*CC7Q6FUy#FdK?ZFUj{+5;a6D3C0h^$G z%o;&(G;1`#$wG48CFX1t z97bx{7o?s54--EEi~2&p6ainBo55hp-lBo=D#Hoz7NO>{n?@5lh$~o`%kT2U$~kb# zj2Opvj2n~HE>On53vPWnR)gjK)AYA^yZHtRQu0hL+qrv3cK6}(Xl^gvwlll!Ncpy< z(rvr4+m4oR+g-YCPj=fK<=bv4-Iipx-C4fvuF`G8?6za&+wLyiHp*^0UcT)_>9&2@ zZTFOKdsFGQz1eN|mT$YYbld*yw)@Jr9Vp$loZa^3@@*@n+iuHldrSGYx0Y@@nB8`N z`L;v(Z7E^?MfFD({7LND(a9t=jK$j8s%(pGepLtE9ifBGY~-#+SoneUCbpo9TlSrHXBpLg&3Md_nIX5sg?T|Ufk7A|GK{Pv5p=>h^+FqN|ycU_ik(b;4 zCAMa5rbn9ufZ-