From 934829c0526496d2ab754935ca845504a09ae8d8 Mon Sep 17 00:00:00 2001 From: Robert Habermeier <rphmeier@gmail.com> Date: Tue, 14 Aug 2018 18:59:32 +0200 Subject: [PATCH] get everything building --- substrate/CONTRIBUTING.md | 2 +- substrate/Cargo.lock | 303 ---- substrate/Cargo.toml | 44 +- substrate/Dockerfile | 38 - substrate/README.adoc | 212 +-- substrate/license_header.txt | 8 +- substrate/polkadot/api/Cargo.toml | 21 - substrate/polkadot/api/README.adoc | 5 - substrate/polkadot/api/src/full.rs | 262 ---- substrate/polkadot/api/src/lib.rs | 144 -- substrate/polkadot/api/src/light.rs | 107 -- .../polkadot/availability-store/Cargo.toml | 15 - .../polkadot/availability-store/src/lib.rs | 258 ---- substrate/polkadot/cli/Cargo.toml | 33 - substrate/polkadot/cli/src/chain_spec.rs | 57 - substrate/polkadot/cli/src/lib.rs | 119 -- substrate/polkadot/collator/Cargo.toml | 18 - substrate/polkadot/collator/README.adoc | 5 - substrate/polkadot/collator/src/lib.rs | 441 ------ substrate/polkadot/consensus/Cargo.toml | 30 - substrate/polkadot/consensus/README.adoc | 5 - substrate/polkadot/consensus/src/collation.rs | 169 --- .../consensus/src/dynamic_inclusion.rs | 134 -- substrate/polkadot/consensus/src/error.rs | 55 - .../polkadot/consensus/src/evaluation.rs | 133 -- substrate/polkadot/consensus/src/lib.rs | 857 ----------- .../polkadot/consensus/src/offline_tracker.rs | 137 -- substrate/polkadot/consensus/src/service.rs | 268 ---- .../consensus/src/shared_table/includable.rs | 137 -- .../consensus/src/shared_table/mod.rs | 702 --------- substrate/polkadot/executor/Cargo.toml | 9 - substrate/polkadot/executor/README.adoc | 5 - substrate/polkadot/executor/src/lib.rs | 23 - substrate/polkadot/network/Cargo.toml | 22 - substrate/polkadot/network/README.adoc | 5 - .../polkadot/network/src/collator_pool.rs | 320 ----- substrate/polkadot/network/src/consensus.rs | 342 ----- substrate/polkadot/network/src/lib.rs | 664 --------- .../polkadot/network/src/local_collations.rs | 199 --- substrate/polkadot/network/src/router.rs | 342 ----- substrate/polkadot/network/src/tests.rs | 277 ---- substrate/polkadot/parachain/Cargo.toml | 18 - substrate/polkadot/parachain/README.adoc | 5 - substrate/polkadot/parachain/src/lib.rs | 119 -- substrate/polkadot/parachain/src/wasm.rs | 165 --- substrate/polkadot/parachain/tests/adder.rs | 135 -- .../polkadot/parachain/tests/res/adder.wasm | Bin 10174 -> 0 bytes substrate/polkadot/primitives/Cargo.toml | 28 - substrate/polkadot/primitives/README.adoc | 5 - substrate/polkadot/primitives/src/lib.rs | 123 -- .../polkadot/primitives/src/parachain.rs | 207 --- substrate/polkadot/runtime/Cargo.toml | 57 - substrate/polkadot/runtime/README.adoc | 5 - .../polkadot/runtime/src/checked_block.rs | 118 -- substrate/polkadot/runtime/src/lib.rs | 408 ------ substrate/polkadot/runtime/src/parachains.rs | 380 ----- substrate/polkadot/runtime/src/utils.rs | 54 - substrate/polkadot/runtime/wasm/Cargo.lock | 1256 ----------------- substrate/polkadot/runtime/wasm/Cargo.toml | 56 - substrate/polkadot/runtime/wasm/build.sh | 8 - substrate/polkadot/runtime/wasm/src | 1 - .../release/polkadot_runtime.compact.wasm | Bin 328049 -> 0 bytes .../release/polkadot_runtime.wasm | Bin 328142 -> 0 bytes substrate/polkadot/service/Cargo.toml | 29 - substrate/polkadot/service/README.adoc | 5 - .../polkadot/service/res/krummelanke.json | 51 - substrate/polkadot/service/src/chain_spec.rs | 191 --- substrate/polkadot/service/src/lib.rs | 362 ----- substrate/polkadot/src/README.adoc | 5 - substrate/polkadot/src/main.rs | 77 - substrate/polkadot/statement-table/Cargo.toml | 10 - .../polkadot/statement-table/README.adoc | 5 - .../polkadot/statement-table/src/generic.rs | 1192 ---------------- substrate/polkadot/statement-table/src/lib.rs | 88 -- substrate/polkadot/test-parachains/.gitignore | 2 - substrate/polkadot/test-parachains/README.md | 5 - .../polkadot/test-parachains/adder/Cargo.toml | 10 - .../test-parachains/adder/collator/Cargo.toml | 15 - .../adder/collator/src/main.rs | 145 -- .../polkadot/test-parachains/adder/src/lib.rs | 79 -- .../polkadot/test-parachains/adder/src/src | 1 - .../test-parachains/adder/wasm/Cargo.toml | 20 - .../test-parachains/adder/wasm/src/lib.rs | 73 - substrate/polkadot/test-parachains/build.sh | 15 - .../polkadot/transaction-pool/Cargo.toml | 19 - .../polkadot/transaction-pool/README.adoc | 5 - .../polkadot/transaction-pool/src/error.rs | 73 - .../polkadot/transaction-pool/src/lib.rs | 742 ---------- 88 files changed, 11 insertions(+), 13283 deletions(-) delete mode 100644 substrate/Dockerfile delete mode 100644 substrate/polkadot/api/Cargo.toml delete mode 100644 substrate/polkadot/api/README.adoc delete mode 100644 substrate/polkadot/api/src/full.rs delete mode 100644 substrate/polkadot/api/src/lib.rs delete mode 100644 substrate/polkadot/api/src/light.rs delete mode 100644 substrate/polkadot/availability-store/Cargo.toml delete mode 100644 substrate/polkadot/availability-store/src/lib.rs delete mode 100644 substrate/polkadot/cli/Cargo.toml delete mode 100644 substrate/polkadot/cli/src/chain_spec.rs delete mode 100644 substrate/polkadot/cli/src/lib.rs delete mode 100644 substrate/polkadot/collator/Cargo.toml delete mode 100644 substrate/polkadot/collator/README.adoc delete mode 100644 substrate/polkadot/collator/src/lib.rs delete mode 100644 substrate/polkadot/consensus/Cargo.toml delete mode 100644 substrate/polkadot/consensus/README.adoc delete mode 100644 substrate/polkadot/consensus/src/collation.rs delete mode 100644 substrate/polkadot/consensus/src/dynamic_inclusion.rs delete mode 100644 substrate/polkadot/consensus/src/error.rs delete mode 100644 substrate/polkadot/consensus/src/evaluation.rs delete mode 100644 substrate/polkadot/consensus/src/lib.rs delete mode 100644 substrate/polkadot/consensus/src/offline_tracker.rs delete mode 100644 substrate/polkadot/consensus/src/service.rs delete mode 100644 substrate/polkadot/consensus/src/shared_table/includable.rs delete mode 100644 substrate/polkadot/consensus/src/shared_table/mod.rs delete mode 100644 substrate/polkadot/executor/Cargo.toml delete mode 100644 substrate/polkadot/executor/README.adoc delete mode 100644 substrate/polkadot/executor/src/lib.rs delete mode 100644 substrate/polkadot/network/Cargo.toml delete mode 100644 substrate/polkadot/network/README.adoc delete mode 100644 substrate/polkadot/network/src/collator_pool.rs delete mode 100644 substrate/polkadot/network/src/consensus.rs delete mode 100644 substrate/polkadot/network/src/lib.rs delete mode 100644 substrate/polkadot/network/src/local_collations.rs delete mode 100644 substrate/polkadot/network/src/router.rs delete mode 100644 substrate/polkadot/network/src/tests.rs delete mode 100644 substrate/polkadot/parachain/Cargo.toml delete mode 100644 substrate/polkadot/parachain/README.adoc delete mode 100644 substrate/polkadot/parachain/src/lib.rs delete mode 100644 substrate/polkadot/parachain/src/wasm.rs delete mode 100644 substrate/polkadot/parachain/tests/adder.rs delete mode 100644 substrate/polkadot/parachain/tests/res/adder.wasm delete mode 100644 substrate/polkadot/primitives/Cargo.toml delete mode 100644 substrate/polkadot/primitives/README.adoc delete mode 100644 substrate/polkadot/primitives/src/lib.rs delete mode 100644 substrate/polkadot/primitives/src/parachain.rs delete mode 100644 substrate/polkadot/runtime/Cargo.toml delete mode 100644 substrate/polkadot/runtime/README.adoc delete mode 100644 substrate/polkadot/runtime/src/checked_block.rs delete mode 100644 substrate/polkadot/runtime/src/lib.rs delete mode 100644 substrate/polkadot/runtime/src/parachains.rs delete mode 100644 substrate/polkadot/runtime/src/utils.rs delete mode 100644 substrate/polkadot/runtime/wasm/Cargo.lock delete mode 100644 substrate/polkadot/runtime/wasm/Cargo.toml delete mode 100755 substrate/polkadot/runtime/wasm/build.sh delete mode 120000 substrate/polkadot/runtime/wasm/src delete mode 100644 substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm delete mode 100755 substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm delete mode 100644 substrate/polkadot/service/Cargo.toml delete mode 100644 substrate/polkadot/service/README.adoc delete mode 100644 substrate/polkadot/service/res/krummelanke.json delete mode 100644 substrate/polkadot/service/src/chain_spec.rs delete mode 100644 substrate/polkadot/service/src/lib.rs delete mode 100644 substrate/polkadot/src/README.adoc delete mode 100644 substrate/polkadot/src/main.rs delete mode 100644 substrate/polkadot/statement-table/Cargo.toml delete mode 100644 substrate/polkadot/statement-table/README.adoc delete mode 100644 substrate/polkadot/statement-table/src/generic.rs delete mode 100644 substrate/polkadot/statement-table/src/lib.rs delete mode 100644 substrate/polkadot/test-parachains/.gitignore delete mode 100644 substrate/polkadot/test-parachains/README.md delete mode 100644 substrate/polkadot/test-parachains/adder/Cargo.toml delete mode 100644 substrate/polkadot/test-parachains/adder/collator/Cargo.toml delete mode 100644 substrate/polkadot/test-parachains/adder/collator/src/main.rs delete mode 100644 substrate/polkadot/test-parachains/adder/src/lib.rs delete mode 120000 substrate/polkadot/test-parachains/adder/src/src delete mode 100644 substrate/polkadot/test-parachains/adder/wasm/Cargo.toml delete mode 100644 substrate/polkadot/test-parachains/adder/wasm/src/lib.rs delete mode 100755 substrate/polkadot/test-parachains/build.sh delete mode 100644 substrate/polkadot/transaction-pool/Cargo.toml delete mode 100644 substrate/polkadot/transaction-pool/README.adoc delete mode 100644 substrate/polkadot/transaction-pool/src/error.rs delete mode 100644 substrate/polkadot/transaction-pool/src/lib.rs diff --git a/substrate/CONTRIBUTING.md b/substrate/CONTRIBUTING.md index d6b64ac752f..4f89f5d5391 100644 --- a/substrate/CONTRIBUTING.md +++ b/substrate/CONTRIBUTING.md @@ -1,4 +1,4 @@ -## `Polkadot` projects is a **OPENISH Open Source Project** +## `Substrate` projects is a **OPENISH Open Source Project** ----------------------------------------- ## What? diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 1adf135f0e5..feca17eb64a 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -1,27 +1,3 @@ -[[package]] -name = "adder" -version = "0.1.0" -dependencies = [ - "polkadot-parachain 0.1.0", - "substrate-codec-derive 0.1.0", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "adder-collator" -version = "0.1.0" -dependencies = [ - "adder 0.1.0", - "ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)", - "ed25519 0.1.0", - "exit-future 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "polkadot-collator 0.1.0", - "polkadot-parachain 0.1.0", - "polkadot-primitives 0.1.0", -] - [[package]] name = "aho-corasick" version = "0.6.4" @@ -184,11 +160,6 @@ dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "bitflags" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "bitflags" version = "0.9.1" @@ -1807,269 +1778,6 @@ dependencies = [ "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "polkadot" -version = "0.3.0" -dependencies = [ - "ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "polkadot-cli 0.3.0", - "vergen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "polkadot-api" -version = "0.1.0" -dependencies = [ - "error-chain 0.12.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", - "substrate-executor 0.1.0", - "substrate-keyring 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-executive 0.1.0", - "substrate-runtime-io 0.1.0", - "substrate-runtime-primitives 0.1.0", - "substrate-state-machine 0.1.0", -] - -[[package]] -name = "polkadot-availability-store" -version = "0.1.0" -dependencies = [ - "kvdb 0.1.0 (git+https://github.com/paritytech/parity.git)", - "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity.git)", - "kvdb-rocksdb 0.1.0 (git+https://github.com/paritytech/parity.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)", - "polkadot-primitives 0.1.0", - "substrate-codec 0.1.0", - "substrate-primitives 0.1.0", -] - -[[package]] -name = "polkadot-cli" -version = "0.3.0" -dependencies = [ - "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "exit-future 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "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-primitives 0.1.0", - "polkadot-runtime 0.1.0", - "polkadot-service 0.3.0", - "polkadot-transaction-pool 0.1.0", - "slog 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-cli 0.3.0", - "substrate-client 0.1.0", - "substrate-codec 0.1.0", - "substrate-extrinsic-pool 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-primitives 0.1.0", - "substrate-service 0.3.0", - "substrate-state-machine 0.1.0", - "substrate-telemetry 0.3.0", - "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "polkadot-collator" -version = "0.1.0" -dependencies = [ - "ed25519 0.1.0", - "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)", - "polkadot-api 0.1.0", - "polkadot-cli 0.3.0", - "polkadot-primitives 0.1.0", - "polkadot-runtime 0.1.0", - "substrate-client 0.1.0", - "substrate-codec 0.1.0", - "substrate-primitives 0.1.0", - "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "polkadot-consensus" -version = "0.1.0" -dependencies = [ - "ed25519 0.1.0", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "exit-future 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "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)", - "polkadot-api 0.1.0", - "polkadot-availability-store 0.1.0", - "polkadot-parachain 0.1.0", - "polkadot-primitives 0.1.0", - "polkadot-runtime 0.1.0", - "polkadot-statement-table 0.1.0", - "polkadot-transaction-pool 0.1.0", - "rhododendron 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-bft 0.1.0", - "substrate-client 0.1.0", - "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", - "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "polkadot-executor" -version = "0.1.0" -dependencies = [ - "polkadot-runtime 0.1.0", - "substrate-executor 0.1.0", -] - -[[package]] -name = "polkadot-network" -version = "0.1.0" -dependencies = [ - "ed25519 0.1.0", - "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)", - "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "polkadot-api 0.1.0", - "polkadot-availability-store 0.1.0", - "polkadot-consensus 0.1.0", - "polkadot-primitives 0.1.0", - "rhododendron 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-bft 0.1.0", - "substrate-codec 0.1.0", - "substrate-codec-derive 0.1.0", - "substrate-network 0.1.0", - "substrate-primitives 0.1.0", - "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "polkadot-parachain" -version = "0.1.0" -dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-codec 0.1.0", - "substrate-codec-derive 0.1.0", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "polkadot-primitives" -version = "0.1.0" -dependencies = [ - "pretty_assertions 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-codec 0.1.0", - "substrate-codec-derive 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-primitives 0.1.0", - "substrate-runtime-std 0.1.0", - "substrate-serializer 0.1.0", -] - -[[package]] -name = "polkadot-runtime" -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 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.70 (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-consensus 0.1.0", - "substrate-runtime-council 0.1.0", - "substrate-runtime-democracy 0.1.0", - "substrate-runtime-executive 0.1.0", - "substrate-runtime-io 0.1.0", - "substrate-runtime-primitives 0.1.0", - "substrate-runtime-session 0.1.0", - "substrate-runtime-staking 0.1.0", - "substrate-runtime-std 0.1.0", - "substrate-runtime-support 0.1.0", - "substrate-runtime-system 0.1.0", - "substrate-runtime-timestamp 0.1.0", - "substrate-runtime-version 0.1.0", - "substrate-serializer 0.1.0", -] - -[[package]] -name = "polkadot-service" -version = "0.3.0" -dependencies = [ - "ed25519 0.1.0", - "error-chain 0.12.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)", - "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-api 0.1.0", - "polkadot-availability-store 0.1.0", - "polkadot-consensus 0.1.0", - "polkadot-executor 0.1.0", - "polkadot-network 0.1.0", - "polkadot-primitives 0.1.0", - "polkadot-runtime 0.1.0", - "polkadot-transaction-pool 0.1.0", - "slog 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-client 0.1.0", - "substrate-codec 0.1.0", - "substrate-network 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-io 0.1.0", - "substrate-service 0.3.0", - "substrate-telemetry 0.3.0", - "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "polkadot-statement-table" -version = "0.1.0" -dependencies = [ - "polkadot-primitives 0.1.0", - "substrate-codec 0.1.0", - "substrate-codec-derive 0.1.0", - "substrate-primitives 0.1.0", -] - -[[package]] -name = "polkadot-transaction-pool" -version = "0.1.0" -dependencies = [ - "ed25519 0.1.0", - "error-chain 0.12.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.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "polkadot-api 0.1.0", - "polkadot-primitives 0.1.0", - "polkadot-runtime 0.1.0", - "substrate-client 0.1.0", - "substrate-codec 0.1.0", - "substrate-extrinsic-pool 0.1.0", - "substrate-keyring 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-primitives 0.1.0", -] - [[package]] name = "pretty_assertions" version = "0.4.1" @@ -3812,15 +3520,6 @@ name = "vec_map" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "vergen" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "version_check" version = "0.1.3" @@ -3992,7 +3691,6 @@ dependencies = [ "checksum base64 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5032d51da2741729bfdaeb2664d9b8c6d9fd1e2b90715c660b6def36628499c2" "checksum base64 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9263aa6a38da271eec5c91a83ce1e800f093c8535788d403d626d8d5c3f8f007" "checksum bigint 4.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da1dde4308822ffaa13665757273a1b787481212f3f9b1c470a864b179a01f1b" -"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" "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" @@ -4275,7 +3973,6 @@ dependencies = [ "checksum varint 0.1.0 (git+https://github.com/tomaka/libp2p-rs?branch=polkadot-2)" = "<none>" "checksum vcpkg 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7ed0f6789c8a85ca41bbc1c9d175422116a9869bd1cf31bb08e1493ecce60380" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" -"checksum vergen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c3365f36c57e5df714a34be40902b27a992eeddb9996eca52d0584611cf885d" "checksum version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6b772017e347561807c1aa192438c5fd74242a670a6cffacc40f2defd1dc069d" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "182ae543249ccf2705f324d233891c1176fca142e137b55ba43d9dbfe93f18a2" diff --git a/substrate/Cargo.toml b/substrate/Cargo.toml index dbe5fde1a9e..1757e91ecab 100644 --- a/substrate/Cargo.toml +++ b/substrate/Cargo.toml @@ -1,41 +1,5 @@ -[[bin]] -name = "polkadot" -path = "polkadot/src/main.rs" - -[package] -name = "polkadot" -version = "0.3.0" -authors = ["Parity Technologies <admin@parity.io>"] -build = "build.rs" - -[dependencies] -error-chain = "0.12" -polkadot-cli = { path = "polkadot/cli" } -futures = "0.1" -ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" } - -[build-dependencies] -vergen = "0.1" - [workspace] members = [ - "polkadot/api", - "polkadot/availability-store", - "polkadot/cli", - "polkadot/collator", - "polkadot/consensus", - "polkadot/executor", - "polkadot/network", - "polkadot/primitives", - "polkadot/runtime", - "polkadot/service", - "polkadot/statement-table", - "polkadot/transaction-pool", - "polkadot/service", - - "polkadot/test-parachains/adder", - "polkadot/test-parachains/adder/collator", - "substrate/bft", "substrate/cli", "substrate/client", @@ -80,8 +44,6 @@ members = [ "subkey", ] exclude = [ - "polkadot/runtime/wasm", - "polkadot/test-parachains/adder/wasm", "demo/runtime/wasm", "substrate/executor/wasm", "substrate/pwasm-alloc", @@ -90,10 +52,10 @@ exclude = [ ] [badges] -travis-ci = { repository = "paritytech/polkadot", branch = "master" } +travis-ci = { repository = "paritytech/paritysubstrate", branch = "master" } maintenance = { status = "actively-developed" } -is-it-maintained-issue-resolution = { repository = "paritytech/polkadot" } -is-it-maintained-open-issues = { repository = "paritytech/polkadot" } +is-it-maintained-issue-resolution = { repository = "paritytech/paritysubstrate" } +is-it-maintained-open-issues = { repository = "paritytech/paritysubstrate" } [profile.release] # Substrate runtime requires unwinding. diff --git a/substrate/Dockerfile b/substrate/Dockerfile deleted file mode 100644 index e07e647ce41..00000000000 --- a/substrate/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -FROM phusion/baseimage:0.10.1 as builder -LABEL maintainer "chevdor@gmail.com" -LABEL description="This is the build stage for Polkadot. Here we create the binary." - -ARG PROFILE=release -WORKDIR /polkadot - -COPY . /polkadot - -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y cmake pkg-config libssl-dev git - -RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ - export PATH=$PATH:$HOME/.cargo/bin && \ - cargo build --$PROFILE - -# ===== SECOND STAGE ====== - -FROM phusion/baseimage:0.10.0 -LABEL maintainer "chevdor@gmail.com" -LABEL description="This is the 2nd stage: a very small image where we copy the Polkadot binary." -ARG PROFILE=release -COPY --from=builder /polkadot/target/$PROFILE/polkadot /usr/local/bin - -RUN mv /usr/share/ca* /tmp && \ - rm -rf /usr/share/* && \ - mv /tmp/ca-certificates /usr/share/ && \ - rm -rf /usr/lib/python* && \ - mkdir -p /root/.local/share/Polkadot && \ - ln -s /root/.local/share/Polkadot /data - -RUN rm -rf /usr/bin /usr/sbin - -EXPOSE 30333 9933 9944 -VOLUME ["/data"] - -CMD ["/usr/local/bin/polkadot"] diff --git a/substrate/README.adoc b/substrate/README.adoc index fca6168aa5f..7c8be50e964 100644 --- a/substrate/README.adoc +++ b/substrate/README.adoc @@ -1,210 +1,4 @@ -= Polkadot -:Author: Polkadot developers -:Revision: 0.2.0 -:toc: -:sectnums: +# Substrate -Implementation of a https://polkadot.network node in Rust. - - -== To play - -If you'd like to play with Polkadot, you'll need to install a client like this -one. First, get Rust (1.26.1 or later) and the support software if you don't already have it: - -[source, shell] ----- -curl https://sh.rustup.rs -sSf | sh -sudo apt install make clang pkg-config libssl-dev ----- - -Then, install Polkadot PoC-2: - -[source, shell] -cargo install --git https://github.com/paritytech/polkadot.git --branch v0.2 polkadot - -You'll now have a `polkadot` binary installed to your `PATH`. You can drop the -`--branch v0.2` or run `cargo install --git https://github.com/paritytech/polkadot.git polkadot` -to get the very latest version of Polkadot, but these instructions might not work in that case. - -If you want a specific version of polkadot, say `0.2.2`, you may run `cargo install --git https://github.com/paritytech/polkadot.git --tag v0.2.2 polkadot`. - -=== Krumme Lanke Testnet - -You will connect to the global Krumme Lanke testnet by default. To do this, just use: - -[source, shell] -polkadot - -If you want to do anything on it (not that there's much to do), then you'll need -to get some Krumme Lanke DOTs. Ask in the Polkadot watercooler. - -=== Development - -You can run a simple single-node development "network" on your machine by -running in a terminal: - -[source, shell] -polkadot --dev - -You can muck around by cloning and building the http://github.com/paritytech/polka-ui and http://github.com/paritytech/polkadot-ui or just heading to https://polkadot.js.org/apps. - - -== Local Two-node Testnet - -If you want to see the multi-node consensus algorithm in action locally, then -you can create a local testnet. You'll need two terminals open. In one, run: - -[source, shell] -polkadot --chain=local --validator --key Alice -d /tmp/alice - -and in the other, run: - -[source, shell] -polkadot --chain=local --validator --key Bob -d /tmp/bob --port 30334 --bootnodes '/ip4/127.0.0.1/tcp/30333/p2p/ALICE_BOOTNODE_ID_HERE' - -Ensure you replace `ALICE_BOOTNODE_ID_HERE` with the node ID from the output of -the first terminal. - - -== Hacking on Polkadot - -If you'd actually like hack on Polkadot, you can just grab the source code and -build it. Ensure you have Rust and the support software installed: - -[source, shell] ----- -curl https://sh.rustup.rs -sSf | sh -rustup update nightly -rustup target add wasm32-unknown-unknown --toolchain nightly -rustup update stable -cargo install --git https://github.com/alexcrichton/wasm-gc -sudo apt install cmake pkg-config libssl-dev git ----- - -Then, grab the Polkadot source code: - -[source, shell] ----- -git clone https://github.com/paritytech/polkadot.git -cd polkadot ----- - -Then build the code: - -[source, shell] ----- -./scripts/build.sh # Builds the WebAssembly binaries -cargo build # Builds all native code ----- - -You can run the tests if you like: - -[source, shell] -cargo test --all - -You can start a development chain with: - -[source, shell] -cargo run -- --dev - - -== Using Docker - -=== The easiest way - -The easiest/faster option is to use the latest image. - - -.First run -Let´s first check the version we have. The first time you run this command, the polkadot docker image will be downloaded. This takes a bit of time and bandwidth, be patient: - -[source, shell] -docker run --rm -it chevdor/polkadot:latest polkadot --version - - -.Polkadot arguments -You can also pass any argument/flag that polkadot supports: - -[source, shell] -docker run --rm -it chevdor/polkadot:latest polkadot --name "PolkaDocker" - - -.Run as deamon -Once you are done experimenting and picking the best node name :) you can start polkadot as daemon, exposes the polkadot ports and mount a volume that will keep your blockchain data locally: - -[source, shell] -docker run -d -p 30333:30333 -p 9933:9933 -p 9944:9944 -v /my/local/folder:/data chevdor/polkadot:latest polkadot - -.Docker image update -If you have an image such as `latest` locally, docker will *not* bother downloading the very latest that may be available. -To update: - -- stop and delete your containers (`docker stop ...` `docker rm ...`) -- delete your previous image (`docker rmi chevdor/polkadot:latest`) -- run as daemon again, the very latest image will be downloaded again - -=== Build your own image - -To get up and running with the smallest footprint on your system, you may use the Polkadot Docker image. -You can either build it yourself (it takes a while...): - -[source, shell] ----- -./docker/build.sh ----- - -=== Reporting issues - -If you run into issues with polkadot when using docker, please run the following command -(replace the tag with the appropriate one if you do not use latest): - -[source, shell] -docker run --rm -it chevdor/polkadot:latest polkadot --version - -This will show you the polkadot version as well as the git commit ref that was used to build your container. -Just paste that in the issue you create. - - -== Shell completion - -The Polkadot cli command supports shell auto-completion. For this to work, you will need to run the completion script matching you build and system. - -Assuming you built a release version using `cargo build --release` and use `bash` run the following: - -[source, shell] -source target/release/completion-scripts/polkadot.bash - -You can find completion scripts for: -- bash -- fish -- zsh -- elvish -- powershell - -To make this change persistent, you can proceed as follow: - -=== First install - -[source, shell] ----- -COMPL_DIR=$HOME/.completion -mkdir -p $COMPL_DIR -cp -f target/release/completion-scripts/polkadot.bash $COMPL_DIR/ -echo "source $COMPL_DIR/polkadot.bash" >> $HOME/.bash_profile -source $HOME/.bash_profile ----- - -=== Update - -When you build a new version of Polkadot, the following will ensure you auto-completion script matches the current binary: - -[source, shell] ----- -COMPL_DIR=$HOME/.completion -mkdir -p $COMPL_DIR -cp -f target/release/completion-scripts/polkadot.bash $COMPL_DIR/ -source $HOME/.bash_profile ----- - -include::doc/packages.adoc[] +Framework for blockchain innovators. +More to come here. diff --git a/substrate/license_header.txt b/substrate/license_header.txt index aa68deee6db..2ec89c3d970 100644 --- a/substrate/license_header.txt +++ b/substrate/license_header.txt @@ -1,15 +1,15 @@ // Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. +// This file is part of Substrate. -// Polkadot is free software: you can redistribute it and/or modify +// 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. -// Polkadot is distributed in the hope that it will be useful, +// 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 Polkadot. If not, see <http://www.gnu.org/licenses/>. \ No newline at end of file +// along with Substrate. If not, see <http://www.gnu.org/licenses/>. diff --git a/substrate/polkadot/api/Cargo.toml b/substrate/polkadot/api/Cargo.toml deleted file mode 100644 index 7b5015b9913..00000000000 --- a/substrate/polkadot/api/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "polkadot-api" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] - -[dependencies] -error-chain = "0.12" -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" } -substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } -substrate-client = { path = "../../substrate/client" } -substrate-primitives = { path = "../../substrate/primitives" } -substrate-executor = { path = "../../substrate/executor" } -substrate-state-machine = { path = "../../substrate/state-machine" } - -[dev-dependencies] -substrate-keyring = { path = "../../substrate/keyring" } diff --git a/substrate/polkadot/api/README.adoc b/substrate/polkadot/api/README.adoc deleted file mode 100644 index 8f382d4f439..00000000000 --- a/substrate/polkadot/api/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot API - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/api/src/full.rs b/substrate/polkadot/api/src/full.rs deleted file mode 100644 index 5358e1bd3a3..00000000000 --- a/substrate/polkadot/api/src/full.rs +++ /dev/null @@ -1,262 +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 <http://www.gnu.org/licenses/>. - -//! Strongly typed API for full Polkadot client. - -use client::backend::LocalBackend; -use client::block_builder::BlockBuilder as ClientBlockBuilder; -use client::{Client, LocalCallExecutor}; -use polkadot_executor::Executor as LocalDispatch; -use substrate_executor::NativeExecutor; -use state_machine; - -use runtime::Address; -use runtime_primitives::traits::AuxLookup; -use primitives::{ - AccountId, Block, Header, BlockId, Hash, Index, InherentData, - SessionKey, Timestamp, UncheckedExtrinsic, -}; -use primitives::parachain::{DutyRoster, Id as ParaId}; - -use {BlockBuilder, PolkadotApi, LocalPolkadotApi, ErrorKind, Error, Result}; - -// set up the necessary scaffolding to execute a set of calls to the runtime. -// this creates a new block on top of the given ID and initialises it. -macro_rules! with_runtime { - ($client: ident, $at: expr, $exec: expr) => {{ - let parent = $at; - let header = Header { - 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| { - let mut changes = Default::default(); - let mut ext = state_machine::Ext::new(&mut changes, &state); - - ::substrate_executor::with_native_environment(&mut ext, || { - ::runtime::Executive::initialise_block(&header); - ($exec)() - }).map_err(Into::into) - }) - }} -} - -impl<B: LocalBackend<Block>> BlockBuilder for ClientBlockBuilder<B, LocalCallExecutor<B, NativeExecutor<LocalDispatch>>, Block> { - 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<Block> { - ClientBlockBuilder::bake(self).map_err(Into::into) - } -} - -impl<B: LocalBackend<Block>> PolkadotApi for Client<B, LocalCallExecutor<B, NativeExecutor<LocalDispatch>>, Block> { - type BlockBuilder = ClientBlockBuilder<B, LocalCallExecutor<B, NativeExecutor<LocalDispatch>>, Block>; - - fn session_keys(&self, at: &BlockId) -> Result<Vec<SessionKey>> { - with_runtime!(self, at, ::runtime::Consensus::authorities) - } - - fn validators(&self, at: &BlockId) -> Result<Vec<AccountId>> { - with_runtime!(self, at, ::runtime::Session::validators) - } - - fn random_seed(&self, at: &BlockId) -> Result<Hash> { - with_runtime!(self, at, ::runtime::System::random_seed) - } - - fn duty_roster(&self, at: &BlockId) -> Result<DutyRoster> { - with_runtime!(self, at, ::runtime::Parachains::calculate_duty_roster) - } - - fn timestamp(&self, at: &BlockId) -> Result<Timestamp> { - with_runtime!(self, at, ::runtime::Timestamp::get) - } - - fn evaluate_block(&self, at: &BlockId, block: Block) -> Result<bool> { - use substrate_executor::error::ErrorKind as ExecErrorKind; - use codec::{Decode, Encode}; - use runtime::Block as RuntimeBlock; - - 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() { - &ErrorKind::Executor(ExecErrorKind::Runtime) => Ok(false), - _ => Err(err) - } - } - } - - fn index(&self, at: &BlockId, account: AccountId) -> Result<Index> { - with_runtime!(self, at, || ::runtime::System::account_nonce(account)) - } - - fn lookup(&self, at: &BlockId, address: Address) -> Result<Option<AccountId>> { - with_runtime!(self, at, || <::runtime::Staking as AuxLookup>::lookup(address).ok()) - } - - fn active_parachains(&self, at: &BlockId) -> Result<Vec<ParaId>> { - with_runtime!(self, at, ::runtime::Parachains::active_parachains) - } - - fn parachain_code(&self, at: &BlockId, parachain: ParaId) -> Result<Option<Vec<u8>>> { - with_runtime!(self, at, || ::runtime::Parachains::parachain_code(parachain)) - } - - fn parachain_head(&self, at: &BlockId, parachain: ParaId) -> Result<Option<Vec<u8>>> { - with_runtime!(self, at, || ::runtime::Parachains::parachain_head(parachain)) - } - - fn build_block(&self, at: &BlockId, inherent_data: InherentData) -> Result<Self::BlockBuilder> { - let mut block_builder = self.new_block_at(at)?; - for inherent in self.inherent_extrinsics(at, inherent_data)? { - block_builder.push(inherent)?; - } - - Ok(block_builder) - } - - fn inherent_extrinsics(&self, at: &BlockId, inherent_data: InherentData) -> Result<Vec<UncheckedExtrinsic>> { - use codec::{Encode, Decode}; - - with_runtime!(self, at, || { - let extrinsics = ::runtime::inherent_extrinsics(inherent_data); - extrinsics.into_iter() - .map(|x| x.encode()) // get encoded representation - .map(|x| Decode::decode(&mut &x[..])) // get byte-vec equivalent to extrinsic - .map(|x| x.expect("UncheckedExtrinsic has encoded representation equivalent to Vec<u8>; qed")) - .collect() - }) - } -} - -impl<B: LocalBackend<Block>> LocalPolkadotApi for Client<B, LocalCallExecutor<B, NativeExecutor<LocalDispatch>>, Block> -{} - -#[cfg(test)] -mod tests { - use super::*; - use keyring::Keyring; - use client::LocalCallExecutor; - use client::in_mem::Backend as InMemory; - use substrate_executor::NativeExecutionDispatch; - use runtime::{GenesisConfig, ConsensusConfig, SessionConfig}; - - fn validators() -> Vec<AccountId> { - vec![ - Keyring::One.to_raw_public().into(), - Keyring::Two.to_raw_public().into(), - ] - } - - fn session_keys() -> Vec<SessionKey> { - vec![ - Keyring::One.to_raw_public().into(), - Keyring::Two.to_raw_public().into(), - ] - } - - fn client() -> Client<InMemory<Block>, LocalCallExecutor<InMemory<Block>, NativeExecutor<LocalDispatch>>, Block> { - let genesis_config = GenesisConfig { - consensus: Some(ConsensusConfig { - code: LocalDispatch::native_equivalent().to_vec(), - authorities: session_keys(), - }), - system: None, - session: Some(SessionConfig { - validators: validators(), - session_length: 100, - broken_percent_late: 100, - }), - council: Some(Default::default()), - democracy: Some(Default::default()), - parachains: Some(Default::default()), - staking: Some(Default::default()), - timestamp: Some(Default::default()), - }; - - ::client::new_in_mem(LocalDispatch::with_heap_pages(8), genesis_config).unwrap() - } - - #[test] - fn gets_session_and_validator_keys() { - let client = client(); - let id = BlockId::number(0); - assert_eq!(client.session_keys(&id).unwrap(), session_keys()); - assert_eq!(client.validators(&id).unwrap(), validators()); - } - - #[test] - fn build_block_implicit_succeeds() { - let client = client(); - - let id = BlockId::number(0); - let block_builder = client.build_block(&id, InherentData { - timestamp: 1_000_000, - parachain_heads: Vec::new(), - offline_indices: 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(); - - let id = BlockId::number(0); - let inherent = client.inherent_extrinsics(&id, InherentData { - timestamp: 1_000_000, - parachain_heads: Vec::new(), - offline_indices: Vec::new(), - }).unwrap(); - - let mut block_builder = client.new_block_at(&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()); - } - - #[test] - fn gets_random_seed_with_genesis() { - let client = client(); - - let id = BlockId::number(0); - assert!(client.random_seed(&id).is_ok()); - } -} diff --git a/substrate/polkadot/api/src/lib.rs b/substrate/polkadot/api/src/lib.rs deleted file mode 100644 index 8c1e4b1de83..00000000000 --- a/substrate/polkadot/api/src/lib.rs +++ /dev/null @@ -1,144 +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 <http://www.gnu.org/licenses/>. - -//! Strongly typed API for Polkadot based around the locally-compiled native -//! 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; -extern crate substrate_client as client; -extern crate substrate_executor as substrate_executor; -extern crate substrate_runtime_executive; -extern crate substrate_primitives; -extern crate substrate_runtime_primitives as runtime_primitives; -extern crate substrate_state_machine as state_machine; - -#[macro_use] -extern crate error_chain; - -#[cfg(test)] -extern crate substrate_keyring as keyring; - -pub mod full; -pub mod light; - -use primitives::{ - AccountId, Block, BlockId, Hash, Index, SessionKey, Timestamp, - UncheckedExtrinsic, InherentData, -}; -use runtime::Address; -use primitives::parachain::{DutyRoster, Id as ParaId}; - -error_chain! { - errors { - /// Unknown runtime code. - UnknownRuntime { - description("Unknown runtime code") - display("Unknown runtime code") - } - /// Unknown block ID. - UnknownBlock(b: String) { - description("Unknown block") - display("Unknown block {}", b) - } - /// Some other error. - // TODO: allow to be specified as associated type of PolkadotApi - Other(e: Box<::std::error::Error + Send>) { - description("Other error") - display("Other error: {}", e.description()) - } - } - - links { - Executor(substrate_executor::error::Error, substrate_executor::error::ErrorKind); - } -} - -impl From<client::error::Error> for Error { - fn from(e: client::error::Error) -> Error { - match e { - client::error::Error(client::error::ErrorKind::UnknownBlock(b), _) => Error::from_kind(ErrorKind::UnknownBlock(b)), - other => Error::from_kind(ErrorKind::Other(Box::new(other) as Box<_>)), - } - } -} - -/// 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<Block>; -} - -/// Trait encapsulating the Polkadot API. -/// -/// All calls should fail when the exact runtime is unknown. -pub trait PolkadotApi { - /// The block builder for this API type. - type BlockBuilder: BlockBuilder; - - /// Get session keys at a given block. - fn session_keys(&self, at: &BlockId) -> Result<Vec<SessionKey>>; - - /// Get validators at a given block. - fn validators(&self, at: &BlockId) -> Result<Vec<AccountId>>; - - /// Get the value of the randomness beacon at a given block. - fn random_seed(&self, at: &BlockId) -> Result<Hash>; - - /// Get the authority duty roster at a block. - fn duty_roster(&self, at: &BlockId) -> Result<DutyRoster>; - - /// Get the timestamp registered at a block. - fn timestamp(&self, at: &BlockId) -> Result<Timestamp>; - - /// Get the nonce (né index) of an account at a block. - fn index(&self, at: &BlockId, account: AccountId) -> Result<Index>; - - /// Get the account id of an address at a block. - fn lookup(&self, at: &BlockId, address: Address) -> Result<Option<AccountId>>; - - /// Get the active parachains at a block. - fn active_parachains(&self, at: &BlockId) -> Result<Vec<ParaId>>; - - /// Get the validation code of a parachain at a block. If the parachain is active, this will always return `Some`. - fn parachain_code(&self, at: &BlockId, parachain: ParaId) -> Result<Option<Vec<u8>>>; - - /// Get the chain head of a parachain. If the parachain is active, this will always return `Some`. - fn parachain_head(&self, at: &BlockId, parachain: ParaId) -> Result<Option<Vec<u8>>>; - - /// 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: &BlockId, block: Block) -> Result<bool>; - - /// Build a block on top of the given, with inherent extrinsics pre-pushed. - fn build_block(&self, at: &BlockId, inherent_data: InherentData) -> Result<Self::BlockBuilder>; - - /// 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: &BlockId, inherent_data: InherentData) -> Result<Vec<UncheckedExtrinsic>>; -} - -/// Mark for all Polkadot API implementations, that are making use of state data, stored locally. -pub trait LocalPolkadotApi: PolkadotApi {} - -/// Mark for all Polkadot API implementations, that are fetching required state data from remote nodes. -pub trait RemotePolkadotApi: PolkadotApi {} diff --git a/substrate/polkadot/api/src/light.rs b/substrate/polkadot/api/src/light.rs deleted file mode 100644 index a281cde6e3a..00000000000 --- a/substrate/polkadot/api/src/light.rs +++ /dev/null @@ -1,107 +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 <http://www.gnu.org/licenses/>. - -//! Strongly typed API for light Polkadot client. - -use std::sync::Arc; -use client::backend::{Backend, RemoteBackend}; -use client::{Client, CallExecutor}; -use codec::Decode; -use primitives::{ - AccountId, Block, BlockId, Hash, Index, InherentData, - SessionKey, Timestamp, UncheckedExtrinsic, -}; -use runtime::Address; -use primitives::parachain::{DutyRoster, Id as ParaId}; -use {PolkadotApi, BlockBuilder, RemotePolkadotApi, 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<Block> { - Err(ErrorKind::UnknownRuntime.into()) - } -} - -/// Remote polkadot API implementation. -pub struct RemotePolkadotApiWrapper<B: Backend<Block>, E: CallExecutor<Block>>(pub Arc<Client<B, E, Block>>); - -impl<B: Backend<Block>, E: CallExecutor<Block>> PolkadotApi for RemotePolkadotApiWrapper<B, E> { - type BlockBuilder = LightBlockBuilder; - - fn session_keys(&self, at: &BlockId) -> Result<Vec<SessionKey>> { - self.0.executor().call(at, "authorities", &[]) - .and_then(|r| Vec::<SessionKey>::decode(&mut &r.return_data[..]) - .ok_or("error decoding session keys".into())) - .map_err(Into::into) - } - - fn validators(&self, _at: &BlockId) -> Result<Vec<AccountId>> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn random_seed(&self, _at: &BlockId) -> Result<Hash> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn duty_roster(&self, _at: &BlockId) -> Result<DutyRoster> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn timestamp(&self, _at: &BlockId) -> Result<Timestamp> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn evaluate_block(&self, _at: &BlockId, _block: Block) -> Result<bool> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn index(&self, _at: &BlockId, _account: AccountId) -> Result<Index> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn lookup(&self, _at: &BlockId, _address: Address) -> Result<Option<AccountId>> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn active_parachains(&self, _at: &BlockId) -> Result<Vec<ParaId>> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn parachain_code(&self, _at: &BlockId, _parachain: ParaId) -> Result<Option<Vec<u8>>> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn parachain_head(&self, _at: &BlockId, _parachain: ParaId) -> Result<Option<Vec<u8>>> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn build_block(&self, _at: &BlockId, _inherent: InherentData) -> Result<Self::BlockBuilder> { - Err(ErrorKind::UnknownRuntime.into()) - } - - fn inherent_extrinsics(&self, _at: &BlockId, _inherent: InherentData) -> Result<Vec<Vec<u8>>> { - Err(ErrorKind::UnknownRuntime.into()) - } -} - -impl<B: RemoteBackend<Block>, E: CallExecutor<Block>> RemotePolkadotApi for RemotePolkadotApiWrapper<B, E> {} diff --git a/substrate/polkadot/availability-store/Cargo.toml b/substrate/polkadot/availability-store/Cargo.toml deleted file mode 100644 index 9a926310b04..00000000000 --- a/substrate/polkadot/availability-store/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "polkadot-availability-store" -description = "Persistent database for parachain data" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] - -[dependencies] -polkadot-primitives = { path = "../primitives" } -parking_lot = "0.4" -log = "0.3" -substrate-codec = { path = "../../substrate/codec" } -substrate-primitives = { path = "../../substrate/primitives" } -kvdb = { git = "https://github.com/paritytech/parity.git" } -kvdb-rocksdb = { git = "https://github.com/paritytech/parity.git" } -kvdb-memorydb = { git = "https://github.com/paritytech/parity.git" } diff --git a/substrate/polkadot/availability-store/src/lib.rs b/substrate/polkadot/availability-store/src/lib.rs deleted file mode 100644 index 33ace5794cf..00000000000 --- a/substrate/polkadot/availability-store/src/lib.rs +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright 2018 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 <http://www.gnu.org/licenses/>. - -//! Persistent database for parachain data. - -extern crate polkadot_primitives; -extern crate parking_lot; -extern crate substrate_codec as codec; -extern crate substrate_primitives; -extern crate kvdb; -extern crate kvdb_rocksdb; -extern crate kvdb_memorydb; - -#[macro_use] -extern crate log; - -use codec::{Encode, Decode}; -use kvdb::{KeyValueDB, DBTransaction}; -use kvdb_rocksdb::{Database, DatabaseConfig}; -use polkadot_primitives::Hash; -use polkadot_primitives::parachain::{Id as ParaId, BlockData, Extrinsic}; - -use std::collections::HashSet; -use std::path::PathBuf; -use std::sync::Arc; -use std::io; - -mod columns { - pub const DATA: Option<u32> = Some(0); - pub const META: Option<u32> = Some(1); - pub const NUM_COLUMNS: u32 = 2; -} - -/// Configuration for the availability store. -pub struct Config { - /// Cache size in bytes. If `None` default is used. - pub cache_size: Option<usize>, - /// Path to the database. - pub path: PathBuf, -} - -/// Some data to keep available. -pub struct Data { - /// The relay chain parent hash this should be localized to. - pub relay_parent: Hash, - /// The parachain index for this candidate. - pub parachain_id: ParaId, - /// Unique candidate receipt hash. - pub candidate_hash: Hash, - /// Block data. - pub block_data: BlockData, - /// Extrinsic data. - pub extrinsic: Option<Extrinsic>, -} - -fn extract_io_err(err: ::kvdb::Error) -> io::Error { - match err { - ::kvdb::Error(::kvdb::ErrorKind::Io(io_err), _) => io_err, - ::kvdb::Error(::kvdb::ErrorKind::Msg(msg), _) => io::Error::new( - io::ErrorKind::Other, - msg, - ), - x => io::Error::new( - io::ErrorKind::Other, - format!("Unexpected error variant: {:?}", x), // only necessary because of nonexaustive match. - ) - } -} - -fn block_data_key(relay_parent: &Hash, candidate_hash: &Hash) -> Vec<u8> { - (relay_parent, candidate_hash, 0i8).encode() -} - -fn extrinsic_key(relay_parent: &Hash, candidate_hash: &Hash) -> Vec<u8> { - (relay_parent, candidate_hash, 1i8).encode() -} - -/// Handle to the availability store. -#[derive(Clone)] -pub struct Store { - inner: Arc<KeyValueDB>, -} - -impl Store { - /// Create a new `Store` with given config on disk. - pub fn new(config: Config) -> io::Result<Self> { - let mut db_config = DatabaseConfig::with_columns(Some(columns::NUM_COLUMNS)); - db_config.memory_budget = config.cache_size; - db_config.wal = true; - - let path = config.path.to_str().ok_or_else(|| io::Error::new( - io::ErrorKind::Other, - format!("Bad database path: {:?}", config.path), - ))?; - - let db = Database::open(&db_config, &path).map_err(extract_io_err)?; - - Ok(Store { - inner: Arc::new(db), - }) - } - - /// Create a new `Store` in-memory. Useful for tests. - pub fn new_in_memory() -> Self { - Store { - inner: Arc::new(::kvdb_memorydb::create(::columns::NUM_COLUMNS)), - } - } - - /// Make some data available provisionally. - pub fn make_available(&self, data: Data) -> io::Result<()> { - let mut tx = DBTransaction::new(); - - // note the meta key. - let mut v = match self.inner.get(columns::META, &*data.relay_parent) { - Ok(Some(raw)) => Vec::decode(&mut &raw[..]).expect("all stored data serialized correctly; qed"), - Ok(None) => Vec::new(), - Err(e) => { - warn!(target: "availability", "Error reading from availability store: {:?}", e); - Vec::new() - } - }; - - v.push(data.candidate_hash); - tx.put_vec(columns::META, &data.relay_parent[..], v.encode()); - - tx.put_vec( - columns::DATA, - block_data_key(&data.relay_parent, &data.candidate_hash).as_slice(), - data.block_data.encode() - ); - - if let Some(_extrinsic) = data.extrinsic { - tx.put_vec( - columns::DATA, - extrinsic_key(&data.relay_parent, &data.candidate_hash).as_slice(), - vec![], - ); - } - - self.inner.write(tx).map_err(extract_io_err) - } - - /// Note that a set of candidates have been included in a finalized block with given hash and parent hash. - pub fn candidates_finalized(&self, parent: Hash, finalized_candidates: HashSet<Hash>) -> io::Result<()> { - let mut tx = DBTransaction::new(); - - let v = match self.inner.get(columns::META, &parent[..]) { - Ok(Some(raw)) => Vec::decode(&mut &raw[..]).expect("all stored data serialized correctly; qed"), - Ok(None) => Vec::new(), - Err(e) => { - warn!(target: "availability", "Error reading from availability store: {:?}", e); - Vec::new() - } - }; - tx.delete(columns::META, &parent[..]); - - for candidate_hash in v { - if !finalized_candidates.contains(&candidate_hash) { - tx.delete(columns::DATA, block_data_key(&parent, &candidate_hash).as_slice()); - tx.delete(columns::DATA, extrinsic_key(&parent, &candidate_hash).as_slice()); - } - } - - self.inner.write(tx).map_err(extract_io_err) - } - - /// Query block data. - pub fn block_data(&self, relay_parent: Hash, candidate_hash: Hash) -> Option<BlockData> { - let encoded_key = block_data_key(&relay_parent, &candidate_hash); - match self.inner.get(columns::DATA, &encoded_key[..]) { - Ok(Some(raw)) => Some( - BlockData::decode(&mut &raw[..]).expect("all stored data serialized correctly; qed") - ), - Ok(None) => None, - Err(e) => { - warn!(target: "availability", "Error reading from availability store: {:?}", e); - None - } - } - } - - /// Query extrinsic data. - pub fn extrinsic(&self, relay_parent: Hash, candidate_hash: Hash) -> Option<Extrinsic> { - let encoded_key = extrinsic_key(&relay_parent, &candidate_hash); - match self.inner.get(columns::DATA, &encoded_key[..]) { - Ok(Some(_raw)) => Some(Extrinsic), - Ok(None) => None, - Err(e) => { - warn!(target: "availability", "Error reading from availability store: {:?}", e); - None - } - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn finalization_removes_unneeded() { - let relay_parent = [1; 32].into(); - - let para_id_1 = 5.into(); - let para_id_2 = 6.into(); - - let candidate_1 = [2; 32].into(); - let candidate_2 = [3; 32].into(); - - let block_data_1 = BlockData(vec![1, 2, 3]); - let block_data_2 = BlockData(vec![4, 5, 6]); - - let store = Store::new_in_memory(); - store.make_available(Data { - relay_parent, - parachain_id: para_id_1, - candidate_hash: candidate_1, - block_data: block_data_1.clone(), - extrinsic: Some(Extrinsic), - }).unwrap(); - - store.make_available(Data { - relay_parent, - parachain_id: para_id_2, - candidate_hash: candidate_2, - block_data: block_data_2.clone(), - extrinsic: Some(Extrinsic), - }).unwrap(); - - assert_eq!(store.block_data(relay_parent, candidate_1).unwrap(), block_data_1); - assert_eq!(store.block_data(relay_parent, candidate_2).unwrap(), block_data_2); - - assert!(store.extrinsic(relay_parent, candidate_1).is_some()); - assert!(store.extrinsic(relay_parent, candidate_2).is_some()); - - store.candidates_finalized(relay_parent, [candidate_1].iter().cloned().collect()).unwrap(); - - assert_eq!(store.block_data(relay_parent, candidate_1).unwrap(), block_data_1); - assert!(store.block_data(relay_parent, candidate_2).is_none()); - - assert!(store.extrinsic(relay_parent, candidate_1).is_some()); - assert!(store.extrinsic(relay_parent, candidate_2).is_none()); - } -} diff --git a/substrate/polkadot/cli/Cargo.toml b/substrate/polkadot/cli/Cargo.toml deleted file mode 100644 index 3ccf81b1851..00000000000 --- a/substrate/polkadot/cli/Cargo.toml +++ /dev/null @@ -1,33 +0,0 @@ -[package] -name = "polkadot-cli" -version = "0.3.0" -authors = ["Parity Technologies <admin@parity.io>"] -description = "Polkadot node implementation in Rust." - -[dependencies] -clap = { version = "~2.32", features = ["yaml"] } -error-chain = "0.12" -log = "0.3" -slog = "^2" -lazy_static = "1.0" -tokio = "0.1.7" -futures = "0.1.17" -parking_lot = "0.4" -exit-future = "0.1" -substrate-cli = { path = "../../substrate/cli" } -substrate-client = { path = "../../substrate/client" } -substrate-codec = { path = "../../substrate/codec" } -substrate-extrinsic-pool = { path = "../../substrate/extrinsic-pool" } -substrate-network = { path = "../../substrate/network" } -substrate-primitives = { path = "../../substrate/primitives" } -substrate-rpc = { path = "../../substrate/rpc" } -substrate-rpc-servers = { path = "../../substrate/rpc-servers" } -substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } -substrate-service = { path = "../../substrate/service" } -substrate-state-machine = { path = "../../substrate/state-machine" } -substrate-telemetry = { path = "../../substrate/telemetry" } -polkadot-primitives = { path = "../primitives" } -polkadot-runtime = { path = "../runtime" } -polkadot-service = { path = "../service" } -polkadot-transaction-pool = { path = "../transaction-pool" } - diff --git a/substrate/polkadot/cli/src/chain_spec.rs b/substrate/polkadot/cli/src/chain_spec.rs deleted file mode 100644 index 14593c73c31..00000000000 --- a/substrate/polkadot/cli/src/chain_spec.rs +++ /dev/null @@ -1,57 +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 <http://www.gnu.org/licenses/>. - -//! Predefined chains. - -use service; - -/// The chain specification (this should eventually be replaced by a more general JSON-based chain -/// specification). -#[derive(Clone, Debug)] -pub enum ChainSpec { - /// Whatever the current runtime is, with just Alice as an auth. - Development, - /// Whatever the current runtime is, with simple Alice/Bob auths. - LocalTestnet, - /// The PoC-1 & PoC-2 era testnet. - KrummeLanke, - /// Whatever the current runtime is with the "global testnet" defaults. - StagingTestnet, -} - -/// Get a chain config from a spec setting. -impl ChainSpec { - pub(crate) fn load(self) -> Result<service::ChainSpec, String> { - Ok(match self { - ChainSpec::KrummeLanke => service::chain_spec::poc_1_testnet_config()?, - ChainSpec::Development => service::chain_spec::development_config(), - ChainSpec::LocalTestnet => service::chain_spec::local_testnet_config(), - ChainSpec::StagingTestnet => service::chain_spec::staging_testnet_config(), - }) - } - - pub(crate) fn from(s: &str) -> Option<Self> { - match s { - "dev" => Some(ChainSpec::Development), - "local" => Some(ChainSpec::LocalTestnet), - "poc-1" => Some(ChainSpec::KrummeLanke), - "" | "krummelanke" => Some(ChainSpec::KrummeLanke), - "staging" => Some(ChainSpec::StagingTestnet), - _ => None, - } - } -} - diff --git a/substrate/polkadot/cli/src/lib.rs b/substrate/polkadot/cli/src/lib.rs deleted file mode 100644 index 1a2e2f4850b..00000000000 --- a/substrate/polkadot/cli/src/lib.rs +++ /dev/null @@ -1,119 +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 <http://www.gnu.org/licenses/>. - -//! Polkadot CLI library. - -#![warn(missing_docs)] -#![warn(unused_extern_crates)] - -extern crate futures; -extern crate tokio; - -extern crate substrate_cli as cli; -extern crate polkadot_service as service; -extern crate exit_future; - -#[macro_use] -extern crate log; - -mod chain_spec; - -pub use cli::error; - -use chain_spec::ChainSpec; - -use futures::Future; -use tokio::runtime::Runtime; -pub use service::{Components as ServiceComponents, Service, CustomConfiguration}; -pub use cli::{VersionInfo, IntoExit}; - -fn load_spec(id: &str) -> Result<Option<service::ChainSpec>, String> { - Ok(match ChainSpec::from(id) { - Some(spec) => Some(spec.load()?), - None => None, - }) -} - -/// Additional worker making use of the node, to run asynchronously before shutdown. -/// -/// This will be invoked with the service and spawn a future that resolves -/// when complete. -pub trait Worker: IntoExit { - /// A future that resolves when the work is done or the node should exit. - /// This will be run on a tokio runtime. - type Work: Future<Item=(),Error=()> + Send + 'static; - - /// Return configuration for the polkadot node. - // TODO: make this the full configuration, so embedded nodes don't need - // string CLI args - fn configuration(&self) -> service::CustomConfiguration { Default::default() } - - /// Do work and schedule exit. - fn work<C: service::Components>(self, service: &service::Service<C>) -> Self::Work; -} - -/// Parse command line arguments into service configuration. -/// -/// IANA unassigned port ranges that we could use: -/// 6717-6766 Unassigned -/// 8504-8553 Unassigned -/// 9556-9591 Unassigned -/// 9803-9874 Unassigned -/// 9926-9949 Unassigned -pub fn run<I, T, W>(args: I, worker: W, version: cli::VersionInfo) -> error::Result<()> where - I: IntoIterator<Item = T>, - T: Into<std::ffi::OsString> + Clone, - W: Worker, -{ - - match cli::prepare_execution::<service::Factory, _, _, _, _>(args, worker, version, load_spec, "parity-polkadot")? { - cli::Action::ExecutedInternally => (), - cli::Action::RunService((mut config, worker)) => { - info!("Parity ·:· Polkadot"); - info!(" version {}", config.full_version()); - info!(" by Parity Technologies, 2017, 2018"); - info!("Chain specification: {}", config.chain_spec.name()); - info!("Node name: {}", config.name); - info!("Roles: {:?}", config.roles); - config.custom = worker.configuration(); - let mut runtime = Runtime::new()?; - let executor = runtime.executor(); - match config.roles == service::Roles::LIGHT { - true => run_until_exit(&mut runtime, service::new_light(config, executor)?, worker)?, - false => run_until_exit(&mut runtime, service::new_full(config, executor)?, worker)?, - } - } - } - Ok(()) -} -fn run_until_exit<C, W>( - runtime: &mut Runtime, - service: service::Service<C>, - worker: W, -) -> error::Result<()> - where - C: service::Components, - W: Worker, -{ - let (exit_send, exit) = exit_future::signal(); - - let executor = runtime.executor(); - cli::informant::start(&service, exit.clone(), executor.clone()); - - let _ = runtime.block_on(worker.work(&service)); - exit_send.fire(); - Ok(()) -} diff --git a/substrate/polkadot/collator/Cargo.toml b/substrate/polkadot/collator/Cargo.toml deleted file mode 100644 index 122261e3f65..00000000000 --- a/substrate/polkadot/collator/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "polkadot-collator" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] -description = "Collator node implementation" - -[dependencies] -futures = "0.1.17" -substrate-client = { path = "../../substrate/client" } -substrate-codec = { path = "../../substrate/codec", version = "0.1" } -substrate-primitives = { path = "../../substrate/primitives", version = "0.1" } -polkadot-api = { path = "../api" } -polkadot-runtime = { path = "../runtime", version = "0.1" } -polkadot-primitives = { path = "../primitives", version = "0.1" } -polkadot-cli = { path = "../cli" } -log = "0.4" -ed25519 = { path = "../../substrate/ed25519" } -tokio = "0.1.7" diff --git a/substrate/polkadot/collator/README.adoc b/substrate/polkadot/collator/README.adoc deleted file mode 100644 index 3a5408b489e..00000000000 --- a/substrate/polkadot/collator/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Collator - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/collator/src/lib.rs b/substrate/polkadot/collator/src/lib.rs deleted file mode 100644 index 60b46d47f0b..00000000000 --- a/substrate/polkadot/collator/src/lib.rs +++ /dev/null @@ -1,441 +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 <http://www.gnu.org/licenses/>. - -//! Collation node logic. -//! -//! A collator node lives on a distinct parachain and submits a proposal for -//! a state transition, along with a proof for its validity -//! (what we might call a witness or block data). -//! -//! One of collators' other roles is to route messages between chains. -//! Each parachain produces a list of "egress" posts of messages for each other -//! parachain on each block, for a total of N^2 lists all together. -//! -//! We will refer to the egress list at relay chain block X of parachain A with -//! destination B as egress(X)[A -> B] -//! -//! On every block, each parachain will be intended to route messages from some -//! subset of all the other parachains. (NOTE: in practice this is not done until PoC-3) -//! -//! Since the egress information is unique to every block, when routing from a -//! parachain a collator must gather all egress posts from that parachain -//! up to the last point in history that messages were successfully routed -//! from that parachain, accounting for relay chain blocks where no candidate -//! from the collator's parachain was produced. -//! -//! In the case that all parachains route to each other and a candidate for the -//! collator's parachain was included in the last relay chain block, the collator -//! only has to gather egress posts from other parachains one block back in relay -//! chain history. -//! -//! This crate defines traits which provide context necessary for collation logic -//! to be performed, as the collation logic itself. - -extern crate futures; -extern crate substrate_client as client; -extern crate substrate_codec as codec; -extern crate substrate_primitives as primitives; -extern crate ed25519; -extern crate tokio; - -extern crate polkadot_api; -extern crate polkadot_cli; -extern crate polkadot_runtime; -extern crate polkadot_primitives; - -#[macro_use] -extern crate log; - -use std::collections::{BTreeSet, BTreeMap, HashSet}; -use std::fmt; -use std::sync::Arc; -use std::time::{Duration, Instant}; - -use futures::{future, stream, Stream, Future, IntoFuture}; -use client::BlockchainEvents; -use polkadot_api::PolkadotApi; -use polkadot_primitives::{AccountId, BlockId, SessionKey}; -use polkadot_primitives::parachain::{self, BlockData, DutyRoster, HeadData, ConsolidatedIngress, Message, Id as ParaId}; -use polkadot_cli::{ServiceComponents, Service, CustomConfiguration}; -use polkadot_cli::{Worker, IntoExit}; -use tokio::timer::Deadline; - -pub use polkadot_cli::VersionInfo; - -const COLLATION_TIMEOUT: Duration = Duration::from_secs(30); - -/// Error to return when the head data was invalid. -#[derive(Clone, Copy, Debug)] -pub struct InvalidHead; - -/// Collation errors. -#[derive(Debug)] -pub enum Error<R> { - /// Error on the relay-chain side of things. - Polkadot(R), - /// Error on the collator side of things. - Collator(InvalidHead), -} - -impl<R: fmt::Display> fmt::Display for Error<R> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - Error::Polkadot(ref err) => write!(f, "Polkadot node error: {}", err), - Error::Collator(_) => write!(f, "Collator node error: Invalid head data"), - } - } -} - -/// Parachain context needed for collation. -/// -/// This can be implemented through an externally attached service or a stub. -/// This is expected to be a lightweight, shared type like an Arc. -pub trait ParachainContext: Clone { - /// Produce a candidate, given the latest ingress queue information and the last parachain head. - fn produce_candidate<I: IntoIterator<Item=(ParaId, Message)>>( - &self, - last_head: HeadData, - ingress: I, - ) -> Result<(BlockData, HeadData), InvalidHead>; -} - -/// Relay chain context needed to collate. -/// This encapsulates a network and local database which may store -/// some of the input. -pub trait RelayChainContext { - type Error; - - /// Future that resolves to the un-routed egress queues of a parachain. - /// The first item is the oldest. - type FutureEgress: IntoFuture<Item=Vec<Vec<Message>>, Error=Self::Error>; - - /// Provide a set of all parachains meant to be routed to at a block. - fn routing_parachains(&self) -> BTreeSet<ParaId>; - - /// Get un-routed egress queues from a parachain to the local parachain. - fn unrouted_egress(&self, id: ParaId) -> Self::FutureEgress; -} - -fn key_to_account_id(key: &ed25519::Pair) -> AccountId { - let pubkey_bytes: [u8; 32] = key.public().into(); - pubkey_bytes.into() -} - -/// Collate the necessary ingress queue using the given context. -pub fn collate_ingress<'a, R>(relay_context: R) - -> impl Future<Item=ConsolidatedIngress, Error=R::Error> + 'a - where - R: RelayChainContext, - R::Error: 'a, - R::FutureEgress: 'a, -{ - let mut egress_fetch = Vec::new(); - - for routing_parachain in relay_context.routing_parachains() { - let fetch = relay_context - .unrouted_egress(routing_parachain) - .into_future() - .map(move |egresses| (routing_parachain, egresses)); - - egress_fetch.push(fetch); - } - - // create a map ordered first by the depth of the egress queue - // and then by the parachain ID. - // - // then transform that into the consolidated egress queue. - stream::futures_unordered(egress_fetch) - .fold(BTreeMap::new(), |mut map, (routing_id, egresses)| { - for (depth, egress) in egresses.into_iter().rev().enumerate() { - let depth = -(depth as i64); - map.insert((depth, routing_id), egress); - } - - Ok(map) - }) - .map(|ordered| ordered.into_iter().map(|((_, id), egress)| (id, egress))) - .map(|i| i.collect::<Vec<_>>()) - .map(ConsolidatedIngress) -} - -/// Produce a candidate for the parachain, with given contexts, parent head, and signing key. -pub fn collate<'a, R, P>( - local_id: ParaId, - last_head: HeadData, - relay_context: R, - para_context: P, - key: Arc<ed25519::Pair>, -) - -> impl Future<Item=parachain::Collation, Error=Error<R::Error>> + 'a - where - R: RelayChainContext + 'a, - R::Error: 'a, - R::FutureEgress: 'a, - P: ParachainContext + 'a, -{ - collate_ingress(relay_context).map_err(Error::Polkadot).and_then(move |ingress| { - let (block_data, head_data) = para_context.produce_candidate( - last_head, - ingress.0.iter().flat_map(|&(id, ref msgs)| msgs.iter().cloned().map(move |msg| (id, msg))) - ).map_err(Error::Collator)?; - - let block_data_hash = block_data.hash(); - let signature = key.sign(&block_data_hash.0[..]).into(); - - let receipt = parachain::CandidateReceipt { - parachain_index: local_id, - collator: key_to_account_id(&*key), - signature, - head_data, - balance_uploads: Vec::new(), - egress_queue_roots: Vec::new(), - fees: 0, - block_data_hash, - }; - - Ok(parachain::Collation { - receipt, - block_data, - }) - }) -} - -/// Polkadot-api context. -struct ApiContext; - -impl RelayChainContext for ApiContext { - type Error = ::polkadot_api::Error; - type FutureEgress = Result<Vec<Vec<Message>>, Self::Error>; - - fn routing_parachains(&self) -> BTreeSet<ParaId> { - BTreeSet::new() - } - - fn unrouted_egress(&self, _id: ParaId) -> Self::FutureEgress { - Ok(Vec::new()) - } -} - -struct CollationNode<P, E> { - parachain_context: P, - exit: E, - para_id: ParaId, - key: Arc<ed25519::Pair>, -} - -impl<P, E> IntoExit for CollationNode<P, E> where - P: ParachainContext + Send + 'static, - E: Future<Item=(),Error=()> + Send + 'static -{ - type Exit = E; - fn into_exit(self) -> Self::Exit { - self.exit - } -} - -impl<P, E> Worker for CollationNode<P, E> where - P: ParachainContext + Send + 'static, - E: Future<Item=(),Error=()> + Send + 'static -{ - type Work = Box<Future<Item=(),Error=()> + Send>; - - fn configuration(&self) -> CustomConfiguration { - let mut config = CustomConfiguration::default(); - config.collating_for = Some(( - key_to_account_id(&*self.key), - self.para_id.clone(), - )); - config - } - - fn work<C: ServiceComponents>(self, service: &Service<C>) -> Self::Work { - let CollationNode { parachain_context, exit, para_id, key } = self; - let client = service.client(); - let api = service.api(); - let network = service.network(); - - let work = client.import_notification_stream() - .for_each(move |notification| { - macro_rules! try_fr { - ($e:expr) => { - match $e { - Ok(x) => x, - Err(e) => return future::Either::A(future::err(Error::Polkadot(e))), - } - } - } - - let relay_parent = notification.hash; - let id = BlockId::hash(relay_parent); - - let network = network.clone(); - let api = api.clone(); - let key = key.clone(); - let parachain_context = parachain_context.clone(); - - let work = future::lazy(move || { - let last_head = match try_fr!(api.parachain_head(&id, para_id)) { - Some(last_head) => last_head, - None => return future::Either::A(future::ok(())), - }; - - let targets = compute_targets( - para_id, - try_fr!(api.session_keys(&id)).as_slice(), - try_fr!(api.duty_roster(&id)), - ); - - let collation_work = collate( - para_id, - HeadData(last_head), - ApiContext, - parachain_context, - key, - ).map(move |collation| { - network.with_spec(|spec, ctx| spec.add_local_collation( - ctx, - relay_parent, - targets, - collation, - )); - }); - - future::Either::B(collation_work) - }); - let deadlined = Deadline::new(work, Instant::now() + COLLATION_TIMEOUT); - let silenced = deadlined.then(|res| match res { - Ok(()) => Ok(()), - Err(e) => { - warn!("Collation failure: {}", e); - Ok(()) - } - }); - - tokio::spawn(silenced); - Ok(()) - }); - - let work_and_exit = work.select(exit).then(|_| Ok(())); - Box::new(work_and_exit) as Box<_> - } -} - -fn compute_targets(para_id: ParaId, session_keys: &[SessionKey], roster: DutyRoster) -> HashSet<SessionKey> { - use polkadot_primitives::parachain::Chain; - - roster.validator_duty.iter().enumerate() - .filter(|&(_, c)| c == &Chain::Parachain(para_id)) - .filter_map(|(i, _)| session_keys.get(i)) - .cloned() - .collect() -} - -/// Run a collator node with the given `RelayChainContext` and `ParachainContext` and -/// arguments to the underlying polkadot node. -/// -/// Provide a future which resolves when the node should exit. -/// This function blocks until done. -pub fn run_collator<P, E, I, ArgT>( - parachain_context: P, - para_id: ParaId, - exit: E, - key: Arc<ed25519::Pair>, - args: I, - version: VersionInfo, -) -> polkadot_cli::error::Result<()> where - P: ParachainContext + Send + 'static, - E: IntoFuture<Item=(),Error=()>, - E::Future: Send + Clone + 'static, - I: IntoIterator<Item=ArgT>, - ArgT: Into<std::ffi::OsString> + Clone, -{ - let node_logic = CollationNode { parachain_context, exit: exit.into_future(), para_id, key }; - polkadot_cli::run(args, node_logic, version) -} - -#[cfg(test)] -mod tests { - use super::*; - - use std::collections::{HashMap, BTreeSet}; - - use futures::Future; - use polkadot_primitives::parachain::{Message, Id as ParaId}; - - pub struct DummyRelayChainCtx { - egresses: HashMap<ParaId, Vec<Vec<Message>>>, - currently_routing: BTreeSet<ParaId>, - } - - impl RelayChainContext for DummyRelayChainCtx { - type Error = (); - type FutureEgress = Result<Vec<Vec<Message>>, ()>; - - fn routing_parachains(&self) -> BTreeSet<ParaId> { - self.currently_routing.clone() - } - - fn unrouted_egress(&self, id: ParaId) -> Result<Vec<Vec<Message>>, ()> { - Ok(self.egresses.get(&id).cloned().unwrap_or_default()) - } - } - - #[test] - fn collates_ingress() { - let route_from = |x: &[ParaId]| { - let mut set = BTreeSet::new(); - set.extend(x.iter().cloned()); - set - }; - - let message = |x: Vec<u8>| vec![Message(x)]; - - let dummy_ctx = DummyRelayChainCtx { - currently_routing: route_from(&[2.into(), 3.into()]), - egresses: vec![ - // egresses for `2`: last routed successfully 5 blocks ago. - (2.into(), vec![ - message(vec![1, 2, 3]), - message(vec![4, 5, 6]), - message(vec![7, 8]), - message(vec![10]), - message(vec![12]), - ]), - - // egresses for `3`: last routed successfully 3 blocks ago. - (3.into(), vec![ - message(vec![9]), - message(vec![11]), - message(vec![13]), - ]), - ].into_iter().collect(), - }; - - assert_eq!( - collate_ingress(dummy_ctx).wait().unwrap(), - ConsolidatedIngress(vec![ - (2.into(), message(vec![1, 2, 3])), - (2.into(), message(vec![4, 5, 6])), - (2.into(), message(vec![7, 8])), - (3.into(), message(vec![9])), - (2.into(), message(vec![10])), - (3.into(), message(vec![11])), - (2.into(), message(vec![12])), - (3.into(), message(vec![13])), - ] - )) - } -} diff --git a/substrate/polkadot/consensus/Cargo.toml b/substrate/polkadot/consensus/Cargo.toml deleted file mode 100644 index 239e9c05afe..00000000000 --- a/substrate/polkadot/consensus/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -name = "polkadot-consensus" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] - -[dependencies] -futures = "0.1.17" -parking_lot = "0.4" -tokio = "0.1.7" -ed25519 = { path = "../../substrate/ed25519" } -error-chain = "0.12" -log = "0.3" -exit-future = "0.1" -rhododendron = "0.3" -polkadot-api = { path = "../api" } -polkadot-availability-store = { path = "../availability-store" } -polkadot-parachain = { path = "../parachain" } -polkadot-primitives = { path = "../primitives" } -polkadot-runtime = { path = "../runtime" } -polkadot-statement-table = { path = "../statement-table" } -polkadot-transaction-pool = { path = "../transaction-pool" } -substrate-bft = { path = "../../substrate/bft" } -substrate-codec = { path = "../../substrate/codec" } -substrate-primitives = { path = "../../substrate/primitives" } -substrate-runtime-support = { path = "../../substrate/runtime-support" } -substrate-client = { path = "../../substrate/client" } -substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } - -[dev-dependencies] -substrate-keyring = { path = "../../substrate/keyring" } diff --git a/substrate/polkadot/consensus/README.adoc b/substrate/polkadot/consensus/README.adoc deleted file mode 100644 index a3ac5f631c3..00000000000 --- a/substrate/polkadot/consensus/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Consensus - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/consensus/src/collation.rs b/substrate/polkadot/consensus/src/collation.rs deleted file mode 100644 index b02b49aaa69..00000000000 --- a/substrate/polkadot/consensus/src/collation.rs +++ /dev/null @@ -1,169 +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 <http://www.gnu.org/licenses/>. - -//! Validator-side view of collation. -//! -//! This module contains type definitions, a trait for a batch of collators, and a trait for -//! attempting to fetch a collation repeatedly until a valid one is obtained. - -use std::sync::Arc; - -use polkadot_api::PolkadotApi; -use polkadot_primitives::{Hash, AccountId, BlockId}; -use polkadot_primitives::parachain::{Id as ParaId, Collation, Extrinsic}; - -use futures::prelude::*; - -/// Encapsulates connections to collators and allows collation on any parachain. -/// -/// This is expected to be a lightweight, shared type like an `Arc`. -pub trait Collators: Clone { - /// Errors when producing collations. - type Error; - /// A full collation. - type Collation: IntoFuture<Item=Collation,Error=Self::Error>; - - /// Collate on a specific parachain, building on a given relay chain parent hash. - /// - /// The returned collation should be checked for basic validity in the signature - /// and will be checked for state-transition validity by the consumer of this trait. - /// - /// This does not have to guarantee local availability, as a valid collation - /// will be passed to the `TableRouter` instance. - fn collate(&self, parachain: ParaId, relay_parent: Hash) -> Self::Collation; - - /// Note a bad collator. TODO: take proof - fn note_bad_collator(&self, collator: AccountId); -} - -/// A future which resolves when a collation is available. -/// -/// This future is fused. -pub struct CollationFetch<C: Collators, P: PolkadotApi> { - parachain: ParaId, - relay_parent_hash: Hash, - relay_parent: BlockId, - collators: C, - live_fetch: Option<<C::Collation as IntoFuture>::Future>, - client: Arc<P>, -} - -impl<C: Collators, P: PolkadotApi> CollationFetch<C, P> { - /// Create a new collation fetcher for the given chain. - pub fn new(parachain: ParaId, relay_parent: BlockId, relay_parent_hash: Hash, collators: C, client: Arc<P>) -> Self { - CollationFetch { - relay_parent_hash, - relay_parent, - collators, - client, - parachain, - live_fetch: None, - } - } - - /// Access the underlying relay parent hash. - pub fn relay_parent(&self) -> Hash { - self.relay_parent_hash - } -} - -impl<C: Collators, P: PolkadotApi> Future for CollationFetch<C, P> { - type Item = (Collation, Extrinsic); - type Error = C::Error; - - fn poll(&mut self) -> Poll<(Collation, Extrinsic), C::Error> { - loop { - let x = { - let parachain = self.parachain.clone(); - let (r, c) = (self.relay_parent_hash, &self.collators); - let poll = self.live_fetch - .get_or_insert_with(move || c.collate(parachain, r).into_future()) - .poll(); - - try_ready!(poll) - }; - - match validate_collation(&*self.client, &self.relay_parent, &x) { - Ok(()) => { - // TODO: generate extrinsic while verifying. - return Ok(Async::Ready((x, Extrinsic))); - } - Err(e) => { - debug!("Failed to validate parachain due to API error: {}", e); - - // just continue if we got a bad collation or failed to validate - self.live_fetch = None; - self.collators.note_bad_collator(x.receipt.collator) - } - } - } - } -} - -// Errors that can occur when validating a parachain. -error_chain! { - types { Error, ErrorKind, ResultExt; } - - errors { - InactiveParachain(id: ParaId) { - description("Collated for inactive parachain"), - display("Collated for inactive parachain: {:?}", id), - } - ValidationFailure { - description("Parachain candidate failed validation."), - display("Parachain candidate failed validation."), - } - WrongHeadData(expected: Vec<u8>, got: Vec<u8>) { - description("Parachain validation produced wrong head data."), - display("Parachain validation produced wrong head data (expected: {:?}, got {:?}", expected, got), - } - } - - links { - PolkadotApi(::polkadot_api::Error, ::polkadot_api::ErrorKind); - } -} - -/// Check whether a given collation is valid. Returns `Ok` on success, error otherwise. -pub fn validate_collation<P: PolkadotApi>(client: &P, relay_parent: &BlockId, collation: &Collation) -> Result<(), Error> { - use parachain::{self, ValidationParams}; - - let para_id = collation.receipt.parachain_index; - let validation_code = client.parachain_code(relay_parent, para_id)? - .ok_or_else(|| ErrorKind::InactiveParachain(para_id))?; - - let chain_head = client.parachain_head(relay_parent, para_id)? - .ok_or_else(|| ErrorKind::InactiveParachain(para_id))?; - - let params = ValidationParams { - parent_head: chain_head, - block_data: collation.block_data.0.clone(), - }; - - match parachain::wasm::validate_candidate(&validation_code, params) { - Ok(result) => { - if result.head_data == collation.receipt.head_data.0 { - Ok(()) - } else { - Err(ErrorKind::WrongHeadData( - collation.receipt.head_data.0.clone(), - result.head_data - ).into()) - } - } - Err(_) => Err(ErrorKind::ValidationFailure.into()) - } -} diff --git a/substrate/polkadot/consensus/src/dynamic_inclusion.rs b/substrate/polkadot/consensus/src/dynamic_inclusion.rs deleted file mode 100644 index 232acea2388..00000000000 --- a/substrate/polkadot/consensus/src/dynamic_inclusion.rs +++ /dev/null @@ -1,134 +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 <http://www.gnu.org/licenses/>. - -//! Dynamic inclusion threshold over time. - -use std::time::{Duration, Instant}; - -fn duration_to_micros(duration: &Duration) -> u64 { - duration.as_secs() * 1_000_000 + (duration.subsec_nanos() / 1000) as u64 -} - -/// Dynamic inclusion threshold over time. -/// -/// The acceptable proportion of parachains which must have parachain candidates -/// reduces over time (eventually going to zero). -#[derive(Debug, Clone)] -pub struct DynamicInclusion { - start: Instant, - y: u64, - m: u64, -} - -impl DynamicInclusion { - /// Constructs a new dynamic inclusion threshold calculator based on the time now, - /// how many parachain candidates are required at the beginning, and when an empty - /// block will be allowed. - pub fn new(initial: usize, start: Instant, allow_empty: Duration) -> Self { - // linear function f(n_candidates) -> valid after microseconds - // f(0) = allow_empty - // f(initial) = 0 - // m is actually the negative slope to avoid using signed arithmetic. - let (y, m) = if initial != 0 { - let y = duration_to_micros(&allow_empty); - - (y, y / initial as u64) - } else { - (0, 0) - }; - - DynamicInclusion { - start, - y, - m, - } - } - - /// Returns the duration from `now` after which the amount of included parachain candidates - /// would be enough, or `None` if it is sufficient now. - /// - /// Panics if `now` is earlier than the `start`. - pub fn acceptable_in(&self, now: Instant, included: usize) -> Option<Instant> { - let elapsed = now.duration_since(self.start); - let elapsed = duration_to_micros(&elapsed); - - let valid_after = self.y.saturating_sub(self.m * included as u64); - - if elapsed >= valid_after { - None - } else { - let until = Duration::from_millis((valid_after - elapsed) as u64 / 1000); - Some(now + until) - } - } - - /// Get the start instant. - pub fn started_at(&self) -> Instant { self.start } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn full_immediately_allowed() { - let now = Instant::now(); - - let dynamic = DynamicInclusion::new( - 10, - now, - Duration::from_millis(4000), - ); - - assert!(dynamic.acceptable_in(now, 10).is_none()); - assert!(dynamic.acceptable_in(now, 11).is_none()); - assert!(dynamic.acceptable_in(now + Duration::from_millis(2000), 10).is_none()); - } - - #[test] - fn half_allowed_halfway() { - let now = Instant::now(); - - let dynamic = DynamicInclusion::new( - 10, - now, - Duration::from_millis(4000), - ); - - assert_eq!(dynamic.acceptable_in(now, 5), Some(now + Duration::from_millis(2000))); - assert!(dynamic.acceptable_in(now + Duration::from_millis(2000), 5).is_none()); - assert!(dynamic.acceptable_in(now + Duration::from_millis(3000), 5).is_none()); - assert!(dynamic.acceptable_in(now + Duration::from_millis(4000), 5).is_none()); - } - - #[test] - fn zero_initial_is_flat() { - let now = Instant::now(); - - let dynamic = DynamicInclusion::new( - 0, - now, - Duration::from_secs(10_000), - ); - - for i in 0..10_001 { - let now = now + Duration::from_secs(i); - assert!(dynamic.acceptable_in(now, 0).is_none()); - assert!(dynamic.acceptable_in(now, 1).is_none()); - assert!(dynamic.acceptable_in(now, 10).is_none()); - } - } -} diff --git a/substrate/polkadot/consensus/src/error.rs b/substrate/polkadot/consensus/src/error.rs deleted file mode 100644 index 397fdee52ce..00000000000 --- a/substrate/polkadot/consensus/src/error.rs +++ /dev/null @@ -1,55 +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 <http://www.gnu.org/licenses/>. - -//! Errors that can occur during the consensus process. - -use primitives::AuthorityId; - -error_chain! { - links { - PolkadotApi(::polkadot_api::Error, ::polkadot_api::ErrorKind); - Bft(::bft::Error, ::bft::ErrorKind); - } - - errors { - InvalidDutyRosterLength(expected: usize, got: usize) { - description("Duty Roster had invalid length"), - display("Invalid duty roster length: expected {}, got {}", expected, got), - } - NotValidator(id: AuthorityId) { - description("Local account ID not a validator at this block."), - display("Local account ID ({:?}) not a validator at this block.", id), - } - PrematureDestruction { - description("Proposer destroyed before finishing proposing or evaluating"), - display("Proposer destroyed before finishing proposing or evaluating"), - } - Timer(e: ::tokio::timer::Error) { - description("Failed to register or resolve async timer."), - display("Timer failed: {}", e), - } - Executor(e: ::futures::future::ExecuteErrorKind) { - description("Unable to dispatch agreement future"), - display("Unable to dispatch agreement future: {:?}", e), - } - } -} - -impl From<::bft::InputStreamConcluded> for Error { - fn from(err: ::bft::InputStreamConcluded) -> Self { - ::bft::Error::from(err).into() - } -} diff --git a/substrate/polkadot/consensus/src/evaluation.rs b/substrate/polkadot/consensus/src/evaluation.rs deleted file mode 100644 index d843e79de47..00000000000 --- a/substrate/polkadot/consensus/src/evaluation.rs +++ /dev/null @@ -1,133 +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 <http://www.gnu.org/licenses/>. - -//! Polkadot block evaluation and evaluation errors. - -use super::MAX_TRANSACTIONS_SIZE; - -use codec::{Decode, Encode}; -use polkadot_runtime::{Block as PolkadotGenericBlock, CheckedBlock}; -use polkadot_primitives::{Block, Hash, BlockNumber, Timestamp}; -use polkadot_primitives::parachain::Id as ParaId; - -error_chain! { - links { - PolkadotApi(::polkadot_api::Error, ::polkadot_api::ErrorKind); - } - - errors { - ProposalNotForPolkadot { - description("Proposal provided not a Polkadot block."), - display("Proposal provided not a Polkadot block."), - } - TimestampInFuture { - description("Proposal had timestamp too far in the future."), - display("Proposal had timestamp too far in the future."), - } - TooManyCandidates(expected: usize, got: usize) { - description("Proposal included more candidates than is possible."), - display("Proposal included {} candidates for {} parachains", got, expected), - } - ParachainOutOfOrder { - description("Proposal included parachains out of order."), - display("Proposal included parachains out of order."), - } - UnknownParachain(id: ParaId) { - description("Proposal included unregistered parachain."), - display("Proposal included unregistered parachain {:?}", id), - } - WrongParentHash(expected: Hash, got: Hash) { - description("Proposal had wrong parent hash."), - display("Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got), - } - WrongNumber(expected: BlockNumber, got: BlockNumber) { - description("Proposal had wrong number."), - display("Proposal had wrong number. Expected {:?}, got {:?}", expected, got), - } - ProposalTooLarge(size: usize) { - description("Proposal exceeded the maximum size."), - display( - "Proposal exceeded the maximum size of {} by {} bytes.", - MAX_TRANSACTIONS_SIZE, MAX_TRANSACTIONS_SIZE.saturating_sub(*size) - ), - } - } -} - -/// Attempt to evaluate a substrate block as a polkadot block, returning error -/// upon any initial validity checks failing. -pub fn evaluate_initial( - proposal: &Block, - now: Timestamp, - parent_hash: &Hash, - parent_number: BlockNumber, - active_parachains: &[ParaId], -) -> Result<CheckedBlock> { - const MAX_TIMESTAMP_DRIFT: Timestamp = 60; - - let encoded = Encode::encode(proposal); - let proposal = PolkadotGenericBlock::decode(&mut &encoded[..]) - .and_then(|b| CheckedBlock::new(b).ok()) - .ok_or_else(|| ErrorKind::ProposalNotForPolkadot)?; - - let transactions_size = proposal.extrinsics.iter().fold(0, |a, tx| { - a + Encode::encode(tx).len() - }); - - if transactions_size > MAX_TRANSACTIONS_SIZE { - bail!(ErrorKind::ProposalTooLarge(transactions_size)) - } - - if proposal.header.parent_hash != *parent_hash { - bail!(ErrorKind::WrongParentHash(*parent_hash, proposal.header.parent_hash)); - } - - if proposal.header.number != parent_number + 1 { - bail!(ErrorKind::WrongNumber(parent_number + 1, proposal.header.number)); - } - - let block_timestamp = proposal.timestamp(); - - // lenient maximum -- small drifts will just be delayed using a timer. - if block_timestamp > now + MAX_TIMESTAMP_DRIFT { - bail!(ErrorKind::TimestampInFuture) - } - - { - let n_parachains = active_parachains.len(); - if proposal.parachain_heads().len() > n_parachains { - bail!(ErrorKind::TooManyCandidates(n_parachains, proposal.parachain_heads().len())); - } - - let mut last_id = None; - let mut iter = active_parachains.iter(); - for head in proposal.parachain_heads() { - // proposed heads must be ascending order by parachain ID without duplicate. - if last_id.as_ref().map_or(false, |x| x >= &head.parachain_index) { - bail!(ErrorKind::ParachainOutOfOrder); - } - - if !iter.any(|x| x == &head.parachain_index) { - // must be unknown since active parachains are always sorted. - bail!(ErrorKind::UnknownParachain(head.parachain_index)) - } - - last_id = Some(head.parachain_index); - } - } - - Ok(proposal) -} diff --git a/substrate/polkadot/consensus/src/lib.rs b/substrate/polkadot/consensus/src/lib.rs deleted file mode 100644 index 244fdeb55df..00000000000 --- a/substrate/polkadot/consensus/src/lib.rs +++ /dev/null @@ -1,857 +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 <http://www.gnu.org/licenses/>. - -//! Propagation and agreement of candidates. -//! -//! Authorities are split into groups by parachain, and each authority might come -//! up its own candidate for their parachain. Within groups, authorities pass around -//! their candidates and produce statements of validity. -//! -//! Any candidate that receives majority approval by the authorities in a group -//! may be subject to inclusion, unless any authorities flag that candidate as invalid. -//! -//! Wrongly flagging as invalid should be strongly disincentivized, so that in the -//! equilibrium state it is not expected to happen. Likewise with the submission -//! of invalid blocks. -//! -//! Groups themselves may be compromised by malicious authorities. - -extern crate ed25519; -extern crate parking_lot; -extern crate polkadot_api; -extern crate polkadot_availability_store as extrinsic_store; -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_client as client; - -extern crate exit_future; -extern crate tokio; -extern crate rhododendron; - -#[macro_use] -extern crate error_chain; - -#[macro_use] -extern crate futures; - -#[macro_use] -extern crate log; - -#[cfg(test)] -extern crate substrate_keyring; - -use std::collections::{HashMap, HashSet}; -use std::sync::Arc; -use std::time::{Duration, Instant}; - -use codec::{Decode, Encode}; -use extrinsic_store::Store as ExtrinsicStore; -use polkadot_api::PolkadotApi; -use polkadot_primitives::{AccountId, Hash, Block, BlockId, BlockNumber, Header, Timestamp, SessionKey}; -use polkadot_primitives::parachain::{Id as ParaId, Chain, DutyRoster, BlockData, Extrinsic as ParachainExtrinsic, CandidateReceipt, CandidateSignature}; -use primitives::AuthorityId; -use transaction_pool::TransactionPool; -use tokio::runtime::TaskExecutor; -use tokio::timer::{Delay, Interval}; - -use futures::prelude::*; -use futures::future; -use collation::CollationFetch; -use dynamic_inclusion::DynamicInclusion; -use parking_lot::RwLock; - -pub use self::collation::{validate_collation, Collators}; -pub use self::error::{ErrorKind, Error}; -pub use self::offline_tracker::OfflineTracker; -pub use self::shared_table::{SharedTable, StatementProducer, ProducedStatements, Statement, SignedStatement, GenericStatement}; -pub use service::Service; - -mod dynamic_inclusion; -mod evaluation; -mod error; -mod offline_tracker; -mod service; -mod shared_table; - -pub mod collation; - -/// Shared offline validator tracker. -pub type SharedOfflineTracker = Arc<RwLock<OfflineTracker>>; - -// block size limit. -const MAX_TRANSACTIONS_SIZE: usize = 4 * 1024 * 1024; - -/// A handle to a statement table router. -/// -/// This is expected to be a lightweight, shared type like an `Arc`. -pub trait TableRouter: Clone { - /// Errors when fetching data from the network. - type Error; - /// Future that resolves when candidate data is fetched. - type FetchCandidate: IntoFuture<Item=BlockData,Error=Self::Error>; - /// Future that resolves when extrinsic candidate data is fetched. - type FetchExtrinsic: IntoFuture<Item=ParachainExtrinsic,Error=Self::Error>; - - /// Call with local candidate data. This will make the data available on the network, - /// and sign, import, and broadcast a statement about the candidate. - fn local_candidate(&self, candidate: CandidateReceipt, block_data: BlockData, extrinsic: ParachainExtrinsic); - - /// Fetch block data for a specific candidate. - fn fetch_block_data(&self, candidate: &CandidateReceipt) -> Self::FetchCandidate; - - /// Fetch extrinsic data for a specific candidate. - fn fetch_extrinsic_data(&self, candidate: &CandidateReceipt) -> Self::FetchExtrinsic; -} - -/// A long-lived network which can create parachain statement and BFT message routing processes on demand. -pub trait Network { - /// The table router type. This should handle importing of any statements, - /// routing statements to peers, and driving completion of any `StatementProducers`. - type TableRouter: TableRouter; - /// The input stream of BFT messages. Should never logically conclude. - type Input: Stream<Item=bft::Communication<Block>,Error=Error>; - /// The output sink of BFT messages. Messages sent here should eventually pass to all - /// current authorities. - type Output: Sink<SinkItem=bft::Communication<Block>,SinkError=Error>; - - /// Instantiate a table router using the given shared table and task executor. - fn communication_for(&self, validators: &[SessionKey], table: Arc<SharedTable>, task_executor: TaskExecutor) -> (Self::TableRouter, Self::Input, Self::Output); -} - -/// Information about a specific group. -#[derive(Debug, Clone, Default)] -pub struct GroupInfo { - /// Authorities meant to check validity of candidates. - pub validity_guarantors: HashSet<SessionKey>, - /// Authorities meant to check availability of candidate data. - pub availability_guarantors: HashSet<SessionKey>, - /// Number of votes needed for validity. - pub needed_validity: usize, - /// Number of votes needed for availability. - pub needed_availability: usize, -} - -/// Sign a table statement against a parent hash. -/// The actual message signed is the encoded statement concatenated with the -/// parent hash. -pub fn sign_table_statement(statement: &Statement, key: &ed25519::Pair, parent_hash: &Hash) -> CandidateSignature { - let mut encoded = statement.encode(); - encoded.extend(&parent_hash.0); - - key.sign(&encoded).into() -} - -/// Check signature on table statement. -pub fn check_statement(statement: &Statement, signature: &CandidateSignature, signer: SessionKey, parent_hash: &Hash) -> bool { - use runtime_primitives::traits::Verify; - - let mut encoded = statement.encode(); - encoded.extend(&parent_hash.0); - - signature.verify(&encoded[..], &signer.into()) -} - -fn make_group_info(roster: DutyRoster, authorities: &[AuthorityId], local_id: AuthorityId) -> Result<(HashMap<ParaId, GroupInfo>, LocalDuty), Error> { - if roster.validator_duty.len() != authorities.len() { - bail!(ErrorKind::InvalidDutyRosterLength(authorities.len(), roster.validator_duty.len())) - } - - if roster.guarantor_duty.len() != authorities.len() { - bail!(ErrorKind::InvalidDutyRosterLength(authorities.len(), roster.guarantor_duty.len())) - } - - let mut local_validation = None; - let mut map = HashMap::new(); - - let duty_iter = authorities.iter().zip(&roster.validator_duty).zip(&roster.guarantor_duty); - for ((authority, v_duty), a_duty) in duty_iter { - if authority == &local_id { - local_validation = Some(v_duty.clone()); - } - - match *v_duty { - Chain::Relay => {}, // does nothing for now. - Chain::Parachain(ref id) => { - map.entry(id.clone()).or_insert_with(GroupInfo::default) - .validity_guarantors - .insert(authority.clone()); - } - } - - match *a_duty { - Chain::Relay => {}, // does nothing for now. - Chain::Parachain(ref id) => { - map.entry(id.clone()).or_insert_with(GroupInfo::default) - .availability_guarantors - .insert(authority.clone()); - } - } - } - - for live_group in map.values_mut() { - let validity_len = live_group.validity_guarantors.len(); - let availability_len = live_group.availability_guarantors.len(); - - live_group.needed_validity = validity_len / 2 + validity_len % 2; - live_group.needed_availability = availability_len / 2 + availability_len % 2; - } - - match local_validation { - Some(local_validation) => { - let local_duty = LocalDuty { - validation: local_validation, - }; - - Ok((map, local_duty)) - } - None => bail!(ErrorKind::NotValidator(local_id)), - } -} - -/// Polkadot proposer factory. -pub struct ProposerFactory<C, N, P> { - /// The client instance. - pub client: Arc<P>, - /// The transaction pool. - pub transaction_pool: Arc<TransactionPool<P>>, - /// The backing network handle. - pub network: N, - /// Parachain collators. - pub collators: C, - /// handle to remote task executor - pub handle: TaskExecutor, - /// The duration after which parachain-empty blocks will be allowed. - pub parachain_empty_duration: Duration, - /// Store for extrinsic data. - pub extrinsic_store: ExtrinsicStore, - /// Offline-tracker. - pub offline: SharedOfflineTracker, -} - -impl<C, N, P> bft::Environment<Block> for ProposerFactory<C, N, P> - where - C: Collators + Send + 'static, - N: Network, - P: PolkadotApi + Send + Sync + 'static, - <C::Collation as IntoFuture>::Future: Send + 'static, - N::TableRouter: Send + 'static, -{ - type Proposer = Proposer<P>; - type Input = N::Input; - type Output = N::Output; - type Error = Error; - - fn init( - &self, - parent_header: &Header, - authorities: &[AuthorityId], - sign_with: Arc<ed25519::Pair>, - ) -> Result<(Self::Proposer, Self::Input, Self::Output), Error> { - use runtime_primitives::traits::{Hash as HashT, BlakeTwo256}; - - let parent_hash = parent_header.hash().into(); - - let id = BlockId::hash(parent_hash); - let duty_roster = self.client.duty_roster(&id)?; - let random_seed = self.client.random_seed(&id)?; - let random_seed = BlakeTwo256::hash(&*random_seed); - - let validators = self.client.validators(&id)?; - self.offline.write().note_new_block(&validators[..]); - - let (group_info, local_duty) = make_group_info( - duty_roster, - authorities, - sign_with.public().into(), - )?; - - info!("Starting consensus session on top of parent {:?}. Local parachain duty is {:?}", - parent_hash, local_duty.validation); - - let active_parachains = self.client.active_parachains(&id)?; - - debug!(target: "consensus", "Active parachains: {:?}", active_parachains); - - let n_parachains = active_parachains.len(); - let table = Arc::new(SharedTable::new(group_info, sign_with.clone(), parent_hash, self.extrinsic_store.clone())); - let (router, input, output) = self.network.communication_for( - authorities, - table.clone(), - self.handle.clone() - ); - - let now = Instant::now(); - let dynamic_inclusion = DynamicInclusion::new( - n_parachains, - now, - self.parachain_empty_duration.clone(), - ); - - let validation_para = match local_duty.validation { - Chain::Relay => None, - Chain::Parachain(id) => Some(id), - }; - - let collation_work = validation_para.map(|para| CollationFetch::new( - para, - id.clone(), - parent_hash.clone(), - self.collators.clone(), - self.client.clone(), - )); - let drop_signal = dispatch_collation_work( - router.clone(), - &self.handle, - collation_work, - self.extrinsic_store.clone(), - ); - - let proposer = Proposer { - client: self.client.clone(), - dynamic_inclusion, - local_key: sign_with, - parent_hash, - parent_id: id, - parent_number: parent_header.number, - random_seed, - table, - transaction_pool: self.transaction_pool.clone(), - offline: self.offline.clone(), - validators, - _drop_signal: drop_signal, - }; - - Ok((proposer, input, output)) - } -} - -// dispatch collation work to be done in the background. returns a signal object -// that should fire when the collation work is no longer necessary (e.g. when the proposer object is dropped) -fn dispatch_collation_work<R, C, P>( - router: R, - handle: &TaskExecutor, - work: Option<CollationFetch<C, P>>, - extrinsic_store: ExtrinsicStore, -) -> exit_future::Signal where - C: Collators + Send + 'static, - P: PolkadotApi + Send + Sync + 'static, - <C::Collation as IntoFuture>::Future: Send + 'static, - R: TableRouter + Send + 'static, -{ - use extrinsic_store::Data; - - let (signal, exit) = exit_future::signal(); - - let work = match work { - Some(w) => w, - None => return signal, - }; - - let relay_parent = work.relay_parent(); - let handled_work = work.then(move |result| match result { - Ok((collation, extrinsic)) => { - let res = extrinsic_store.make_available(Data { - relay_parent, - parachain_id: collation.receipt.parachain_index, - candidate_hash: collation.receipt.hash(), - block_data: collation.block_data.clone(), - extrinsic: Some(extrinsic.clone()), - }); - - match res { - Ok(()) => - router.local_candidate(collation.receipt, collation.block_data, extrinsic), - Err(e) => - warn!(target: "consensus", "Failed to make collation data available: {:?}", e), - } - - Ok(()) - } - Err(_e) => { - warn!(target: "consensus", "Failed to collate candidate"); - Ok(()) - } - }); - - let cancellable_work = handled_work.select(exit).then(|_| Ok(())); - - // spawn onto thread pool. - handle.spawn(cancellable_work); - signal -} - -struct LocalDuty { - validation: Chain, -} - -/// The Polkadot proposer logic. -pub struct Proposer<C: PolkadotApi> { - client: Arc<C>, - dynamic_inclusion: DynamicInclusion, - local_key: Arc<ed25519::Pair>, - parent_hash: Hash, - parent_id: BlockId, - parent_number: BlockNumber, - random_seed: Hash, - table: Arc<SharedTable>, - transaction_pool: Arc<TransactionPool<C>>, - offline: SharedOfflineTracker, - validators: Vec<AccountId>, - _drop_signal: exit_future::Signal, -} - -impl<C: PolkadotApi + Send + Sync> Proposer<C> { - fn primary_index(&self, round_number: usize, len: usize) -> usize { - use primitives::uint::U256; - - let big_len = U256::from(len); - let offset = U256::from_big_endian(&self.random_seed.0) % big_len; - let offset = offset.low_u64() as usize + round_number; - offset % len - } -} - -impl<C> bft::Proposer<Block> for Proposer<C> - where - C: PolkadotApi + Send + Sync, -{ - type Error = Error; - type Create = future::Either< - CreateProposal<C>, - future::FutureResult<Block, Error>, - >; - type Evaluate = Box<Future<Item=bool, Error=Error>>; - - fn propose(&self) -> Self::Create { - const ATTEMPT_PROPOSE_EVERY: Duration = Duration::from_millis(100); - - let initial_included = self.table.includable_count(); - let now = Instant::now(); - let enough_candidates = self.dynamic_inclusion.acceptable_in( - now, - initial_included, - ).unwrap_or_else(|| now + Duration::from_millis(1)); - - let timing = ProposalTiming { - attempt_propose: Interval::new(now + ATTEMPT_PROPOSE_EVERY, ATTEMPT_PROPOSE_EVERY), - enough_candidates: Delay::new(enough_candidates), - dynamic_inclusion: self.dynamic_inclusion.clone(), - last_included: initial_included, - }; - - future::Either::A(CreateProposal { - parent_hash: self.parent_hash.clone(), - parent_number: self.parent_number.clone(), - parent_id: self.parent_id.clone(), - client: self.client.clone(), - transaction_pool: self.transaction_pool.clone(), - table: self.table.clone(), - offline: self.offline.clone(), - validators: self.validators.clone(), - timing, - }) - } - - 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) { - Ok(x) => x, - Err(e) => return Box::new(future::err(e.into())) as Box<_>, - }; - - let current_timestamp = current_timestamp(); - - // do initial serialization and structural integrity checks. - let maybe_proposal = evaluation::evaluate_initial( - unchecked_proposal, - current_timestamp, - &self.parent_hash, - self.parent_number, - &active_parachains, - ); - - let proposal = match maybe_proposal { - Ok(p) => p, - Err(e) => { - // TODO: these errors are easily re-checked in runtime. - debug!(target: "bft", "Invalid proposal: {:?}", e); - return Box::new(future::ok(false)); - } - }; - - let vote_delays = { - let now = Instant::now(); - - let included_candidate_hashes = proposal - .parachain_heads() - .iter() - .map(|candidate| candidate.hash()); - - // delay casting vote until we have proof that all candidates are - // includable. - let includability_tracker = self.table.track_includability(included_candidate_hashes) - .map_err(|_| ErrorKind::PrematureDestruction.into()); - - // the duration at which the given number of parachains is acceptable. - let count_delay = self.dynamic_inclusion.acceptable_in( - now, - proposal.parachain_heads().len(), - ); - - // the duration until the given timestamp is current - let proposed_timestamp = proposal.timestamp(); - let timestamp_delay = if proposed_timestamp > current_timestamp { - Some(now + Duration::from_secs(proposed_timestamp - current_timestamp)) - } else { - None - }; - - // delay casting vote until able according to minimum block time, - // timestamp delay, and count delay. - // construct a future from the maximum of the two durations. - let max_delay = ::std::cmp::max(timestamp_delay, count_delay); - - let temporary_delay = match max_delay { - Some(duration) => future::Either::A( - Delay::new(duration).map_err(|e| Error::from(ErrorKind::Timer(e))) - ), - None => future::Either::B(future::ok(())), - }; - - includability_tracker.join(temporary_delay) - }; - - // refuse to vote if this block says a validator is offline that we - // think isn't. - let offline = proposal.noted_offline(); - if !self.offline.read().check_consistency(&self.validators[..], offline) { - return Box::new(futures::empty()); - } - - // 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, unchecked_proposal.clone()) - .map_err(Into::into); - - let future = future::result(evaluated).and_then(move |good| { - let end_result = future::ok(good); - if good { - // delay a "good" vote. - future::Either::A(vote_delays.and_then(|_| end_result)) - } else { - // don't delay a "bad" evaluation. - future::Either::B(end_result) - } - }); - - Box::new(future) as Box<_> - } - - fn round_proposer(&self, round_number: usize, authorities: &[AuthorityId]) -> AuthorityId { - let offset = self.primary_index(round_number, authorities.len()); - let proposer = authorities[offset].clone(); - trace!(target: "bft", "proposer for round {} is {}", round_number, proposer); - - proposer - } - - fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, bft::Misbehavior<Hash>)>) { - use rhododendron::Misbehavior as GenericMisbehavior; - use runtime_primitives::bft::{MisbehaviorKind, MisbehaviorReport}; - use runtime_primitives::MaybeUnsigned; - use polkadot_runtime::{Call, Extrinsic, BareExtrinsic, UncheckedExtrinsic, ConsensusCall}; - - let local_id = self.local_key.public().0.into(); - let mut next_index = { - let cur_index = self.transaction_pool.cull_and_get_pending(BlockId::hash(self.parent_hash), |pending| pending - .filter(|tx| tx.sender().map(|s| s == local_id).unwrap_or(false)) - .last() - .map(|tx| Ok(tx.index())) - .unwrap_or_else(|| self.client.index(&self.parent_id, local_id)) - ); - - match cur_index { - Ok(Ok(cur_index)) => cur_index + 1, - Ok(Err(e)) => { - warn!(target: "consensus", "Error computing next transaction index: {}", e); - return; - } - Err(e) => { - warn!(target: "consensus", "Error computing next transaction index: {}", e); - return; - } - } - }; - - for (target, misbehavior) in misbehavior { - let report = MisbehaviorReport { - parent_hash: self.parent_hash, - parent_number: self.parent_number, - target, - misbehavior: match misbehavior { - GenericMisbehavior::ProposeOutOfTurn(_, _, _) => continue, - GenericMisbehavior::DoublePropose(_, _, _) => continue, - GenericMisbehavior::DoublePrepare(round, (h1, s1), (h2, s2)) - => MisbehaviorKind::BftDoublePrepare(round as u32, (h1, s1.signature), (h2, s2.signature)), - GenericMisbehavior::DoubleCommit(round, (h1, s1), (h2, s2)) - => MisbehaviorKind::BftDoubleCommit(round as u32, (h1, s1.signature), (h2, s2.signature)), - } - }; - let extrinsic = BareExtrinsic { - signed: local_id, - index: next_index, - function: Call::Consensus(ConsensusCall::report_misbehavior(report)), - }; - - next_index += 1; - - let signature = MaybeUnsigned(self.local_key.sign(&extrinsic.encode()).into()); - - let extrinsic = Extrinsic { - signed: extrinsic.signed.into(), - index: extrinsic.index, - function: extrinsic.function, - }; - let uxt = UncheckedExtrinsic::new(extrinsic, signature); - - self.transaction_pool.import_unchecked_extrinsic(BlockId::hash(self.parent_hash), uxt) - .expect("locally signed extrinsic is valid; qed"); - } - } - - fn on_round_end(&self, round_number: usize, was_proposed: bool) { - let primary_validator = self.validators[ - self.primary_index(round_number, self.validators.len()) - ]; - - - // alter the message based on whether we think the empty proposer was forced to skip the round. - // this is determined by checking if our local validator would have been forced to skip the round. - let consider_online = was_proposed || { - let forced_delay = self.dynamic_inclusion.acceptable_in(Instant::now(), self.table.includable_count()); - let public = ::ed25519::Public::from_raw(primary_validator.0); - match forced_delay { - None => info!( - "Potential Offline Validator: {} failed to propose during assigned slot: {}", - public, - round_number, - ), - Some(_) => info!( - "Potential Offline Validator {} potentially forced to skip assigned slot: {}", - public, - round_number, - ), - } - - forced_delay.is_some() - }; - - self.offline.write().note_round_end(primary_validator, consider_online); - } -} - -fn current_timestamp() -> Timestamp { - use std::time; - - time::SystemTime::now().duration_since(time::UNIX_EPOCH) - .expect("now always later than unix epoch; qed") - .as_secs() -} - -struct ProposalTiming { - attempt_propose: Interval, - dynamic_inclusion: DynamicInclusion, - enough_candidates: Delay, - last_included: usize, -} - -impl ProposalTiming { - // whether it's time to attempt a proposal. - // shouldn't be called outside of the context of a task. - fn poll(&mut self, included: usize) -> Poll<(), ErrorKind> { - // first drain from the interval so when the minimum delay is up - // we don't have any notifications built up. - // - // this interval is just meant to produce periodic task wakeups - // that lead to the `dynamic_inclusion` getting updated as necessary. - if let Async::Ready(x) = self.attempt_propose.poll().map_err(ErrorKind::Timer)? { - x.expect("timer still alive; intervals never end; qed"); - } - - if included == self.last_included { - return self.enough_candidates.poll().map_err(ErrorKind::Timer); - } - - // the amount of includable candidates has changed. schedule a wakeup - // if it's not sufficient anymore. - match self.dynamic_inclusion.acceptable_in(Instant::now(), included) { - Some(instant) => { - self.last_included = included; - self.enough_candidates.reset(instant); - self.enough_candidates.poll().map_err(ErrorKind::Timer) - } - None => Ok(Async::Ready(())), - } - } -} - -/// Future which resolves upon the creation of a proposal. -pub struct CreateProposal<C: PolkadotApi> { - parent_hash: Hash, - parent_number: BlockNumber, - parent_id: BlockId, - client: Arc<C>, - transaction_pool: Arc<TransactionPool<C>>, - table: Arc<SharedTable>, - timing: ProposalTiming, - validators: Vec<AccountId>, - offline: SharedOfflineTracker, -} - -impl<C> CreateProposal<C> where C: PolkadotApi { - fn propose_with(&self, candidates: Vec<CandidateReceipt>) -> Result<Block, Error> { - use polkadot_api::BlockBuilder; - use runtime_primitives::traits::{Hash as HashT, BlakeTwo256}; - use polkadot_primitives::InherentData; - - const MAX_VOTE_OFFLINE_SECONDS: Duration = Duration::from_secs(60); - - // TODO: handle case when current timestamp behind that in state. - let timestamp = current_timestamp(); - - let elapsed_since_start = self.timing.dynamic_inclusion.started_at().elapsed(); - let offline_indices = if elapsed_since_start > MAX_VOTE_OFFLINE_SECONDS { - Vec::new() - } else { - self.offline.read().reports(&self.validators[..]) - }; - - if !offline_indices.is_empty() { - info!( - "Submitting offline validators {:?} for slash-vote", - offline_indices.iter().map(|&i| self.validators[i as usize]).collect::<Vec<_>>(), - ) - } - - let inherent_data = InherentData { - timestamp, - parachain_heads: candidates, - offline_indices, - }; - - let mut block_builder = self.client.build_block(&self.parent_id, inherent_data)?; - - { - let mut unqueue_invalid = Vec::new(); - let result = self.transaction_pool.cull_and_get_pending(BlockId::hash(self.parent_hash), |pending_iterator| { - let mut pending_size = 0; - for pending in pending_iterator { - if pending_size + pending.encoded_size() >= MAX_TRANSACTIONS_SIZE { break } - - match block_builder.push_extrinsic(pending.primitive_extrinsic()) { - Ok(()) => { - pending_size += pending.encoded_size(); - } - Err(e) => { - trace!(target: "transaction-pool", "Invalid transaction: {}", e); - unqueue_invalid.push(pending.hash().clone()); - } - } - } - }); - if let Err(e) = result { - warn!("Unable to get the pending set: {:?}", e); - } - - self.transaction_pool.remove(&unqueue_invalid, false); - } - - let polkadot_block = block_builder.bake()?; - - info!("Proposing block [number: {}; hash: {}; parent_hash: {}; extrinsics: [{}]]", - polkadot_block.header.number, - Hash::from(polkadot_block.header.hash()), - polkadot_block.header.parent_hash, - polkadot_block.extrinsics.iter() - .map(|xt| format!("{}", BlakeTwo256::hash_of(xt))) - .collect::<Vec<_>>() - .join(", ") - ); - - let substrate_block = Decode::decode(&mut polkadot_block.encode().as_slice()) - .expect("polkadot blocks defined to serialize to substrate blocks correctly; qed"); - - // TODO: full re-evaluation - let active_parachains = self.client.active_parachains(&self.parent_id)?; - assert!(evaluation::evaluate_initial( - &substrate_block, - timestamp, - &self.parent_hash, - self.parent_number, - &active_parachains, - ).is_ok()); - - Ok(substrate_block) - } -} - -impl<C> Future for CreateProposal<C> where C: PolkadotApi { - type Item = Block; - type Error = Error; - - fn poll(&mut self) -> Poll<Block, Error> { - // 1. try to propose if we have enough includable candidates and other - // delays have concluded. - let included = self.table.includable_count(); - try_ready!(self.timing.poll(included)); - - // 2. propose - let proposed_candidates = self.table.with_proposal(|proposed_set| { - proposed_set.into_iter().cloned().collect() - }); - - self.propose_with(proposed_candidates).map(Async::Ready) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use substrate_keyring::Keyring; - - #[test] - fn sign_and_check_statement() { - let statement: Statement = GenericStatement::Valid([1; 32].into()); - let parent_hash = [2; 32].into(); - - let sig = sign_table_statement(&statement, &Keyring::Alice.pair(), &parent_hash); - - assert!(check_statement(&statement, &sig, Keyring::Alice.to_raw_public().into(), &parent_hash)); - assert!(!check_statement(&statement, &sig, Keyring::Alice.to_raw_public().into(), &[0xff; 32].into())); - assert!(!check_statement(&statement, &sig, Keyring::Bob.to_raw_public().into(), &parent_hash)); - } -} diff --git a/substrate/polkadot/consensus/src/offline_tracker.rs b/substrate/polkadot/consensus/src/offline_tracker.rs deleted file mode 100644 index efb317ea5c9..00000000000 --- a/substrate/polkadot/consensus/src/offline_tracker.rs +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2018 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 <http://www.gnu.org/licenses/>. - -//! Tracks offline validators. - -use polkadot_primitives::AccountId; - -use std::collections::HashMap; -use std::time::{Instant, Duration}; - -// time before we report a validator. -const REPORT_TIME: Duration = Duration::from_secs(60 * 5); - -struct Observed { - last_round_end: Instant, - offline_since: Instant, -} - -impl Observed { - fn new() -> Observed { - let now = Instant::now(); - Observed { - last_round_end: now, - offline_since: now, - } - } - - fn note_round_end(&mut self, was_online: bool) { - let now = Instant::now(); - - self.last_round_end = now; - if was_online { - self.offline_since = now; - } - } - - fn is_active(&self) -> bool { - // can happen if clocks are not monotonic - if self.offline_since > self.last_round_end { return true } - self.last_round_end.duration_since(self.offline_since) < REPORT_TIME - } -} - -/// Tracks offline validators and can issue a report for those offline. -pub struct OfflineTracker { - observed: HashMap<AccountId, Observed>, -} - -impl OfflineTracker { - /// Create a new tracker. - pub fn new() -> Self { - OfflineTracker { observed: HashMap::new() } - } - - /// Note new consensus is starting with the given set of validators. - pub fn note_new_block(&mut self, validators: &[AccountId]) { - use std::collections::HashSet; - - let set: HashSet<_> = validators.iter().cloned().collect(); - self.observed.retain(|k, _| set.contains(k)); - } - - /// Note that a round has ended. - pub fn note_round_end(&mut self, validator: AccountId, was_online: bool) { - self.observed.entry(validator) - .or_insert_with(Observed::new) - .note_round_end(was_online); - } - - /// Generate a vector of indices for offline account IDs. - pub fn reports(&self, validators: &[AccountId]) -> Vec<u32> { - validators.iter() - .enumerate() - .filter_map(|(i, v)| if self.is_online(v) { - None - } else { - Some(i as u32) - }) - .collect() - } - - /// Whether reports on a validator set are consistent with our view of things. - pub fn check_consistency(&self, validators: &[AccountId], reports: &[u32]) -> bool { - reports.iter().cloned().all(|r| { - let v = match validators.get(r as usize) { - Some(v) => v, - None => return false, - }; - - // we must think all validators reported externally are offline. - let thinks_online = self.is_online(v); - !thinks_online - }) - } - - fn is_online(&self, v: &AccountId) -> bool { - self.observed.get(v).map(Observed::is_active).unwrap_or(true) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn validator_offline() { - let mut tracker = OfflineTracker::new(); - let v = [0; 32].into(); - let v2 = [1; 32].into(); - let v3 = [2; 32].into(); - tracker.note_round_end(v, true); - tracker.note_round_end(v2, true); - tracker.note_round_end(v3, true); - - let slash_time = REPORT_TIME + Duration::from_secs(5); - tracker.observed.get_mut(&v).unwrap().offline_since -= slash_time; - tracker.observed.get_mut(&v2).unwrap().offline_since -= slash_time; - - assert_eq!(tracker.reports(&[v, v2, v3]), vec![0, 1]); - - tracker.note_new_block(&[v, v3]); - assert_eq!(tracker.reports(&[v, v2, v3]), vec![0]); - } -} diff --git a/substrate/polkadot/consensus/src/service.rs b/substrate/polkadot/consensus/src/service.rs deleted file mode 100644 index d0c92962be3..00000000000 --- a/substrate/polkadot/consensus/src/service.rs +++ /dev/null @@ -1,268 +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 <http://www.gnu.org/licenses/>. - -//! Consensus service. - -/// Consensus service. A long running service that manages BFT agreement and parachain -/// candidate agreement over the network. -/// -/// This uses a handle to an underlying thread pool to dispatch heavy work -/// such as candidate verification while performing event-driven work -/// on a local event loop. - -use std::thread; -use std::time::{Duration, Instant}; -use std::sync::Arc; - -use bft::{self, BftService}; -use client::{BlockchainEvents, ChainHead, BlockBody}; -use ed25519; -use futures::prelude::*; -use polkadot_api::LocalPolkadotApi; -use polkadot_primitives::{Block, Header}; -use transaction_pool::TransactionPool; -use extrinsic_store::Store as ExtrinsicStore; - -use tokio::executor::current_thread::TaskExecutor as LocalThreadHandle; -use tokio::runtime::TaskExecutor as ThreadPoolHandle; -use tokio::runtime::current_thread::Runtime as LocalRuntime; -use tokio::timer::{Delay, Interval}; - -use super::{Network, Collators, ProposerFactory}; -use error; - -const TIMER_DELAY_MS: u64 = 5000; -const TIMER_INTERVAL_MS: u64 = 500; - -// spin up an instance of BFT agreement on the current thread's executor. -// panics if there is no current thread executor. -fn start_bft<F, C>( - header: Header, - bft_service: Arc<BftService<Block, F, C>>, -) where - F: bft::Environment<Block> + 'static, - C: bft::BlockImport<Block> + bft::Authorities<Block> + 'static, - F::Error: ::std::fmt::Debug, - <F::Proposer as bft::Proposer<Block>>::Error: ::std::fmt::Display + Into<error::Error>, - <F as bft::Environment<Block>>::Error: ::std::fmt::Display -{ - const DELAY_UNTIL: Duration = Duration::from_millis(5000); - - let mut handle = LocalThreadHandle::current(); - let work = Delay::new(Instant::now() + DELAY_UNTIL) - .then(move |res| { - if let Err(e) = res { - warn!(target: "bft", "Failed to force delay of consensus: {:?}", e); - } - - match bft_service.build_upon(&header) { - Ok(maybe_bft_work) => { - if maybe_bft_work.is_some() { - debug!(target: "bft", "Starting agreement. After forced delay for {:?}", - DELAY_UNTIL); - } - - maybe_bft_work - } - Err(e) => { - warn!(target: "bft", "BFT agreement error: {}", e); - None - } - } - }) - .map(|_| ()); - - if let Err(e) = handle.spawn_local(Box::new(work)) { - debug!(target: "bft", "Couldn't initialize BFT agreement: {:?}", e); - } -} - -// creates a task to prune redundant entries in availability store upon block finalization -// -// NOTE: this will need to be changed to finality notification rather than -// block import notifications when the consensus switches to non-instant finality. -fn prune_unneeded_availability<C>(client: Arc<C>, extrinsic_store: ExtrinsicStore) - -> impl Future<Item=(),Error=()> + Send - where C: Send + Sync + BlockchainEvents<Block> + BlockBody<Block> + 'static -{ - use codec::{Encode, Decode}; - use polkadot_primitives::BlockId; - use polkadot_runtime::CheckedBlock; - - enum NotifyError { - NoBody, - BodyFetch(::client::error::Error), - UnexpectedFormat, - ExtrinsicsWrong, - } - - impl NotifyError { - fn log(&self, hash: &::polkadot_primitives::Hash) { - match *self { - NotifyError::NoBody => warn!("No block body for imported block {:?}", hash), - NotifyError::BodyFetch(ref err) => warn!("Failed to fetch block body for imported block {:?}: {:?}", hash, err), - NotifyError::UnexpectedFormat => warn!("Consensus outdated: Block {:?} has unexpected body format", hash), - NotifyError::ExtrinsicsWrong => warn!("Consensus outdated: Extrinsics cannot be decoded for {:?}", hash), - } - } - } - - client.import_notification_stream() - .for_each(move |notification| { - let hash = notification.hash; - let parent_hash = notification.header.parent_hash; - let checked_block = client.block_body(&BlockId::hash(hash)) - .map_err(NotifyError::BodyFetch) - .and_then(|maybe_body| maybe_body.ok_or(NotifyError::NoBody)) - .map(|extrinsics| Block { header: notification.header, extrinsics }) - .map(|b: Block| ::polkadot_runtime::Block::decode(&mut b.encode().as_slice())) - .and_then(|maybe_block| maybe_block.ok_or(NotifyError::UnexpectedFormat)) - .and_then(|block| CheckedBlock::new(block).map_err(|_| NotifyError::ExtrinsicsWrong)); - - match checked_block { - Ok(block) => { - let candidate_hashes = block.parachain_heads().iter().map(|c| c.hash()).collect(); - if let Err(e) = extrinsic_store.candidates_finalized(parent_hash, candidate_hashes) { - warn!(target: "consensus", "Failed to prune unneeded available data: {:?}", e); - } - } - Err(e) => e.log(&hash) - } - - Ok(()) - }) -} - -/// Consensus service. Starts working when created. -pub struct Service { - thread: Option<thread::JoinHandle<()>>, - exit_signal: Option<::exit_future::Signal>, -} - -impl Service { - /// Create and start a new instance. - pub fn new<A, C, N>( - client: Arc<C>, - api: Arc<A>, - network: N, - transaction_pool: Arc<TransactionPool<A>>, - thread_pool: ThreadPoolHandle, - parachain_empty_duration: Duration, - key: ed25519::Pair, - extrinsic_store: ExtrinsicStore, - ) -> Service - where - A: LocalPolkadotApi + Send + Sync + 'static, - C: BlockchainEvents<Block> + ChainHead<Block> + BlockBody<Block>, - C: bft::BlockImport<Block> + bft::Authorities<Block> + Send + Sync + 'static, - N: Network + Collators + Send + 'static, - N::TableRouter: Send + 'static, - <N::Collation as IntoFuture>::Future: Send + 'static, - { - use parking_lot::RwLock; - use super::OfflineTracker; - - let (signal, exit) = ::exit_future::signal(); - let thread = thread::spawn(move || { - let mut runtime = LocalRuntime::new().expect("Could not create local runtime"); - let key = Arc::new(key); - - let factory = ProposerFactory { - client: api.clone(), - transaction_pool: transaction_pool.clone(), - collators: network.clone(), - network, - parachain_empty_duration, - handle: thread_pool.clone(), - extrinsic_store: extrinsic_store.clone(), - offline: Arc::new(RwLock::new(OfflineTracker::new())), - }; - let bft_service = Arc::new(BftService::new(client.clone(), key, factory)); - - let notifications = { - let client = client.clone(); - let bft_service = bft_service.clone(); - - client.import_notification_stream().for_each(move |notification| { - if notification.is_new_best { - start_bft(notification.header, bft_service.clone()); - } - Ok(()) - }) - }; - - let interval = Interval::new( - Instant::now() + Duration::from_millis(TIMER_DELAY_MS), - Duration::from_millis(TIMER_INTERVAL_MS), - ); - - let mut prev_best = match client.best_block_header() { - Ok(header) => header.hash(), - Err(e) => { - warn!("Cant's start consensus service. Error reading best block header: {:?}", e); - return; - } - }; - - let timed = { - let c = client.clone(); - let s = bft_service.clone(); - - interval.map_err(|e| debug!("Timer error: {:?}", e)).for_each(move |_| { - if let Ok(best_block) = c.best_block_header() { - let hash = best_block.hash(); - if hash == prev_best && s.live_agreement() != Some(hash) { - debug!("Starting consensus round after a timeout"); - start_bft(best_block, s.clone()); - } - prev_best = hash; - } - Ok(()) - }) - }; - - runtime.spawn(notifications); - runtime.spawn(timed); - - let prune_available = prune_unneeded_availability(client, extrinsic_store) - .select(exit.clone()) - .then(|_| Ok(())); - - // spawn this on the tokio executor since it's fine on a thread pool. - thread_pool.spawn(prune_available); - - if let Err(e) = runtime.block_on(exit) { - debug!("BFT event loop error {:?}", e); - } - }); - Service { - thread: Some(thread), - exit_signal: Some(signal), - } - } -} - -impl Drop for Service { - fn drop(&mut self) { - if let Some(signal) = self.exit_signal.take() { - signal.fire(); - } - - if let Some(thread) = self.thread.take() { - thread.join().expect("The service thread has panicked"); - } - } -} diff --git a/substrate/polkadot/consensus/src/shared_table/includable.rs b/substrate/polkadot/consensus/src/shared_table/includable.rs deleted file mode 100644 index 873c3af94c4..00000000000 --- a/substrate/polkadot/consensus/src/shared_table/includable.rs +++ /dev/null @@ -1,137 +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 <http://www.gnu.org/licenses/>. - -//! Implements a future which resolves when all of the candidates referenced are includable. - -use std::collections::HashMap; - -use futures::prelude::*; -use futures::sync::oneshot; - -use polkadot_primitives::Hash; - -/// Track includability of a set of candidates, -pub(super) fn track<I: IntoIterator<Item=(Hash, bool)>>(candidates: I) -> (IncludabilitySender, Includable) { - let (tx, rx) = oneshot::channel(); - let tracking: HashMap<_, _> = candidates.into_iter().collect(); - let includable_count = tracking.values().filter(|x| **x).count(); - - let mut sender = IncludabilitySender { - tracking, - includable_count, - sender: Some(tx), - }; - - sender.try_complete(); - - ( - sender, - Includable(rx), - ) -} - -/// The sending end of the includability sender. -pub(super) struct IncludabilitySender { - tracking: HashMap<Hash, bool>, - includable_count: usize, - sender: Option<oneshot::Sender<()>>, -} - -impl IncludabilitySender { - /// update the inner candidate. wakes up the task as necessary. - /// returns `Err(Canceled)` if the other end has hung up. - /// - /// returns `true` when this is completed and should be destroyed. - pub fn update_candidate(&mut self, candidate: Hash, includable: bool) -> bool { - use std::collections::hash_map::Entry; - - match self.tracking.entry(candidate) { - Entry::Vacant(_) => {} - Entry::Occupied(mut entry) => { - let old = entry.insert(includable); - if !old && includable { - self.includable_count += 1; - } else if old && !includable { - self.includable_count -= 1; - } - } - } - - self.try_complete() - } - - /// whether the sender is completed. - pub fn is_complete(&self) -> bool { - self.sender.is_none() - } - - fn try_complete(&mut self) -> bool { - if self.includable_count == self.tracking.len() { - if let Some(sender) = self.sender.take() { - let _ = sender.send(()); - } - - true - } else { - false - } - } -} - -/// Future that resolves when all the candidates within are includable. -pub struct Includable(oneshot::Receiver<()>); - -impl Future for Includable { - type Item = (); - type Error = oneshot::Canceled; - - fn poll(&mut self) -> Poll<(), oneshot::Canceled> { - self.0.poll() - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn it_works() { - let hash1 = [1; 32].into(); - let hash2 = [2; 32].into(); - let hash3 = [3; 32].into(); - - let (mut sender, recv) = track([ - (hash1, true), - (hash2, true), - (hash2, false), // overwrite should favor latter. - (hash3, true), - ].iter().cloned()); - - assert!(!sender.is_complete()); - - // true -> false transition is possible and should be handled. - sender.update_candidate(hash1, false); - assert!(!sender.is_complete()); - - sender.update_candidate(hash2, true); - assert!(!sender.is_complete()); - - sender.update_candidate(hash1, true); - assert!(sender.is_complete()); - - recv.wait().unwrap(); - } -} diff --git a/substrate/polkadot/consensus/src/shared_table/mod.rs b/substrate/polkadot/consensus/src/shared_table/mod.rs deleted file mode 100644 index 8455ac0c10a..00000000000 --- a/substrate/polkadot/consensus/src/shared_table/mod.rs +++ /dev/null @@ -1,702 +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 <http://www.gnu.org/licenses/>. - -//! Parachain statement table meant to be shared with a message router -//! and a consensus proposer. - -use std::collections::{HashMap, HashSet}; -use std::sync::Arc; - -use extrinsic_store::{Data, Store as ExtrinsicStore}; -use table::{self, Table, Context as TableContextTrait}; -use polkadot_primitives::{Hash, SessionKey}; -use polkadot_primitives::parachain::{Id as ParaId, BlockData, Collation, Extrinsic, CandidateReceipt}; - -use parking_lot::Mutex; -use futures::{future, prelude::*}; - -use super::{GroupInfo, TableRouter}; -use self::includable::IncludabilitySender; - -mod includable; - -pub use self::includable::Includable; -pub use table::{SignedStatement, Statement}; -pub use table::generic::Statement as GenericStatement; - -struct TableContext { - parent_hash: Hash, - key: Arc<::ed25519::Pair>, - groups: HashMap<ParaId, GroupInfo>, -} - -impl table::Context for TableContext { - fn is_member_of(&self, authority: &SessionKey, group: &ParaId) -> bool { - self.groups.get(group).map_or(false, |g| g.validity_guarantors.contains(authority)) - } - - fn is_availability_guarantor_of(&self, authority: &SessionKey, group: &ParaId) -> bool { - self.groups.get(group).map_or(false, |g| g.availability_guarantors.contains(authority)) - } - - fn requisite_votes(&self, group: &ParaId) -> (usize, usize) { - self.groups.get(group).map_or( - (usize::max_value(), usize::max_value()), - |g| (g.needed_validity, g.needed_availability), - ) - } -} - -impl TableContext { - fn local_id(&self) -> SessionKey { - self.key.public().into() - } - - fn sign_statement(&self, statement: table::Statement) -> table::SignedStatement { - let signature = ::sign_table_statement(&statement, &self.key, &self.parent_hash).into(); - - table::SignedStatement { - statement, - signature, - sender: self.local_id(), - } - } -} - -// A shared table object. -struct SharedTableInner { - table: Table<TableContext>, - proposed_digest: Option<Hash>, - checked_validity: HashSet<Hash>, - checked_availability: HashSet<Hash>, - trackers: Vec<IncludabilitySender>, - extrinsic_store: ExtrinsicStore, -} - -impl SharedTableInner { - // Import a single statement. Provide a handle to a table router and a function - // used to determine if a referenced candidate is valid. - // - // the statement producer, if any, will produce only statements concerning the same candidate - // as the one just imported - fn import_remote_statement<R: TableRouter>( - &mut self, - context: &TableContext, - router: &R, - statement: table::SignedStatement, - ) -> Option<StatementProducer< - <R::FetchCandidate as IntoFuture>::Future, - <R::FetchExtrinsic as IntoFuture>::Future, - >> { - let summary = match self.table.import_statement(context, statement) { - Some(summary) => summary, - None => return None, - }; - - self.update_trackers(&summary.candidate, context); - - let local_id = context.local_id(); - - let is_validity_member = context.is_member_of(&local_id, &summary.group_id); - let is_availability_member = - context.is_availability_guarantor_of(&local_id, &summary.group_id); - - let digest = &summary.candidate; - - // TODO: consider a strategy based on the number of candidate votes as well. - // only check validity if this wasn't locally proposed. - let checking_validity = is_validity_member - && self.proposed_digest.as_ref().map_or(true, |d| d != digest) - && self.checked_validity.insert(digest.clone()); - - let checking_availability = is_availability_member - && self.checked_availability.insert(digest.clone()); - - let work = if checking_validity || checking_availability { - match self.table.get_candidate(&digest) { - None => None, // TODO: handle table inconsistency somehow? - Some(candidate) => { - let fetch_block_data = - router.fetch_block_data(candidate).into_future().fuse(); - - let fetch_extrinsic = if checking_availability { - Some( - router.fetch_extrinsic_data(candidate).into_future().fuse() - ) - } else { - None - }; - - Some(Work { - candidate_receipt: candidate.clone(), - fetch_block_data, - fetch_extrinsic, - evaluate: checking_validity, - ensure_available: checking_availability, - }) - } - } - } else { - None - }; - - work.map(|work| StatementProducer { - produced_statements: Default::default(), - extrinsic_store: self.extrinsic_store.clone(), - relay_parent: context.parent_hash.clone(), - work - }) - } - - fn update_trackers(&mut self, candidate: &Hash, context: &TableContext) { - let includable = self.table.candidate_includable(candidate, context); - for i in (0..self.trackers.len()).rev() { - if self.trackers[i].update_candidate(candidate.clone(), includable) { - self.trackers.swap_remove(i); - } - } - } -} - -/// Produced statements about a specific candidate. -/// Both may be `None`. -#[derive(Default)] -pub struct ProducedStatements { - /// A statement about the validity of the candidate. - pub validity: Option<table::Statement>, - /// A statement about availability of data. If this is `Some`, - /// then `block_data` and `extrinsic` should be `Some` as well. - pub availability: Option<table::Statement>, - /// Block data to ensure availability of. - pub block_data: Option<BlockData>, - /// Extrinsic data to ensure availability of. - pub extrinsic: Option<Extrinsic>, -} - -/// Future that produces statements about a specific candidate. -pub struct StatementProducer<D: Future, E: Future> { - produced_statements: ProducedStatements, - work: Work<D, E>, - relay_parent: Hash, - extrinsic_store: ExtrinsicStore, -} - -impl<D: Future, E: Future> StatementProducer<D, E> { - /// Attach a function for verifying fetched collation to the statement producer. - /// This will transform it into a future. - /// - /// The collation-checking function should return `true` if known to be valid, - /// `false` if known to be invalid, and `None` if unable to determine. - pub fn prime<C: FnMut(Collation) -> Option<bool>>(self, check_candidate: C) -> PrimedStatementProducer<D, E, C> { - PrimedStatementProducer { - inner: self, - check_candidate, - } - } -} - -struct Work<D: Future, E: Future> { - candidate_receipt: CandidateReceipt, - fetch_block_data: future::Fuse<D>, - fetch_extrinsic: Option<future::Fuse<E>>, - evaluate: bool, - ensure_available: bool, -} - -/// Primed statement producer. -pub struct PrimedStatementProducer<D: Future, E: Future, C> { - inner: StatementProducer<D, E>, - check_candidate: C, -} - -impl<D, E, C, Err> Future for PrimedStatementProducer<D, E, C> - where - D: Future<Item=BlockData,Error=Err>, - E: Future<Item=Extrinsic,Error=Err>, - C: FnMut(Collation) -> Option<bool>, - Err: From<::std::io::Error>, -{ - type Item = ProducedStatements; - type Error = Err; - - fn poll(&mut self) -> Poll<ProducedStatements, Err> { - let work = &mut self.inner.work; - let candidate = &work.candidate_receipt; - let statements = &mut self.inner.produced_statements; - - let mut candidate_hash = None; - let mut candidate_hash = move || - candidate_hash.get_or_insert_with(|| candidate.hash()).clone(); - - if let Async::Ready(block_data) = work.fetch_block_data.poll()? { - statements.block_data = Some(block_data.clone()); - if work.evaluate { - let is_good = (self.check_candidate)(Collation { - block_data, - receipt: work.candidate_receipt.clone(), - }); - - let hash = candidate_hash(); - - debug!(target: "consensus", "Making validity statement about candidate {}: is_good? {:?}", hash, is_good); - statements.validity = match is_good { - Some(true) => Some(GenericStatement::Valid(hash)), - Some(false) => Some(GenericStatement::Invalid(hash)), - None => None, - }; - - work.evaluate = false; - } - } - - if let Async::Ready(Some(extrinsic)) = work.fetch_extrinsic.poll()? { - if work.ensure_available { - let hash = candidate_hash(); - debug!(target: "consensus", "Claiming candidate {} available.", hash); - - statements.extrinsic = Some(extrinsic); - statements.availability = Some(GenericStatement::Available(hash)); - - work.ensure_available = false; - } - } - - let done = match (work.evaluate, work.ensure_available) { - (false, false) => true, - _ => false, - }; - - if done { - // commit claimed-available data to disk before returning statements from the future. - if let (&Some(ref block), extrinsic) = (&statements.block_data, &statements.extrinsic) { - self.inner.extrinsic_store.make_available(Data { - relay_parent: self.inner.relay_parent, - parachain_id: work.candidate_receipt.parachain_index, - candidate_hash: candidate_hash(), - block_data: block.clone(), - extrinsic: extrinsic.clone(), - })?; - } - - Ok(Async::Ready(::std::mem::replace(statements, Default::default()))) - } else { - Ok(Async::NotReady) - } - } -} - -/// A shared table object. -pub struct SharedTable { - context: Arc<TableContext>, - inner: Arc<Mutex<SharedTableInner>>, -} - -impl Clone for SharedTable { - fn clone(&self) -> Self { - SharedTable { - context: self.context.clone(), - inner: self.inner.clone(), - } - } -} - -impl SharedTable { - /// Create a new shared table. - /// - /// Provide the key to sign with, and the parent hash of the relay chain - /// block being built. - pub fn new( - groups: HashMap<ParaId, GroupInfo>, - key: Arc<::ed25519::Pair>, - parent_hash: Hash, - extrinsic_store: ExtrinsicStore, - ) -> Self { - SharedTable { - context: Arc::new(TableContext { groups, key, parent_hash }), - inner: Arc::new(Mutex::new(SharedTableInner { - table: Table::default(), - proposed_digest: None, - checked_validity: HashSet::new(), - checked_availability: HashSet::new(), - trackers: Vec::new(), - extrinsic_store, - })) - } - } - - /// Get the parent hash this table should hold statements localized to. - pub fn consensus_parent_hash(&self) -> &Hash { - &self.context.parent_hash - } - - /// Get the local validator session key. - pub fn session_key(&self) -> SessionKey { - self.context.local_id() - } - - /// Get group info. - pub fn group_info(&self) -> &HashMap<ParaId, GroupInfo> { - &self.context.groups - } - - /// Import a single statement with remote source, whose signature has already been checked. - /// - /// The statement producer, if any, will produce only statements concerning the same candidate - /// as the one just imported - pub fn import_remote_statement<R: TableRouter>( - &self, - router: &R, - statement: table::SignedStatement, - ) -> Option<StatementProducer< - <R::FetchCandidate as IntoFuture>::Future, - <R::FetchExtrinsic as IntoFuture>::Future, - >> { - self.inner.lock().import_remote_statement(&*self.context, router, statement) - } - - /// Import many statements at once. - /// - /// Provide an iterator yielding remote, pre-checked statements. - /// - /// The statement producer, if any, will produce only statements concerning the same candidate - /// as the one just imported - pub fn import_remote_statements<R, I, U>(&self, router: &R, iterable: I) -> U - where - R: TableRouter, - I: IntoIterator<Item=table::SignedStatement>, - U: ::std::iter::FromIterator<Option<StatementProducer< - <R::FetchCandidate as IntoFuture>::Future, - <R::FetchExtrinsic as IntoFuture>::Future, - >>>, - { - let mut inner = self.inner.lock(); - - iterable.into_iter().map(move |statement| { - inner.import_remote_statement(&*self.context, router, statement) - }).collect() - } - - /// Sign and import a local statement. - /// - /// For candidate statements, this may also produce a second signed statement - /// concerning the availability of the candidate data. - pub fn sign_and_import(&self, statement: table::Statement) - -> (SignedStatement, Option<SignedStatement>) - { - let (proposed_digest, availability) = match statement { - GenericStatement::Candidate(ref c) => { - let mut availability = None; - let hash = c.hash(); - - // TODO: actually store the data in an availability store of some kind. - if self.context.is_availability_guarantor_of(&self.context.local_id(), &c.parachain_index) { - availability = Some(self.context.sign_statement(GenericStatement::Available(hash))); - } - - (Some(hash), availability) - } - _ => (None, None), - }; - - let signed_statement = self.context.sign_statement(statement); - - let mut inner = self.inner.lock(); - if proposed_digest.is_some() { - inner.proposed_digest = proposed_digest; - } - - inner.table.import_statement(&*self.context, signed_statement.clone()); - - // ensure the availability statement is imported after the candidate. - if let Some(a) = availability.clone() { - inner.table.import_statement(&*self.context, a); - } - - (signed_statement, availability) - } - - /// Execute a closure using a specific candidate. - /// - /// Deadlocks if called recursively. - pub fn with_candidate<F, U>(&self, digest: &Hash, f: F) -> U - where F: FnOnce(Option<&CandidateReceipt>) -> U - { - let inner = self.inner.lock(); - f(inner.table.get_candidate(digest)) - } - - /// Execute a closure using the current proposed set. - /// - /// Deadlocks if called recursively. - pub fn with_proposal<F, U>(&self, f: F) -> U - where F: FnOnce(Vec<&CandidateReceipt>) -> U - { - let inner = self.inner.lock(); - f(inner.table.proposed_candidates(&*self.context)) - } - - /// Get the number of parachains which have available candidates. - pub fn includable_count(&self) -> usize { - self.inner.lock().table.includable_count() - } - - /// Get all witnessed misbehavior. - pub fn get_misbehavior(&self) -> HashMap<SessionKey, table::Misbehavior> { - self.inner.lock().table.get_misbehavior().clone() - } - - /// Track includability of a given set of candidate hashes. - pub fn track_includability<I>(&self, iterable: I) -> Includable - where I: IntoIterator<Item=Hash> - { - let mut inner = self.inner.lock(); - - let (tx, rx) = includable::track(iterable.into_iter().map(|x| { - let includable = inner.table.candidate_includable(&x, &*self.context); - (x, includable) - })); - - if !tx.is_complete() { - inner.trackers.push(tx); - } - - rx - } -} - -#[cfg(test)] -mod tests { - use super::*; - use substrate_keyring::Keyring; - - #[derive(Clone)] - struct DummyRouter; - impl TableRouter for DummyRouter { - type Error = ::std::io::Error; - type FetchCandidate = ::futures::future::Empty<BlockData,Self::Error>; - type FetchExtrinsic = ::futures::future::Empty<Extrinsic,Self::Error>; - - fn local_candidate(&self, _candidate: CandidateReceipt, _block_data: BlockData, _extrinsic: Extrinsic) { - - } - fn fetch_block_data(&self, _candidate: &CandidateReceipt) -> Self::FetchCandidate { - ::futures::future::empty() - } - fn fetch_extrinsic_data(&self, _candidate: &CandidateReceipt) -> Self::FetchExtrinsic { - ::futures::future::empty() - } - } - - #[test] - fn statement_triggers_fetch_and_evaluate() { - let mut groups = HashMap::new(); - - let para_id = ParaId::from(1); - let local_id = Keyring::Alice.to_raw_public().into(); - let local_key = Arc::new(Keyring::Alice.pair()); - - let validity_other = Keyring::Bob.to_raw_public().into(); - let validity_other_key = Keyring::Bob.pair(); - let parent_hash = Default::default(); - - groups.insert(para_id, GroupInfo { - validity_guarantors: [local_id, validity_other].iter().cloned().collect(), - availability_guarantors: Default::default(), - needed_validity: 2, - needed_availability: 0, - }); - - let shared_table = SharedTable::new( - groups, - local_key.clone(), - parent_hash, - ExtrinsicStore::new_in_memory(), - ); - - let candidate = CandidateReceipt { - parachain_index: para_id, - collator: [1; 32].into(), - signature: Default::default(), - head_data: ::polkadot_primitives::parachain::HeadData(vec![1, 2, 3, 4]), - balance_uploads: Vec::new(), - egress_queue_roots: Vec::new(), - fees: 1_000_000, - block_data_hash: [2; 32].into(), - }; - - let candidate_statement = GenericStatement::Candidate(candidate); - - let signature = ::sign_table_statement(&candidate_statement, &validity_other_key, &parent_hash); - let signed_statement = ::table::generic::SignedStatement { - statement: candidate_statement, - signature: signature.into(), - sender: validity_other, - }; - - let producer = shared_table.import_remote_statement( - &DummyRouter, - signed_statement, - ).expect("candidate and local validity group are same"); - - assert!(producer.work.evaluate, "should evaluate validity"); - assert!(producer.work.fetch_extrinsic.is_none(), "should not fetch extrinsic"); - } - - #[test] - fn statement_triggers_fetch_and_availability() { - let mut groups = HashMap::new(); - - let para_id = ParaId::from(1); - let local_id = Keyring::Alice.to_raw_public().into(); - let local_key = Arc::new(Keyring::Alice.pair()); - - let validity_other = Keyring::Bob.to_raw_public().into(); - let validity_other_key = Keyring::Bob.pair(); - let parent_hash = Default::default(); - - groups.insert(para_id, GroupInfo { - validity_guarantors: [validity_other].iter().cloned().collect(), - availability_guarantors: [local_id].iter().cloned().collect(), - needed_validity: 1, - needed_availability: 1, - }); - - let shared_table = SharedTable::new( - groups, - local_key.clone(), - parent_hash, - ExtrinsicStore::new_in_memory(), - ); - - let candidate = CandidateReceipt { - parachain_index: para_id, - collator: [1; 32].into(), - signature: Default::default(), - head_data: ::polkadot_primitives::parachain::HeadData(vec![1, 2, 3, 4]), - balance_uploads: Vec::new(), - egress_queue_roots: Vec::new(), - fees: 1_000_000, - block_data_hash: [2; 32].into(), - }; - - let candidate_statement = GenericStatement::Candidate(candidate); - - let signature = ::sign_table_statement(&candidate_statement, &validity_other_key, &parent_hash); - let signed_statement = ::table::generic::SignedStatement { - statement: candidate_statement, - signature: signature.into(), - sender: validity_other, - }; - - let producer = shared_table.import_remote_statement( - &DummyRouter, - signed_statement, - ).expect("should produce work"); - - assert!(producer.work.fetch_extrinsic.is_some(), "should fetch extrinsic when guaranteeing availability"); - assert!(!producer.work.evaluate, "should not evaluate validity"); - assert!(producer.work.ensure_available); - } - - #[test] - fn evaluate_makes_block_data_available() { - let store = ExtrinsicStore::new_in_memory(); - let relay_parent = [0; 32].into(); - let para_id = 5.into(); - let block_data = BlockData(vec![1, 2, 3]); - - let candidate = CandidateReceipt { - parachain_index: para_id, - collator: [1; 32].into(), - signature: Default::default(), - head_data: ::polkadot_primitives::parachain::HeadData(vec![1, 2, 3, 4]), - balance_uploads: Vec::new(), - egress_queue_roots: Vec::new(), - fees: 1_000_000, - block_data_hash: [2; 32].into(), - }; - - let hash = candidate.hash(); - - let block_data_res: ::std::io::Result<_> = Ok(block_data.clone()); - let producer: StatementProducer<_, future::Empty<_, _>> = StatementProducer { - produced_statements: Default::default(), - work: Work { - candidate_receipt: candidate, - fetch_block_data: block_data_res.into_future().fuse(), - fetch_extrinsic: None, - evaluate: true, - ensure_available: false, - }, - relay_parent, - extrinsic_store: store.clone(), - }; - - let produced = producer.prime(|_| Some(true)).wait().unwrap(); - - assert_eq!(produced.block_data.as_ref(), Some(&block_data)); - assert!(produced.validity.is_some()); - assert!(produced.availability.is_none()); - - assert_eq!(store.block_data(relay_parent, hash).unwrap(), block_data); - assert!(store.extrinsic(relay_parent, hash).is_none()); - } - - #[test] - fn full_availability() { - let store = ExtrinsicStore::new_in_memory(); - let relay_parent = [0; 32].into(); - let para_id = 5.into(); - let block_data = BlockData(vec![1, 2, 3]); - - let candidate = CandidateReceipt { - parachain_index: para_id, - collator: [1; 32].into(), - signature: Default::default(), - head_data: ::polkadot_primitives::parachain::HeadData(vec![1, 2, 3, 4]), - balance_uploads: Vec::new(), - egress_queue_roots: Vec::new(), - fees: 1_000_000, - block_data_hash: [2; 32].into(), - }; - - let hash = candidate.hash(); - - let block_data_res: ::std::io::Result<_> = Ok(block_data.clone()); - let extrinsic_res: ::std::io::Result<_> = Ok(Extrinsic); - let producer = StatementProducer { - produced_statements: Default::default(), - work: Work { - candidate_receipt: candidate, - fetch_block_data: block_data_res.into_future().fuse(), - fetch_extrinsic: Some(extrinsic_res.into_future().fuse()), - evaluate: false, - ensure_available: true, - }, - relay_parent, - extrinsic_store: store.clone(), - }; - - let produced = producer.prime(|_| Some(true)).wait().unwrap(); - - assert_eq!(produced.block_data.as_ref(), Some(&block_data)); - assert!(produced.validity.is_none()); - assert!(produced.availability.is_some()); - - assert_eq!(store.block_data(relay_parent, hash).unwrap(), block_data); - assert!(store.extrinsic(relay_parent, hash).is_some()); - } -} diff --git a/substrate/polkadot/executor/Cargo.toml b/substrate/polkadot/executor/Cargo.toml deleted file mode 100644 index e7cfc5b7720..00000000000 --- a/substrate/polkadot/executor/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "polkadot-executor" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] -description = "Polkadot node implementation in Rust." - -[dependencies] -substrate-executor = { path = "../../substrate/executor" } -polkadot-runtime = { path = "../runtime" } diff --git a/substrate/polkadot/executor/README.adoc b/substrate/polkadot/executor/README.adoc deleted file mode 100644 index 1c91cccab5f..00000000000 --- a/substrate/polkadot/executor/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Executor - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/executor/src/lib.rs b/substrate/polkadot/executor/src/lib.rs deleted file mode 100644 index 82cd5cd4785..00000000000 --- a/substrate/polkadot/executor/src/lib.rs +++ /dev/null @@ -1,23 +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 <http://www.gnu.org/licenses/>. - -//! A `CodeExecutor` specialisation which uses natively compiled runtime when the wasm to be -//! executed is equivalent to the natively compiled code. - -extern crate polkadot_runtime; -#[macro_use] extern crate substrate_executor; - -native_executor_instance!(pub Executor, polkadot_runtime::api::dispatch, polkadot_runtime::VERSION, include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm")); diff --git a/substrate/polkadot/network/Cargo.toml b/substrate/polkadot/network/Cargo.toml deleted file mode 100644 index 21fd95f71b5..00000000000 --- a/substrate/polkadot/network/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "polkadot-network" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] -description = "Polkadot-specific networking protocol" - -[dependencies] -parking_lot = "0.4" -polkadot-api = { path = "../api" } -polkadot-availability-store = { path = "../availability-store" } -polkadot-consensus = { path = "../consensus" } -polkadot-primitives = { path = "../primitives" } -substrate-bft = { path = "../../substrate/bft" } -substrate-codec = { path = "../../substrate/codec" } -substrate-codec-derive = { path = "../../substrate/codec/derive" } -substrate-network = { path = "../../substrate/network" } -substrate-primitives = { path = "../../substrate/primitives" } -ed25519 = { path = "../../substrate/ed25519" } -futures = "0.1" -tokio = "0.1.7" -log = "0.4" -rhododendron = "0.3" diff --git a/substrate/polkadot/network/README.adoc b/substrate/polkadot/network/README.adoc deleted file mode 100644 index 1c2ad29b1b0..00000000000 --- a/substrate/polkadot/network/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Network - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/network/src/collator_pool.rs b/substrate/polkadot/network/src/collator_pool.rs deleted file mode 100644 index c4541856104..00000000000 --- a/substrate/polkadot/network/src/collator_pool.rs +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright 2018 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 <http://www.gnu.org/licenses/>. - -//! Bridge between the network and consensus service for getting collations to it. - -use polkadot_primitives::{AccountId, Hash}; -use polkadot_primitives::parachain::{Id as ParaId, Collation}; - -use futures::sync::oneshot; - -use std::collections::hash_map::{HashMap, Entry}; -use std::time::{Duration, Instant}; - -const COLLATION_LIFETIME: Duration = Duration::from_secs(60 * 5); - -/// The role of the collator. Whether they're the primary or backup for this parachain. -#[derive(PartialEq, Debug, Clone, Copy, Encode, Decode)] -pub enum Role { - /// Primary collators should send collations whenever it's time. - Primary = 0, - /// Backup collators should not. - Backup = 1, -} - -/// A maintenance action for the collator set. -#[derive(PartialEq, Debug)] -#[allow(dead_code)] -pub enum Action { - /// Disconnect the given collator. - Disconnect(AccountId), - /// Give the collator a new role. - NewRole(AccountId, Role), -} - -struct CollationSlot { - live_at: Instant, - entries: SlotEntries, -} - -impl CollationSlot { - fn blank_now() -> Self { - CollationSlot { - live_at: Instant::now(), - entries: SlotEntries::Blank, - } - } - - fn stay_alive(&self, now: Instant) -> bool { - self.live_at + COLLATION_LIFETIME > now - } -} - -enum SlotEntries { - Blank, - // not queried yet - Pending(Vec<Collation>), - // waiting for next to arrive. - Awaiting(Vec<oneshot::Sender<Collation>>), -} - -impl SlotEntries { - fn received_collation(&mut self, collation: Collation) { - *self = match ::std::mem::replace(self, SlotEntries::Blank) { - SlotEntries::Blank => SlotEntries::Pending(vec![collation]), - SlotEntries::Pending(mut cs) => { - cs.push(collation); - SlotEntries::Pending(cs) - } - SlotEntries::Awaiting(senders) => { - for sender in senders { - let _ = sender.send(collation.clone()); - } - - SlotEntries::Blank - } - }; - } - - fn await_with(&mut self, sender: oneshot::Sender<Collation>) { - *self = match ::std::mem::replace(self, SlotEntries::Blank) { - SlotEntries::Blank => SlotEntries::Awaiting(vec![sender]), - SlotEntries::Awaiting(mut senders) => { - senders.push(sender); - SlotEntries::Awaiting(senders) - } - SlotEntries::Pending(mut cs) => { - let next_collation = cs.pop().expect("empty variant is always `Blank`; qed"); - let _ = sender.send(next_collation); - - if cs.is_empty() { - SlotEntries::Blank - } else { - SlotEntries::Pending(cs) - } - } - }; - } -} - -struct ParachainCollators { - primary: AccountId, - backup: Vec<AccountId>, -} - -/// Manages connected collators and role assignments from the perspective of a validator. -pub struct CollatorPool { - collators: HashMap<AccountId, ParaId>, - parachain_collators: HashMap<ParaId, ParachainCollators>, - collations: HashMap<(Hash, ParaId), CollationSlot>, -} - -impl CollatorPool { - /// Create a new `CollatorPool` object. - pub fn new() -> Self { - CollatorPool { - collators: HashMap::new(), - parachain_collators: HashMap::new(), - collations: HashMap::new(), - } - } - - /// Call when a new collator is authenticated. Returns the role. - pub fn on_new_collator(&mut self, account_id: AccountId, para_id: ParaId) -> Role { - self.collators.insert(account_id.clone(), para_id); - match self.parachain_collators.entry(para_id) { - Entry::Vacant(vacant) => { - vacant.insert(ParachainCollators { - primary: account_id, - backup: Vec::new(), - }); - - Role::Primary - }, - Entry::Occupied(mut occupied) => { - occupied.get_mut().backup.push(account_id); - - Role::Backup - } - } - } - - /// Called when a collator disconnects. If it was the primary, returns a new primary for that - /// parachain. - pub fn on_disconnect(&mut self, account_id: AccountId) -> Option<AccountId> { - self.collators.remove(&account_id).and_then(|para_id| match self.parachain_collators.entry(para_id) { - Entry::Vacant(_) => None, - Entry::Occupied(mut occ) => { - if occ.get().primary == account_id { - if occ.get().backup.is_empty() { - occ.remove(); - None - } else { - let mut collators = occ.get_mut(); - collators.primary = collators.backup.pop().expect("backup non-empty; qed"); - Some(collators.primary) - } - } else { - let pos = occ.get().backup.iter().position(|a| a == &account_id) - .expect("registered collator always present in backup if not primary; qed"); - - occ.get_mut().backup.remove(pos); - None - } - } - }) - } - - /// Called when a collation is received. - /// The collator should be registered for the parachain of the collation as a precondition of this function. - /// The collation should have been checked for integrity of signature before passing to this function. - pub fn on_collation(&mut self, account_id: AccountId, relay_parent: Hash, collation: Collation) { - if let Some(para_id) = self.collators.get(&account_id) { - debug_assert_eq!(para_id, &collation.receipt.parachain_index); - - // TODO: punish if not primary? - - self.collations.entry((relay_parent, para_id.clone())) - .or_insert_with(CollationSlot::blank_now) - .entries - .received_collation(collation); - } - } - - /// Wait for a collation from a parachain. - pub fn await_collation(&mut self, relay_parent: Hash, para_id: ParaId, sender: oneshot::Sender<Collation>) { - self.collations.entry((relay_parent, para_id)) - .or_insert_with(CollationSlot::blank_now) - .entries - .await_with(sender); - } - - /// Call periodically to perform collator set maintenance. - /// Returns a set of actions to perform on the network level. - pub fn maintain_peers(&mut self) -> Vec<Action> { - // TODO: rearrange periodically to new primary, evaluate based on latency etc. - Vec::new() - } - - /// called when a block with given hash has been imported. - pub fn collect_garbage(&mut self, chain_head: Option<&Hash>) { - let now = Instant::now(); - self.collations.retain(|&(ref h, _), slot| chain_head != Some(h) && slot.stay_alive(now)); - } -} - -#[cfg(test)] -mod tests { - use super::*; - use polkadot_primitives::parachain::{CandidateReceipt, BlockData, HeadData}; - use substrate_primitives::H512; - use futures::Future; - - #[test] - fn disconnect_primary_gives_new_primary() { - let mut pool = CollatorPool::new(); - let para_id: ParaId = 5.into(); - let bad_primary = [0; 32].into(); - let good_backup = [1; 32].into(); - - assert_eq!(pool.on_new_collator(bad_primary, para_id.clone()), Role::Primary); - assert_eq!(pool.on_new_collator(good_backup, para_id.clone()), Role::Backup); - assert_eq!(pool.on_disconnect(bad_primary), Some(good_backup)); - assert_eq!(pool.on_disconnect(good_backup), None); - } - - #[test] - fn disconnect_backup_removes_from_pool() { - let mut pool = CollatorPool::new(); - let para_id: ParaId = 5.into(); - let primary = [0; 32].into(); - let backup = [1; 32].into(); - - assert_eq!(pool.on_new_collator(primary, para_id.clone()), Role::Primary); - assert_eq!(pool.on_new_collator(backup, para_id.clone()), Role::Backup); - assert_eq!(pool.on_disconnect(backup), None); - assert!(pool.parachain_collators.get(¶_id).unwrap().backup.is_empty()); - } - - #[test] - fn await_before_collation() { - let mut pool = CollatorPool::new(); - let para_id: ParaId = 5.into(); - let primary = [0; 32].into(); - let relay_parent = [1; 32].into(); - - assert_eq!(pool.on_new_collator(primary, para_id.clone()), Role::Primary); - let (tx1, rx1) = oneshot::channel(); - let (tx2, rx2) = oneshot::channel(); - pool.await_collation(relay_parent, para_id, tx1); - pool.await_collation(relay_parent, para_id, tx2); - pool.on_collation(primary, relay_parent, Collation { - receipt: CandidateReceipt { - parachain_index: para_id, - collator: primary.into(), - signature: H512::from([2; 64]).into(), - head_data: HeadData(vec![1, 2, 3]), - balance_uploads: vec![], - egress_queue_roots: vec![], - fees: 0, - block_data_hash: [3; 32].into(), - }, - block_data: BlockData(vec![4, 5, 6]), - }); - - rx1.wait().unwrap(); - rx2.wait().unwrap(); - } - - #[test] - fn collate_before_await() { - let mut pool = CollatorPool::new(); - let para_id: ParaId = 5.into(); - let primary = [0; 32].into(); - let relay_parent = [1; 32].into(); - - assert_eq!(pool.on_new_collator(primary, para_id.clone()), Role::Primary); - - pool.on_collation(primary, relay_parent, Collation { - receipt: CandidateReceipt { - parachain_index: para_id, - collator: primary.into(), - signature: H512::from([2; 64]).into(), - head_data: HeadData(vec![1, 2, 3]), - balance_uploads: vec![], - egress_queue_roots: vec![], - fees: 0, - block_data_hash: [3; 32].into(), - }, - block_data: BlockData(vec![4, 5, 6]), - }); - - let (tx, rx) = oneshot::channel(); - pool.await_collation(relay_parent, para_id, tx); - rx.wait().unwrap(); - } - - #[test] - fn slot_stay_alive() { - let slot = CollationSlot::blank_now(); - let now = slot.live_at; - - assert!(slot.stay_alive(now)); - assert!(slot.stay_alive(now + Duration::from_secs(10))); - assert!(!slot.stay_alive(now + COLLATION_LIFETIME)); - assert!(!slot.stay_alive(now + COLLATION_LIFETIME + Duration::from_secs(10))); - } -} diff --git a/substrate/polkadot/network/src/consensus.rs b/substrate/polkadot/network/src/consensus.rs deleted file mode 100644 index e3a1c592e78..00000000000 --- a/substrate/polkadot/network/src/consensus.rs +++ /dev/null @@ -1,342 +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 <http://www.gnu.org/licenses/>. - -//! The "consensus" networking code built on top of the base network service. -//! This fulfills the `polkadot_consensus::Network` trait, providing a hook to be called -//! each time consensus begins on a new chain head. - -use bft; -use ed25519; -use substrate_network::{self as net, generic_message as msg}; -use substrate_network::consensus_gossip::ConsensusMessage; -use polkadot_api::{PolkadotApi, LocalPolkadotApi}; -use polkadot_consensus::{Network, SharedTable, Collators}; -use polkadot_primitives::{AccountId, Block, Hash, SessionKey}; -use polkadot_primitives::parachain::{Id as ParaId, Collation}; -use codec::Decode; - -use futures::prelude::*; -use futures::sync::mpsc; - -use std::sync::Arc; - -use tokio::runtime::TaskExecutor; -use parking_lot::Mutex; - -use super::{Message, NetworkService, Knowledge, CurrentConsensus}; -use router::Router; - -/// Sink for output BFT messages. -pub struct BftSink<E> { - network: Arc<NetworkService>, - parent_hash: Hash, - _marker: ::std::marker::PhantomData<E>, -} - -impl<E> Sink for BftSink<E> { - type SinkItem = bft::Communication<Block>; - // TODO: replace this with the ! type when that's stabilized - type SinkError = E; - - fn start_send(&mut self, message: bft::Communication<Block>) -> ::futures::StartSend<bft::Communication<Block>, E> { - let network_message = net::LocalizedBftMessage { - message: match message { - ::rhododendron::Communication::Consensus(c) => msg::BftMessage::Consensus(match c { - ::rhododendron::LocalizedMessage::Propose(proposal) => msg::SignedConsensusMessage::Propose(msg::SignedConsensusProposal { - round_number: proposal.round_number as u32, - proposal: proposal.proposal, - digest: proposal.digest, - sender: proposal.sender, - digest_signature: proposal.digest_signature.signature, - full_signature: proposal.full_signature.signature, - }), - ::rhododendron::LocalizedMessage::Vote(vote) => msg::SignedConsensusMessage::Vote(msg::SignedConsensusVote { - sender: vote.sender, - signature: vote.signature.signature, - vote: match vote.vote { - ::rhododendron::Vote::Prepare(r, h) => msg::ConsensusVote::Prepare(r as u32, h), - ::rhododendron::Vote::Commit(r, h) => msg::ConsensusVote::Commit(r as u32, h), - ::rhododendron::Vote::AdvanceRound(r) => msg::ConsensusVote::AdvanceRound(r as u32), - } - }), - }), - ::rhododendron::Communication::Auxiliary(justification) => { - let unchecked: bft::UncheckedJustification<_> = justification.uncheck().into(); - msg::BftMessage::Auxiliary(unchecked.into()) - } - }, - parent_hash: self.parent_hash, - }; - self.network.with_spec( - move |spec, ctx| spec.consensus_gossip.multicast_bft_message(ctx, network_message) - ); - Ok(::futures::AsyncSink::Ready) - } - - fn poll_complete(&mut self) -> ::futures::Poll<(), E> { - Ok(Async::Ready(())) - } -} - -// check signature and authority validity of message. -fn process_bft_message(msg: msg::LocalizedBftMessage<Block, Hash>, local_id: &SessionKey, authorities: &[SessionKey]) -> Result<Option<bft::Communication<Block>>, bft::Error> { - Ok(Some(match msg.message { - msg::BftMessage::Consensus(c) => ::rhododendron::Communication::Consensus(match c { - msg::SignedConsensusMessage::Propose(proposal) => ::rhododendron::LocalizedMessage::Propose({ - if &proposal.sender == local_id { return Ok(None) } - let proposal = ::rhododendron::LocalizedProposal { - round_number: proposal.round_number as usize, - proposal: proposal.proposal, - digest: proposal.digest, - sender: proposal.sender, - digest_signature: ed25519::LocalizedSignature { - signature: proposal.digest_signature, - signer: ed25519::Public(proposal.sender.into()), - }, - full_signature: ed25519::LocalizedSignature { - signature: proposal.full_signature, - signer: ed25519::Public(proposal.sender.into()), - } - }; - bft::check_proposal(authorities, &msg.parent_hash, &proposal)?; - - trace!(target: "bft", "importing proposal message for round {} from {}", proposal.round_number, Hash::from(proposal.sender.0)); - proposal - }), - msg::SignedConsensusMessage::Vote(vote) => ::rhododendron::LocalizedMessage::Vote({ - if &vote.sender == local_id { return Ok(None) } - let vote = ::rhododendron::LocalizedVote { - sender: vote.sender, - signature: ed25519::LocalizedSignature { - signature: vote.signature, - signer: ed25519::Public(vote.sender.0), - }, - vote: match vote.vote { - msg::ConsensusVote::Prepare(r, h) => ::rhododendron::Vote::Prepare(r as usize, h), - msg::ConsensusVote::Commit(r, h) => ::rhododendron::Vote::Commit(r as usize, h), - msg::ConsensusVote::AdvanceRound(r) => ::rhododendron::Vote::AdvanceRound(r as usize), - } - }; - bft::check_vote::<Block>(authorities, &msg.parent_hash, &vote)?; - - trace!(target: "bft", "importing vote {:?} from {}", vote.vote, Hash::from(vote.sender.0)); - vote - }), - }), - msg::BftMessage::Auxiliary(a) => { - let justification = bft::UncheckedJustification::from(a); - // TODO: get proper error - let justification: Result<_, bft::Error> = bft::check_prepare_justification::<Block>(authorities, msg.parent_hash, justification) - .map_err(|_| bft::ErrorKind::InvalidJustification.into()); - ::rhododendron::Communication::Auxiliary(justification?) - }, - })) -} - -// task that processes all gossipped consensus messages, -// checking signatures -struct MessageProcessTask<P: PolkadotApi> { - inner_stream: mpsc::UnboundedReceiver<ConsensusMessage<Block>>, - bft_messages: mpsc::UnboundedSender<bft::Communication<Block>>, - validators: Vec<SessionKey>, - table_router: Router<P>, -} - -impl<P: LocalPolkadotApi + Send + Sync + 'static> MessageProcessTask<P> { - fn process_message(&self, msg: ConsensusMessage<Block>) -> Option<Async<()>> { - match msg { - ConsensusMessage::Bft(msg) => { - let local_id = self.table_router.session_key(); - match process_bft_message(msg, &local_id, &self.validators[..]) { - Ok(Some(msg)) => { - if let Err(_) = self.bft_messages.unbounded_send(msg) { - // if the BFT receiving stream has ended then - // we should just bail. - trace!(target: "bft", "BFT message stream appears to have closed"); - return Some(Async::Ready(())); - } - } - Ok(None) => {} // ignored local message - Err(e) => { - debug!("Message validation failed: {:?}", e); - } - } - } - ConsensusMessage::ChainSpecific(msg, _) => { - debug!(target: "consensus", "Processing consensus statement for live consensus"); - if let Some(Message::Statement(parent_hash, statement)) = Decode::decode(&mut msg.as_slice()) { - if ::polkadot_consensus::check_statement(&statement.statement, &statement.signature, statement.sender, &parent_hash) { - self.table_router.import_statement(statement); - } - } - } - } - - None - } -} - -impl<P: LocalPolkadotApi + Send + Sync + 'static> Future for MessageProcessTask<P> { - type Item = (); - type Error = (); - - fn poll(&mut self) -> Poll<(), ()> { - loop { - match self.inner_stream.poll() { - Ok(Async::Ready(Some(val))) => if let Some(async) = self.process_message(val) { - return Ok(async); - }, - Ok(Async::Ready(None)) => return Ok(Async::Ready(())), - Ok(Async::NotReady) => return Ok(Async::NotReady), - Err(e) => debug!(target: "p_net", "Error getting consensus message: {:?}", e), - } - } - } -} - -/// Input stream from the consensus network. -pub struct InputAdapter { - input: mpsc::UnboundedReceiver<bft::Communication<Block>>, -} - -impl Stream for InputAdapter { - type Item = bft::Communication<Block>; - type Error = ::polkadot_consensus::Error; - - fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> { - match self.input.poll() { - Err(_) | Ok(Async::Ready(None)) => Err(bft::InputStreamConcluded.into()), - Ok(x) => Ok(x) - } - } -} - -/// Wrapper around the network service -pub struct ConsensusNetwork<P> { - network: Arc<NetworkService>, - api: Arc<P>, -} - -impl<P> ConsensusNetwork<P> { - /// Create a new consensus networking object. - pub fn new(network: Arc<NetworkService>, api: Arc<P>) -> Self { - ConsensusNetwork { network, api } - } -} - -impl<P> Clone for ConsensusNetwork<P> { - fn clone(&self) -> Self { - ConsensusNetwork { - network: self.network.clone(), - api: self.api.clone(), - } - } -} - -/// A long-lived network which can create parachain statement and BFT message routing processes on demand. -impl<P: LocalPolkadotApi + Send + Sync + 'static> Network for ConsensusNetwork<P> { - type TableRouter = Router<P>; - /// The input stream of BFT messages. Should never logically conclude. - type Input = InputAdapter; - /// The output sink of BFT messages. Messages sent here should eventually pass to all - /// current validators. - type Output = BftSink<::polkadot_consensus::Error>; - - /// Instantiate a table router using the given shared table. - fn communication_for(&self, validators: &[SessionKey], table: Arc<SharedTable>, task_executor: TaskExecutor) -> (Self::TableRouter, Self::Input, Self::Output) { - let parent_hash = table.consensus_parent_hash().clone(); - - let sink = BftSink { - network: self.network.clone(), - parent_hash, - _marker: Default::default(), - }; - - let (bft_send, bft_recv) = mpsc::unbounded(); - - let knowledge = Arc::new(Mutex::new(Knowledge::new())); - - let local_session_key = table.session_key(); - let table_router = Router::new( - table, - self.network.clone(), - self.api.clone(), - task_executor.clone(), - parent_hash, - knowledge.clone(), - ); - - // spin up a task in the background that processes all incoming statements - // TODO: propagate statements on a timer? - let process_task = self.network.with_spec(|spec, ctx| { - spec.new_consensus(ctx, CurrentConsensus { - knowledge, - parent_hash, - local_session_key, - }); - - MessageProcessTask { - inner_stream: spec.consensus_gossip.messages_for(parent_hash), - bft_messages: bft_send, - validators: validators.to_vec(), - table_router: table_router.clone(), - } - }); - - match process_task { - Some(task) => task_executor.spawn(task), - None => warn!(target: "p_net", "Cannot process incoming messages: network appears to be down"), - } - - (table_router, InputAdapter { input: bft_recv }, sink) - } -} - -/// Error when the network appears to be down. -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub struct NetworkDown; - -/// A future that resolves when a collation is received. -pub struct AwaitingCollation(Option<::futures::sync::oneshot::Receiver<Collation>>); - -impl Future for AwaitingCollation { - type Item = Collation; - type Error = NetworkDown; - - fn poll(&mut self) -> Poll<Collation, NetworkDown> { - match self.0.poll().map_err(|_| NetworkDown)? { - Async::Ready(None) => Err(NetworkDown), - Async::Ready(Some(x)) => Ok(Async::Ready(x)), - Async::NotReady => Ok(Async::NotReady), - } - } -} - - -impl<P: LocalPolkadotApi + Send + Sync + 'static> Collators for ConsensusNetwork<P> { - type Error = NetworkDown; - type Collation = AwaitingCollation; - - fn collate(&self, parachain: ParaId, relay_parent: Hash) -> Self::Collation { - AwaitingCollation( - self.network.with_spec(|spec, _| spec.await_collation(relay_parent, parachain)) - ) - } - - fn note_bad_collator(&self, collator: AccountId) { - self.network.with_spec(|spec, ctx| spec.disconnect_bad_collator(ctx, collator)); - } -} diff --git a/substrate/polkadot/network/src/lib.rs b/substrate/polkadot/network/src/lib.rs deleted file mode 100644 index 48b382f6625..00000000000 --- a/substrate/polkadot/network/src/lib.rs +++ /dev/null @@ -1,664 +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 <http://www.gnu.org/licenses/>. - -//! Polkadot-specific network implementation. -//! -//! This manages gossip of consensus messages for BFT and for parachain statements, -//! parachain block and extrinsic data fetching, communication between collators and validators, -//! and more. - -extern crate substrate_bft as bft; -extern crate substrate_codec as codec; -extern crate substrate_network; -extern crate substrate_primitives; - -extern crate polkadot_api; -extern crate polkadot_availability_store as av_store; -extern crate polkadot_consensus; -extern crate polkadot_primitives; - -extern crate ed25519; -extern crate futures; -extern crate parking_lot; -extern crate tokio; -extern crate rhododendron; - -#[macro_use] -extern crate log; -#[macro_use] -extern crate substrate_codec_derive; - -mod collator_pool; -mod local_collations; -mod router; -pub mod consensus; - -use codec::{Decode, Encode}; -use futures::sync::oneshot; -use parking_lot::Mutex; -use polkadot_consensus::{Statement, SignedStatement, GenericStatement}; -use polkadot_primitives::{AccountId, Block, SessionKey, Hash, Header}; -use polkadot_primitives::parachain::{Id as ParaId, BlockData, Extrinsic, CandidateReceipt, Collation}; -use substrate_network::{NodeIndex, RequestId, Context, Severity}; -use substrate_network::consensus_gossip::ConsensusGossip; -use substrate_network::{message, generic_message}; -use substrate_network::specialization::Specialization; -use substrate_network::StatusMessage as GenericFullStatus; -use self::collator_pool::{CollatorPool, Role, Action}; -use self::local_collations::LocalCollations; - -use std::collections::{HashMap, HashSet}; -use std::sync::Arc; - - -#[cfg(test)] -mod tests; - -/// Polkadot protocol id. -pub const DOT_PROTOCOL_ID: ::substrate_network::ProtocolId = *b"dot"; - -type FullStatus = GenericFullStatus<Block>; - -/// Specialization of the network service for the polkadot protocol. -pub type NetworkService = ::substrate_network::Service<Block, PolkadotProtocol>; - -/// Status of a Polkadot node. -#[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] -pub struct Status { - collating_for: Option<(AccountId, ParaId)>, -} - -struct BlockDataRequest { - attempted_peers: HashSet<SessionKey>, - consensus_parent: Hash, - candidate_hash: Hash, - block_data_hash: Hash, - sender: oneshot::Sender<BlockData>, -} - -// ensures collator-protocol messages are sent in correct order. -// session key must be sent before collator role. -enum CollatorState { - Fresh, - RolePending(Role), - Primed, -} - -impl CollatorState { - fn send_key<F: FnMut(Message)>(&mut self, key: SessionKey, mut f: F) { - f(Message::SessionKey(key)); - if let CollatorState::RolePending(role) = ::std::mem::replace(self, CollatorState::Primed) { - f(Message::CollatorRole(role)); - } - } - - fn set_role<F: FnMut(Message)>(&mut self, role: Role, mut f: F) { - if let CollatorState::Primed = *self { - f(Message::CollatorRole(role)); - } else { - *self = CollatorState::RolePending(role); - } - } -} - -struct PeerInfo { - collating_for: Option<(AccountId, ParaId)>, - validator_key: Option<SessionKey>, - claimed_validator: bool, - collator_state: CollatorState, -} - -#[derive(Default)] -struct KnowledgeEntry { - knows_block_data: Vec<SessionKey>, - knows_extrinsic: Vec<SessionKey>, - block_data: Option<BlockData>, - extrinsic: Option<Extrinsic>, -} - -/// Tracks knowledge of peers. -struct Knowledge { - candidates: HashMap<Hash, KnowledgeEntry>, -} - -impl Knowledge { - pub fn new() -> Self { - Knowledge { - candidates: HashMap::new(), - } - } - - fn note_statement(&mut self, from: SessionKey, statement: &Statement) { - match *statement { - GenericStatement::Candidate(ref c) => { - let mut entry = self.candidates.entry(c.hash()).or_insert_with(Default::default); - entry.knows_block_data.push(from); - entry.knows_extrinsic.push(from); - } - GenericStatement::Available(ref hash) => { - let mut entry = self.candidates.entry(*hash).or_insert_with(Default::default); - entry.knows_block_data.push(from); - entry.knows_extrinsic.push(from); - } - GenericStatement::Valid(ref hash) | GenericStatement::Invalid(ref hash) => self.candidates.entry(*hash) - .or_insert_with(Default::default) - .knows_block_data - .push(from), - } - } - - fn note_candidate(&mut self, hash: Hash, block_data: Option<BlockData>, extrinsic: Option<Extrinsic>) { - let entry = self.candidates.entry(hash).or_insert_with(Default::default); - entry.block_data = entry.block_data.take().or(block_data); - entry.extrinsic = entry.extrinsic.take().or(extrinsic); - } -} - -struct CurrentConsensus { - knowledge: Arc<Mutex<Knowledge>>, - parent_hash: Hash, - local_session_key: SessionKey, -} - -impl CurrentConsensus { - // get locally stored block data for a candidate. - fn block_data(&self, relay_parent: &Hash, hash: &Hash) -> Option<BlockData> { - if relay_parent != &self.parent_hash { return None } - - self.knowledge.lock().candidates.get(hash) - .and_then(|entry| entry.block_data.clone()) - } -} - -/// Polkadot-specific messages. -#[derive(Debug, Encode, Decode)] -pub enum Message { - /// signed statement and localized parent hash. - Statement(Hash, SignedStatement), - /// As a validator, tell the peer your current session key. - // TODO: do this with a cryptographic proof of some kind - SessionKey(SessionKey), - /// Requesting parachain block data by (relay_parent, candidate_hash). - RequestBlockData(RequestId, Hash, Hash), - /// Provide block data by candidate hash or nothing if unknown. - BlockData(RequestId, Option<BlockData>), - /// Tell a collator their role. - CollatorRole(Role), - /// A collation provided by a peer. Relay parent and collation. - Collation(Hash, Collation), -} - -fn send_polkadot_message(ctx: &mut Context<Block>, to: NodeIndex, message: Message) { - trace!(target: "p_net", "Sending polkadot message to {}: {:?}", to, message); - let encoded = message.encode(); - ctx.send_message(to, generic_message::Message::ChainSpecific(encoded)) -} - -/// Polkadot protocol attachment for substrate. -pub struct PolkadotProtocol { - peers: HashMap<NodeIndex, PeerInfo>, - collating_for: Option<(AccountId, ParaId)>, - consensus_gossip: ConsensusGossip<Block>, - collators: CollatorPool, - validators: HashMap<SessionKey, NodeIndex>, - local_collations: LocalCollations<Collation>, - live_consensus: Option<CurrentConsensus>, - in_flight: HashMap<(RequestId, NodeIndex), BlockDataRequest>, - pending: Vec<BlockDataRequest>, - extrinsic_store: Option<::av_store::Store>, - next_req_id: u64, -} - -impl PolkadotProtocol { - /// Instantiate a polkadot protocol handler. - pub fn new(collating_for: Option<(AccountId, ParaId)>) -> Self { - PolkadotProtocol { - peers: HashMap::new(), - consensus_gossip: ConsensusGossip::new(), - collators: CollatorPool::new(), - collating_for, - validators: HashMap::new(), - local_collations: LocalCollations::new(), - live_consensus: None, - in_flight: HashMap::new(), - pending: Vec::new(), - extrinsic_store: None, - next_req_id: 1, - } - } - - /// Gossip a consensus statement. - fn gossip_statement(&mut self, ctx: &mut Context<Block>, parent_hash: Hash, statement: SignedStatement) { - // TODO: something more targeted than gossip. - let raw = Message::Statement(parent_hash, statement).encode(); - self.consensus_gossip.multicast_chain_specific(ctx, raw, parent_hash); - } - - /// Fetch block data by candidate receipt. - fn fetch_block_data(&mut self, ctx: &mut Context<Block>, candidate: &CandidateReceipt, relay_parent: Hash) -> oneshot::Receiver<BlockData> { - let (tx, rx) = oneshot::channel(); - - self.pending.push(BlockDataRequest { - attempted_peers: Default::default(), - consensus_parent: relay_parent, - candidate_hash: candidate.hash(), - block_data_hash: candidate.block_data_hash, - sender: tx, - }); - - self.dispatch_pending_requests(ctx); - rx - } - - /// Note new consensus session. - fn new_consensus(&mut self, ctx: &mut Context<Block>, consensus: CurrentConsensus) { - let old_data = self.live_consensus.as_ref().map(|c| (c.parent_hash, c.local_session_key)); - - if Some(&consensus.local_session_key) != old_data.as_ref().map(|&(_, ref key)| key) { - for (id, peer_data) in self.peers.iter_mut() - .filter(|&(_, ref info)| info.claimed_validator || info.collating_for.is_some()) - { - peer_data.collator_state.send_key(consensus.local_session_key, |msg| send_polkadot_message( - ctx, - *id, - msg - )); - } - } - - self.live_consensus = Some(consensus); - self.consensus_gossip.collect_garbage(old_data.as_ref().map(|&(ref hash, _)| hash)); - } - - fn dispatch_pending_requests(&mut self, ctx: &mut Context<Block>) { - let consensus = match self.live_consensus { - Some(ref mut c) => c, - None => { - self.pending.clear(); - return; - } - }; - - let knowledge = consensus.knowledge.lock(); - let mut new_pending = Vec::new(); - for mut pending in ::std::mem::replace(&mut self.pending, Vec::new()) { - if pending.consensus_parent != consensus.parent_hash { continue } - - if let Some(entry) = knowledge.candidates.get(&pending.candidate_hash) { - // answer locally - if let Some(ref data) = entry.block_data { - let _ = pending.sender.send(data.clone()); - continue; - } - - let validator_keys = &mut self.validators; - let next_peer = entry.knows_block_data.iter() - .filter_map(|x| validator_keys.get(x).map(|id| (*x, *id))) - .find(|&(ref key, _)| pending.attempted_peers.insert(*key)) - .map(|(_, id)| id); - - // dispatch to peer - if let Some(who) = next_peer { - let req_id = self.next_req_id; - self.next_req_id += 1; - - send_polkadot_message( - ctx, - who, - Message::RequestBlockData(req_id, pending.consensus_parent, pending.candidate_hash) - ); - - self.in_flight.insert((req_id, who), pending); - - continue; - } - } - - new_pending.push(pending); - } - - self.pending = new_pending; - } - - fn on_polkadot_message(&mut self, ctx: &mut Context<Block>, who: NodeIndex, raw: Vec<u8>, msg: Message) { - trace!(target: "p_net", "Polkadot message from {}: {:?}", who, msg); - match msg { - Message::Statement(parent_hash, _statement) => - self.consensus_gossip.on_chain_specific(ctx, who, raw, parent_hash), - Message::SessionKey(key) => self.on_session_key(ctx, who, key), - Message::RequestBlockData(req_id, relay_parent, candidate_hash) => { - let block_data = self.live_consensus.as_ref() - .and_then(|c| c.block_data(&relay_parent, &candidate_hash)) - .or_else(|| self.extrinsic_store.as_ref() - .and_then(|s| s.block_data(relay_parent, candidate_hash)) - ); - - send_polkadot_message(ctx, who, Message::BlockData(req_id, block_data)); - } - Message::BlockData(req_id, data) => self.on_block_data(ctx, who, req_id, data), - Message::Collation(relay_parent, collation) => self.on_collation(ctx, who, relay_parent, collation), - Message::CollatorRole(role) => self.on_new_role(ctx, who, role), - } - } - - fn on_session_key(&mut self, ctx: &mut Context<Block>, who: NodeIndex, key: SessionKey) { - { - let info = match self.peers.get_mut(&who) { - Some(peer) => peer, - None => { - trace!(target: "p_net", "Network inconsistency: message received from unconnected peer {}", who); - return - } - }; - - if !info.claimed_validator { - ctx.report_peer(who, Severity::Bad("Session key broadcasted without setting authority role")); - return; - } - - if let Some(old_key) = ::std::mem::replace(&mut info.validator_key, Some(key)) { - self.validators.remove(&old_key); - - for (relay_parent, collation) in self.local_collations.fresh_key(&old_key, &key) { - send_polkadot_message( - ctx, - who, - Message::Collation(relay_parent, collation), - ) - } - - } - self.validators.insert(key, who); - } - - self.dispatch_pending_requests(ctx); - } - - fn on_block_data(&mut self, ctx: &mut Context<Block>, who: NodeIndex, req_id: RequestId, data: Option<BlockData>) { - match self.in_flight.remove(&(req_id, who)) { - Some(req) => { - if let Some(data) = data { - if data.hash() == req.block_data_hash { - let _ = req.sender.send(data); - return - } - } - - self.pending.push(req); - self.dispatch_pending_requests(ctx); - } - None => ctx.report_peer(who, Severity::Bad("Unexpected block data response")), - } - } - - // when a validator sends us (a collator) a new role. - fn on_new_role(&mut self, ctx: &mut Context<Block>, who: NodeIndex, role: Role) { - let info = match self.peers.get(&who) { - Some(peer) => peer, - None => { - trace!(target: "p_net", "Network inconsistency: message received from unconnected peer {}", who); - return - } - }; - - debug!(target: "p_net", "New collator role {:?} from {}", role, who); - - match info.validator_key { - None => ctx.report_peer( - who, - Severity::Bad("Sent collator role without registering first as validator"), - ), - Some(key) => for (relay_parent, collation) in self.local_collations.note_validator_role(key, role) { - debug!(target: "p_net", "Broadcasting collation on relay parent {:?}", relay_parent); - send_polkadot_message( - ctx, - who, - Message::Collation(relay_parent, collation), - ) - }, - } - } -} - -impl Specialization<Block> for PolkadotProtocol { - fn status(&self) -> Vec<u8> { - Status { collating_for: self.collating_for.clone() }.encode() - } - - fn on_connect(&mut self, ctx: &mut Context<Block>, who: NodeIndex, status: FullStatus) { - let local_status = match Status::decode(&mut &status.chain_status[..]) { - Some(status) => status, - None => { - Status { collating_for: None } - } - }; - - let validator = status.roles.contains(substrate_network::Roles::AUTHORITY); - let send_key = validator || local_status.collating_for.is_some(); - - let mut peer_info = PeerInfo { - collating_for: local_status.collating_for, - validator_key: None, - claimed_validator: validator, - collator_state: CollatorState::Fresh, - }; - - if let Some((ref acc_id, ref para_id)) = local_status.collating_for { - if self.collator_peer(acc_id.clone()).is_some() { - ctx.report_peer(who, Severity::Useless("Unknown Polkadot-specific reason")); - return - } - - let collator_role = self.collators.on_new_collator(acc_id.clone(), para_id.clone()); - - peer_info.collator_state.set_role(collator_role, |msg| send_polkadot_message( - ctx, - who, - msg, - )); - } - - if let (true, &Some(ref consensus)) = (send_key, &self.live_consensus) { - peer_info.collator_state.send_key(consensus.local_session_key, |msg| send_polkadot_message( - ctx, - who, - msg, - )); - } - - self.peers.insert(who, peer_info); - self.consensus_gossip.new_peer(ctx, who, status.roles); - self.dispatch_pending_requests(ctx); - } - - fn on_disconnect(&mut self, ctx: &mut Context<Block>, who: NodeIndex) { - if let Some(info) = self.peers.remove(&who) { - if let Some((acc_id, _)) = info.collating_for { - let new_primary = self.collators.on_disconnect(acc_id) - .and_then(|new_primary| self.collator_peer(new_primary)); - - if let Some((new_primary, primary_info)) = new_primary { - primary_info.collator_state.set_role(Role::Primary, |msg| send_polkadot_message( - ctx, - new_primary, - msg, - )); - } - } - - if let Some(validator_key) = info.validator_key { - self.validators.remove(&validator_key); - self.local_collations.on_disconnect(&validator_key); - } - - { - let pending = &mut self.pending; - self.in_flight.retain(|&(_, ref peer), val| { - let retain = peer != &who; - if !retain { - let (sender, _) = oneshot::channel(); - pending.push(::std::mem::replace(val, BlockDataRequest { - attempted_peers: Default::default(), - consensus_parent: Default::default(), - candidate_hash: Default::default(), - block_data_hash: Default::default(), - sender, - })); - } - - retain - }); - } - self.consensus_gossip.peer_disconnected(ctx, who); - self.dispatch_pending_requests(ctx); - } - } - - fn on_message(&mut self, ctx: &mut Context<Block>, who: NodeIndex, message: message::Message<Block>) { - match message { - generic_message::Message::BftMessage(msg) => { - trace!(target: "p_net", "Polkadot BFT message from {}: {:?}", who, msg); - // TODO: check signature here? what if relevant block is unknown? - self.consensus_gossip.on_bft_message(ctx, who, msg) - } - generic_message::Message::ChainSpecific(raw) => { - match Message::decode(&mut raw.as_slice()) { - Some(msg) => self.on_polkadot_message(ctx, who, raw, msg), - None => { - trace!(target: "p_net", "Bad message from {}", who); - ctx.report_peer(who, Severity::Bad("Invalid polkadot protocol message format")); - } - } - } - _ => {} - } - } - - fn on_abort(&mut self) { - self.consensus_gossip.abort(); - } - - fn maintain_peers(&mut self, ctx: &mut Context<Block>) { - self.consensus_gossip.collect_garbage(None); - self.collators.collect_garbage(None); - self.local_collations.collect_garbage(None); - self.dispatch_pending_requests(ctx); - - for collator_action in self.collators.maintain_peers() { - match collator_action { - Action::Disconnect(collator) => self.disconnect_bad_collator(ctx, collator), - Action::NewRole(account_id, role) => if let Some((collator, info)) = self.collator_peer(account_id) { - info.collator_state.set_role(role, |msg| send_polkadot_message( - ctx, - collator, - msg, - )) - }, - } - } - } - - fn on_block_imported(&mut self, _ctx: &mut Context<Block>, hash: Hash, header: &Header) { - self.collators.collect_garbage(Some(&hash)); - self.local_collations.collect_garbage(Some(&header.parent_hash)); - } -} - -impl PolkadotProtocol { - // we received a collation from a peer - fn on_collation(&mut self, ctx: &mut Context<Block>, from: NodeIndex, relay_parent: Hash, collation: Collation) { - let collation_para = collation.receipt.parachain_index; - let collated_acc = collation.receipt.collator; - - match self.peers.get(&from) { - None => ctx.report_peer(from, Severity::Useless("Unknown Polkadot specific reason")), - Some(peer_info) => match peer_info.collating_for { - None => ctx.report_peer(from, Severity::Bad("Sent collation without registering collator intent")), - Some((ref acc_id, ref para_id)) => { - let structurally_valid = para_id == &collation_para && acc_id == &collated_acc; - if structurally_valid && collation.receipt.check_signature().is_ok() { - debug!(target: "p_net", "Received collation for parachain {:?} from peer {}", para_id, from); - self.collators.on_collation(acc_id.clone(), relay_parent, collation) - } else { - ctx.report_peer(from, Severity::Bad("Sent malformed collation")) - }; - } - }, - } - } - - fn await_collation(&mut self, relay_parent: Hash, para_id: ParaId) -> oneshot::Receiver<Collation> { - let (tx, rx) = oneshot::channel(); - debug!(target: "p_net", "Attempting to get collation for parachain {:?} on relay parent {:?}", para_id, relay_parent); - self.collators.await_collation(relay_parent, para_id, tx); - rx - } - - // get connected peer with given account ID for collation. - fn collator_peer(&mut self, account_id: AccountId) -> Option<(NodeIndex, &mut PeerInfo)> { - let check_info = |info: &PeerInfo| info - .collating_for - .as_ref() - .map_or(false, |&(ref acc_id, _)| acc_id == &account_id); - - self.peers - .iter_mut() - .filter(|&(_, ref info)| check_info(&**info)) - .map(|(who, info)| (*who, info)) - .next() - } - - // disconnect a collator by account-id. - fn disconnect_bad_collator(&mut self, ctx: &mut Context<Block>, account_id: AccountId) { - if let Some((who, _)) = self.collator_peer(account_id) { - ctx.report_peer(who, Severity::Bad("Consensus layer determined the given collator misbehaved")) - } - } -} - -impl PolkadotProtocol { - /// Add a local collation and broadcast it to the necessary peers. - pub fn add_local_collation( - &mut self, - ctx: &mut Context<Block>, - relay_parent: Hash, - targets: HashSet<SessionKey>, - collation: Collation, - ) { - debug!(target: "p_net", "Importing local collation on relay parent {:?} and parachain {:?}", - relay_parent, collation.receipt.parachain_index); - - for (primary, cloned_collation) in self.local_collations.add_collation(relay_parent, targets, collation.clone()) { - match self.validators.get(&primary) { - Some(who) => { - debug!(target: "p_net", "Sending local collation to {:?}", primary); - send_polkadot_message( - ctx, - *who, - Message::Collation(relay_parent, cloned_collation), - ) - }, - None => - warn!(target: "polkadot_network", "Encountered tracked but disconnected validator {:?}", primary), - } - } - } - - /// register availability store. - pub fn register_availability_store(&mut self, extrinsic_store: ::av_store::Store) { - self.extrinsic_store = Some(extrinsic_store); - } -} diff --git a/substrate/polkadot/network/src/local_collations.rs b/substrate/polkadot/network/src/local_collations.rs deleted file mode 100644 index 2902ed5f0e7..00000000000 --- a/substrate/polkadot/network/src/local_collations.rs +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2018 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 <http://www.gnu.org/licenses/>. - -//! Local collations to be circulated to validators. -//! -//! Collations are attempted to be repropagated when a new validator connects, -//! a validator changes his session key, or when they are generated. - -use polkadot_primitives::{Hash, SessionKey}; - -use collator_pool::Role; - -use std::collections::{HashMap, HashSet}; -use std::time::{Duration, Instant}; - -const LIVE_FOR: Duration = Duration::from_secs(60 * 5); - -struct LocalCollation<C> { - targets: HashSet<SessionKey>, - collation: C, - live_since: Instant, -} - -/// Tracker for locally collated values and which validators to send them to. -pub struct LocalCollations<C> { - primary_for: HashSet<SessionKey>, - local_collations: HashMap<Hash, LocalCollation<C>>, -} - -impl<C: Clone> LocalCollations<C> { - /// Create a new `LocalCollations` tracker. - pub fn new() -> Self { - LocalCollations { - primary_for: HashSet::new(), - local_collations: HashMap::new(), - } - } - - /// Validator gave us a new role. If the new role is "primary", this function might return - /// a set of collations to send to that validator. - pub fn note_validator_role(&mut self, key: SessionKey, role: Role) -> Vec<(Hash, C)> { - match role { - Role::Backup => { - self.primary_for.remove(&key); - Vec::new() - } - Role::Primary => { - let new_primary = self.primary_for.insert(key); - if new_primary { - self.collations_targeting(&key) - } else { - Vec::new() - } - } - } - } - - /// Fresh session key from a validator. Returns a vector of collations to send - /// to the validator. - pub fn fresh_key(&mut self, old_key: &SessionKey, new_key: &SessionKey) -> Vec<(Hash, C)> { - if self.primary_for.remove(old_key) { - self.primary_for.insert(*new_key); - - self.collations_targeting(new_key) - } else { - Vec::new() - } - } - - /// Validator disconnected. - pub fn on_disconnect(&mut self, key: &SessionKey) { - self.primary_for.remove(key); - } - - /// Mark collations relevant to the given parent hash as obsolete. - pub fn collect_garbage(&mut self, relay_parent: Option<&Hash>) { - if let Some(relay_parent) = relay_parent { - self.local_collations.remove(relay_parent); - } - - let now = Instant::now(); - self.local_collations.retain(|_, v| v.live_since + LIVE_FOR > now); - } - - /// Add a collation. Returns an iterator of session keys to send to and lazy copies of the collation. - pub fn add_collation<'a>( - &'a mut self, - relay_parent: Hash, - targets: HashSet<SessionKey>, - collation: C - ) - -> impl Iterator<Item=(SessionKey, C)> + 'a - { - self.local_collations.insert(relay_parent, LocalCollation { - targets, - collation, - live_since: Instant::now(), - }); - - let local = self.local_collations.get(&relay_parent) - .expect("just inserted to this key; qed"); - - let borrowed_collation = &local.collation; - local.targets - .intersection(&self.primary_for) - .map(move |k| (*k, borrowed_collation.clone())) - } - - fn collations_targeting(&self, key: &SessionKey) -> Vec<(Hash, C)> { - self.local_collations.iter() - .filter(|&(_, ref v)| v.targets.contains(key)) - .map(|(h, v)| (*h, v.collation.clone())) - .collect() - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn add_validator_with_ready_collation() { - let key = [1; 32].into(); - let relay_parent = [2; 32].into(); - let targets = { - let mut set = HashSet::new(); - set.insert(key); - set - }; - - let mut tracker = LocalCollations::new(); - assert!(tracker.add_collation(relay_parent, targets, 5).next().is_none()); - assert_eq!(tracker.note_validator_role(key, Role::Primary), vec![(relay_parent, 5)]); - } - - #[test] - fn rename_with_ready() { - let orig_key = [1; 32].into(); - let new_key = [2; 32].into(); - let relay_parent = [255; 32].into(); - let targets = { - let mut set = HashSet::new(); - set.insert(new_key); - set - }; - - let mut tracker: LocalCollations<u8> = LocalCollations::new(); - assert!(tracker.add_collation(relay_parent, targets, 5).next().is_none()); - assert!(tracker.note_validator_role(orig_key, Role::Primary).is_empty()); - assert_eq!(tracker.fresh_key(&orig_key, &new_key), vec![(relay_parent, 5u8)]); - } - - #[test] - fn collecting_garbage() { - let relay_parent_a = [255; 32].into(); - let relay_parent_b = [222; 32].into(); - - let mut tracker: LocalCollations<u8> = LocalCollations::new(); - assert!(tracker.add_collation(relay_parent_a, HashSet::new(), 5).next().is_none()); - assert!(tracker.add_collation(relay_parent_b, HashSet::new(), 69).next().is_none()); - - let live_since = Instant::now() - LIVE_FOR - Duration::from_secs(10); - tracker.local_collations.get_mut(&relay_parent_b).unwrap().live_since = live_since; - - tracker.collect_garbage(Some(&relay_parent_a)); - - // first one pruned because of relay parent, other because of time. - assert!(tracker.local_collations.is_empty()); - } - - #[test] - fn add_collation_with_connected_target() { - let key = [1; 32].into(); - let relay_parent = [2; 32].into(); - let targets = { - let mut set = HashSet::new(); - set.insert(key); - set - }; - - let mut tracker = LocalCollations::new(); - assert!(tracker.note_validator_role(key, Role::Primary).is_empty()); - assert_eq!(tracker.add_collation(relay_parent, targets, 5).next(), Some((key, 5))); - - } -} diff --git a/substrate/polkadot/network/src/router.rs b/substrate/polkadot/network/src/router.rs deleted file mode 100644 index 79a50f42831..00000000000 --- a/substrate/polkadot/network/src/router.rs +++ /dev/null @@ -1,342 +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 <http://www.gnu.org/licenses/>. - -//! Statement routing and consensus table router implementation. -//! -//! During the consensus process, validators exchange statements on validity and availability -//! of parachain candidates. -//! The `Router` in this file hooks into the underlying network to fulfill -//! the `TableRouter` trait from `polkadot-consensus`, which is expected to call into a shared statement table -//! and dispatch evaluation work as necessary when new statements come in. - -use polkadot_api::{PolkadotApi, LocalPolkadotApi}; -use polkadot_consensus::{SharedTable, TableRouter, SignedStatement, GenericStatement, StatementProducer}; -use polkadot_primitives::{Hash, BlockId, SessionKey}; -use polkadot_primitives::parachain::{BlockData, Extrinsic, CandidateReceipt}; - -use futures::prelude::*; -use tokio::runtime::TaskExecutor; -use parking_lot::Mutex; - -use std::collections::{HashMap, HashSet}; -use std::io; -use std::sync::Arc; - -use super::{NetworkService, Knowledge}; - -/// Table routing implementation. -pub struct Router<P: PolkadotApi> { - table: Arc<SharedTable>, - network: Arc<NetworkService>, - api: Arc<P>, - task_executor: TaskExecutor, - parent_hash: Hash, - knowledge: Arc<Mutex<Knowledge>>, - deferred_statements: Arc<Mutex<DeferredStatements>>, -} - -impl<P: PolkadotApi> Router<P> { - pub(crate) fn new( - table: Arc<SharedTable>, - network: Arc<NetworkService>, - api: Arc<P>, - task_executor: TaskExecutor, - parent_hash: Hash, - knowledge: Arc<Mutex<Knowledge>>, - ) -> Self { - Router { - table, - network, - api, - task_executor, - parent_hash, - knowledge, - deferred_statements: Arc::new(Mutex::new(DeferredStatements::new())), - } - } - - pub(crate) fn session_key(&self) -> SessionKey { - self.table.session_key() - } -} - -impl<P: PolkadotApi> Clone for Router<P> { - fn clone(&self) -> Self { - Router { - table: self.table.clone(), - network: self.network.clone(), - api: self.api.clone(), - task_executor: self.task_executor.clone(), - parent_hash: self.parent_hash.clone(), - deferred_statements: self.deferred_statements.clone(), - knowledge: self.knowledge.clone(), - } - } -} - -impl<P: LocalPolkadotApi + Send + Sync + 'static> Router<P> { - /// Import a statement whose signature has been checked already. - pub(crate) fn import_statement(&self, statement: SignedStatement) { - trace!(target: "p_net", "importing consensus statement {:?}", statement.statement); - - // defer any statements for which we haven't imported the candidate yet - let c_hash = { - let candidate_data = match statement.statement { - GenericStatement::Candidate(ref c) => Some(c.hash()), - GenericStatement::Valid(ref hash) - | GenericStatement::Invalid(ref hash) - | GenericStatement::Available(ref hash) - => self.table.with_candidate(hash, |c| c.map(|_| *hash)), - }; - match candidate_data { - Some(x) => x, - None => { - self.deferred_statements.lock().push(statement); - return; - } - } - }; - - // import all statements pending on this candidate - let (mut statements, _traces) = if let GenericStatement::Candidate(_) = statement.statement { - self.deferred_statements.lock().get_deferred(&c_hash) - } else { - (Vec::new(), Vec::new()) - }; - - // prepend the candidate statement. - debug!(target: "consensus", "Importing statements about candidate {:?}", c_hash); - statements.insert(0, statement); - let producers: Vec<_> = self.table.import_remote_statements( - self, - statements.iter().cloned(), - ); - // dispatch future work as necessary. - for (producer, statement) in producers.into_iter().zip(statements) { - self.knowledge.lock().note_statement(statement.sender, &statement.statement); - - if let Some(producer) = producer { - trace!(target: "consensus", "driving statement work to completion"); - self.dispatch_work(c_hash, producer); - } - } - } - - fn dispatch_work<D, E>(&self, candidate_hash: Hash, producer: StatementProducer<D, E>) where - D: Future<Item=BlockData,Error=io::Error> + Send + 'static, - E: Future<Item=Extrinsic,Error=io::Error> + Send + 'static, - { - let parent_hash = self.parent_hash.clone(); - - let api = self.api.clone(); - let validate = move |collation| -> Option<bool> { - let id = BlockId::hash(parent_hash); - match ::polkadot_consensus::validate_collation(&*api, &id, &collation) { - Ok(()) => Some(true), - Err(e) => { - debug!(target: "p_net", "Encountered bad collation: {}", e); - Some(false) - } - } - }; - - let table = self.table.clone(); - let network = self.network.clone(); - let knowledge = self.knowledge.clone(); - - let work = producer.prime(validate) - .map(move |produced| { - // store the data before broadcasting statements, so other peers can fetch. - knowledge.lock().note_candidate( - candidate_hash, - produced.block_data, - produced.extrinsic - ); - - // propagate the statements - if let Some(validity) = produced.validity { - let signed = table.sign_and_import(validity.clone()).0; - network.with_spec(|spec, ctx| spec.gossip_statement(ctx, parent_hash, signed)); - } - - if let Some(availability) = produced.availability { - let signed = table.sign_and_import(availability).0; - network.with_spec(|spec, ctx| spec.gossip_statement(ctx, parent_hash, signed)); - } - }) - .map_err(|e| debug!(target: "p_net", "Failed to produce statements: {:?}", e)); - - self.task_executor.spawn(work); - } -} - -impl<P: LocalPolkadotApi + Send> TableRouter for Router<P> { - type Error = io::Error; - type FetchCandidate = BlockDataReceiver; - type FetchExtrinsic = Result<Extrinsic, Self::Error>; - - fn local_candidate(&self, receipt: CandidateReceipt, block_data: BlockData, extrinsic: Extrinsic) { - // give to network to make available. - let hash = receipt.hash(); - let (candidate, availability) = self.table.sign_and_import(GenericStatement::Candidate(receipt)); - - self.knowledge.lock().note_candidate(hash, Some(block_data), Some(extrinsic)); - self.network.with_spec(|spec, ctx| { - spec.gossip_statement(ctx, self.parent_hash, candidate); - if let Some(availability) = availability { - spec.gossip_statement(ctx, self.parent_hash, availability); - } - }); - } - - fn fetch_block_data(&self, candidate: &CandidateReceipt) -> BlockDataReceiver { - let parent_hash = self.parent_hash; - let rx = self.network.with_spec(|spec, ctx| { spec.fetch_block_data(ctx, candidate, parent_hash) }); - BlockDataReceiver { inner: rx } - } - - fn fetch_extrinsic_data(&self, _candidate: &CandidateReceipt) -> Self::FetchExtrinsic { - Ok(Extrinsic) - } -} - -/// Receiver for block data. -pub struct BlockDataReceiver { - inner: Option<::futures::sync::oneshot::Receiver<BlockData>>, -} - -impl Future for BlockDataReceiver { - type Item = BlockData; - type Error = io::Error; - - fn poll(&mut self) -> Poll<BlockData, io::Error> { - match self.inner { - Some(ref mut inner) => inner.poll().map_err(|_| io::Error::new( - io::ErrorKind::Other, - "Sending end of channel hung up", - )), - None => return Err(io::Error::new( - io::ErrorKind::Other, - "Network service is unavailable", - )), - } - } -} - -// A unique trace for valid statements issued by a validator. -#[derive(Hash, PartialEq, Eq, Clone, Debug)] -enum StatementTrace { - Valid(SessionKey, Hash), - Invalid(SessionKey, Hash), - Available(SessionKey, Hash), -} - -// helper for deferring statements whose associated candidate is unknown. -struct DeferredStatements { - deferred: HashMap<Hash, Vec<SignedStatement>>, - known_traces: HashSet<StatementTrace>, -} - -impl DeferredStatements { - fn new() -> Self { - DeferredStatements { - deferred: HashMap::new(), - known_traces: HashSet::new(), - } - } - - fn push(&mut self, statement: SignedStatement) { - let (hash, trace) = match statement.statement { - GenericStatement::Candidate(_) => return, - GenericStatement::Valid(hash) => (hash, StatementTrace::Valid(statement.sender, hash)), - GenericStatement::Invalid(hash) => (hash, StatementTrace::Invalid(statement.sender, hash)), - GenericStatement::Available(hash) => (hash, StatementTrace::Available(statement.sender, hash)), - }; - - if self.known_traces.insert(trace) { - self.deferred.entry(hash).or_insert_with(Vec::new).push(statement); - } - } - - fn get_deferred(&mut self, hash: &Hash) -> (Vec<SignedStatement>, Vec<StatementTrace>) { - match self.deferred.remove(hash) { - None => (Vec::new(), Vec::new()), - Some(deferred) => { - let mut traces = Vec::new(); - for statement in deferred.iter() { - let trace = match statement.statement { - GenericStatement::Candidate(_) => continue, - GenericStatement::Valid(hash) => StatementTrace::Valid(statement.sender, hash), - GenericStatement::Invalid(hash) => StatementTrace::Invalid(statement.sender, hash), - GenericStatement::Available(hash) => StatementTrace::Available(statement.sender, hash), - }; - - self.known_traces.remove(&trace); - traces.push(trace); - } - - (deferred, traces) - } - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use substrate_primitives::H512; - - #[test] - fn deferred_statements_works() { - let mut deferred = DeferredStatements::new(); - let hash = [1; 32].into(); - let sig = H512([2; 64]).into(); - let sender = [255; 32].into(); - - let statement = SignedStatement { - statement: GenericStatement::Valid(hash), - sender, - signature: sig, - }; - - // pre-push. - { - let (signed, traces) = deferred.get_deferred(&hash); - assert!(signed.is_empty()); - assert!(traces.is_empty()); - } - - deferred.push(statement.clone()); - deferred.push(statement.clone()); - - // draining: second push should have been ignored. - { - let (signed, traces) = deferred.get_deferred(&hash); - assert_eq!(signed.len(), 1); - - assert_eq!(traces.len(), 1); - assert_eq!(signed[0].clone(), statement); - assert_eq!(traces[0].clone(), StatementTrace::Valid(sender, hash)); - } - - // after draining - { - let (signed, traces) = deferred.get_deferred(&hash); - assert!(signed.is_empty()); - assert!(traces.is_empty()); - } - } -} diff --git a/substrate/polkadot/network/src/tests.rs b/substrate/polkadot/network/src/tests.rs deleted file mode 100644 index f5ad78dae90..00000000000 --- a/substrate/polkadot/network/src/tests.rs +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright 2018 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 <http://www.gnu.org/licenses/>. - -//! Tests for polkadot and consensus network. - -use super::{PolkadotProtocol, Status, CurrentConsensus, Knowledge, Message, FullStatus}; - -use parking_lot::Mutex; -use polkadot_consensus::GenericStatement; -use polkadot_primitives::{Block, Hash, SessionKey}; -use polkadot_primitives::parachain::{CandidateReceipt, HeadData, BlockData}; -use substrate_primitives::H512; -use codec::Encode; -use substrate_network::{Severity, NodeIndex, PeerInfo, ClientHandle, Context, Roles, message::Message as SubstrateMessage, specialization::Specialization, generic_message::Message as GenericMessage}; - -use std::sync::Arc; -use futures::Future; - -#[derive(Default)] -struct TestContext { - disabled: Vec<NodeIndex>, - disconnected: Vec<NodeIndex>, - messages: Vec<(NodeIndex, SubstrateMessage<Block>)>, -} - -impl Context<Block> for TestContext { - fn client(&self) -> &ClientHandle<Block> { - unimplemented!() - } - - fn report_peer(&mut self, peer: NodeIndex, reason: Severity) { - match reason { - Severity::Bad(_) => self.disabled.push(peer), - _ => self.disconnected.push(peer), - } - } - - fn peer_info(&self, _peer: NodeIndex) -> Option<PeerInfo<Block>> { - unimplemented!() - } - - fn send_message(&mut self, who: NodeIndex, data: SubstrateMessage<Block>) { - self.messages.push((who, data)) - } -} - -impl TestContext { - fn has_message(&self, to: NodeIndex, message: Message) -> bool { - use substrate_network::generic_message::Message as GenericMessage; - - let encoded = message.encode(); - self.messages.iter().any(|&(ref peer, ref msg)| match msg { - GenericMessage::ChainSpecific(ref data) => peer == &to && data == &encoded, - _ => false, - }) - } -} - -fn make_status(status: &Status, roles: Roles) -> FullStatus { - FullStatus { - version: 1, - roles, - best_number: 0, - best_hash: Default::default(), - genesis_hash: Default::default(), - chain_status: status.encode(), - } -} - -fn make_consensus(parent_hash: Hash, local_key: SessionKey) -> (CurrentConsensus, Arc<Mutex<Knowledge>>) { - let knowledge = Arc::new(Mutex::new(Knowledge::new())); - let c = CurrentConsensus { - knowledge: knowledge.clone(), - parent_hash, - local_session_key: local_key, - }; - - (c, knowledge) -} - -fn on_message(protocol: &mut PolkadotProtocol, ctx: &mut TestContext, from: NodeIndex, message: Message) { - let encoded = message.encode(); - protocol.on_message(ctx, from, GenericMessage::ChainSpecific(encoded)); -} - -#[test] -fn sends_session_key() { - let mut protocol = PolkadotProtocol::new(None); - - let peer_a = 1; - let peer_b = 2; - let parent_hash = [0; 32].into(); - let local_key = [1; 32].into(); - - let validator_status = Status { collating_for: None }; - let collator_status = Status { collating_for: Some(([2; 32].into(), 5.into())) }; - - { - let mut ctx = TestContext::default(); - protocol.on_connect(&mut ctx, peer_a, make_status(&validator_status, Roles::AUTHORITY)); - assert!(ctx.messages.is_empty()); - } - - { - let mut ctx = TestContext::default(); - let (consensus, _knowledge) = make_consensus(parent_hash, local_key); - protocol.new_consensus(&mut ctx, consensus); - assert!(ctx.has_message(peer_a, Message::SessionKey(local_key))); - } - - { - let mut ctx = TestContext::default(); - protocol.on_connect(&mut ctx, peer_b, make_status(&collator_status, Roles::NONE)); - assert!(ctx.has_message(peer_b, Message::SessionKey(local_key))); - } -} - -#[test] -fn fetches_from_those_with_knowledge() { - let mut protocol = PolkadotProtocol::new(None); - - let peer_a = 1; - let peer_b = 2; - let parent_hash = [0; 32].into(); - let local_key = [1; 32].into(); - - let block_data = BlockData(vec![1, 2, 3, 4]); - let block_data_hash = block_data.hash(); - let candidate_receipt = CandidateReceipt { - parachain_index: 5.into(), - collator: [255; 32].into(), - head_data: HeadData(vec![9, 9, 9]), - signature: H512::from([1; 64]).into(), - balance_uploads: Vec::new(), - egress_queue_roots: Vec::new(), - fees: 1_000_000, - block_data_hash, - }; - - let candidate_hash = candidate_receipt.hash(); - let a_key = [3; 32].into(); - let b_key = [4; 32].into(); - - let status = Status { collating_for: None }; - - let (consensus, knowledge) = make_consensus(parent_hash, local_key); - protocol.new_consensus(&mut TestContext::default(), consensus); - - knowledge.lock().note_statement(a_key, &GenericStatement::Valid(candidate_hash)); - let recv = protocol.fetch_block_data(&mut TestContext::default(), &candidate_receipt, parent_hash); - - // connect peer A - { - let mut ctx = TestContext::default(); - protocol.on_connect(&mut ctx, peer_a, make_status(&status, Roles::AUTHORITY)); - assert!(ctx.has_message(peer_a, Message::SessionKey(local_key))); - } - - // peer A gives session key and gets asked for data. - { - let mut ctx = TestContext::default(); - on_message(&mut protocol, &mut ctx, peer_a, Message::SessionKey(a_key)); - assert!(protocol.validators.contains_key(&a_key)); - assert!(ctx.has_message(peer_a, Message::RequestBlockData(1, parent_hash, candidate_hash))); - } - - knowledge.lock().note_statement(b_key, &GenericStatement::Valid(candidate_hash)); - - // peer B connects and sends session key. request already assigned to A - { - let mut ctx = TestContext::default(); - protocol.on_connect(&mut ctx, peer_b, make_status(&status, Roles::AUTHORITY)); - on_message(&mut protocol, &mut ctx, peer_b, Message::SessionKey(b_key)); - assert!(!ctx.has_message(peer_b, Message::RequestBlockData(2, parent_hash, candidate_hash))); - - } - - // peer A disconnects, triggering reassignment - { - let mut ctx = TestContext::default(); - protocol.on_disconnect(&mut ctx, peer_a); - assert!(!protocol.validators.contains_key(&a_key)); - assert!(ctx.has_message(peer_b, Message::RequestBlockData(2, parent_hash, candidate_hash))); - } - - // peer B comes back with block data. - { - let mut ctx = TestContext::default(); - on_message(&mut protocol, &mut ctx, peer_b, Message::BlockData(2, Some(block_data.clone()))); - drop(protocol); - assert_eq!(recv.wait().unwrap(), block_data); - } -} - -#[test] -fn fetches_available_block_data() { - let mut protocol = PolkadotProtocol::new(None); - - let peer_a = 1; - let parent_hash = [0; 32].into(); - - let block_data = BlockData(vec![1, 2, 3, 4]); - let block_data_hash = block_data.hash(); - let para_id = 5.into(); - let candidate_receipt = CandidateReceipt { - parachain_index: para_id, - collator: [255; 32].into(), - head_data: HeadData(vec![9, 9, 9]), - signature: H512::from([1; 64]).into(), - balance_uploads: Vec::new(), - egress_queue_roots: Vec::new(), - fees: 1_000_000, - block_data_hash, - }; - - let candidate_hash = candidate_receipt.hash(); - let av_store = ::av_store::Store::new_in_memory(); - - let status = Status { collating_for: None }; - - protocol.register_availability_store(av_store.clone()); - - av_store.make_available(::av_store::Data { - relay_parent: parent_hash, - parachain_id: para_id, - candidate_hash, - block_data: block_data.clone(), - extrinsic: None, - }).unwrap(); - - // connect peer A - { - let mut ctx = TestContext::default(); - protocol.on_connect(&mut ctx, peer_a, make_status(&status, Roles::FULL)); - } - - // peer A asks for historic block data and gets response - { - let mut ctx = TestContext::default(); - on_message(&mut protocol, &mut ctx, peer_a, Message::RequestBlockData(1, parent_hash, candidate_hash)); - assert!(ctx.has_message(peer_a, Message::BlockData(1, Some(block_data)))); - } -} - -#[test] -fn remove_bad_collator() { - let mut protocol = PolkadotProtocol::new(None); - - let who = 1; - let account_id = [2; 32].into(); - - let status = Status { collating_for: Some((account_id, 5.into())) }; - - { - let mut ctx = TestContext::default(); - protocol.on_connect(&mut ctx, who, make_status(&status, Roles::NONE)); - } - - { - let mut ctx = TestContext::default(); - protocol.disconnect_bad_collator(&mut ctx, account_id); - assert!(ctx.disabled.contains(&who)); - } -} diff --git a/substrate/polkadot/parachain/Cargo.toml b/substrate/polkadot/parachain/Cargo.toml deleted file mode 100644 index f9e2b3bf055..00000000000 --- a/substrate/polkadot/parachain/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "polkadot-parachain" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] -description = "Types and utilities for creating and working with parachains" - -[dependencies] -substrate-codec = { path = "../../substrate/codec", default-features = false } -substrate-codec-derive = { path = "../../substrate/codec/derive", default-features = false } -wasmi = { version = "0.4", optional = true } -error-chain = { version = "0.12", optional = true } - -[dev-dependencies] -tiny-keccak = "1.4" - -[features] -default = ["std"] -std = ["substrate-codec/std", "wasmi", "error-chain"] diff --git a/substrate/polkadot/parachain/README.adoc b/substrate/polkadot/parachain/README.adoc deleted file mode 100644 index fbce59a188f..00000000000 --- a/substrate/polkadot/parachain/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Parachain - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/parachain/src/lib.rs b/substrate/polkadot/parachain/src/lib.rs deleted file mode 100644 index 3854fe2ca8c..00000000000 --- a/substrate/polkadot/parachain/src/lib.rs +++ /dev/null @@ -1,119 +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 <http://www.gnu.org/licenses/>. - -//! Defines primitive types for creating or validating a parachain. -//! -//! When compiled with standard library support, this crate exports a `wasm` -//! module that can be used to validate parachain WASM. -//! -//! ## Parachain WASM -//! -//! Polkadot parachain WASM is in the form of a module which imports a memory -//! instance and exports a function `validate`. -//! -//! `validate` accepts as input two `i32` values, representing a pointer/length pair -//! respectively, that encodes `ValidationParams`. -//! -//! `validate` returns an `i32` which is a pointer to a little-endian 32-bit integer denoting a length. -//! Subtracting the length from the initial pointer will give a new pointer to the actual return data, -//! -//! ASCII-diagram demonstrating the return data format: -//! -//! ```ignore -//! [return data][len (LE-u32)] -//! ^~~returned pointer -//! ``` -//! -//! The `load_params` and `write_result` functions provide utilities for setting up -//! a parachain WASM module in Rust. - -#![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] - -/// Re-export of substrate-codec. -pub extern crate substrate_codec as codec; - -#[macro_use] -extern crate substrate_codec_derive; - -#[cfg(not(feature = "std"))] -extern crate alloc; - -#[cfg(feature = "std")] -extern crate core; - -#[cfg(feature = "std")] -extern crate wasmi; - -#[cfg(feature = "std")] -#[macro_use] -extern crate error_chain; - -#[cfg(not(feature = "std"))] -use alloc::vec::Vec; -use codec::{Encode, Decode}; - -#[cfg(feature = "std")] -pub mod wasm; - -/// Validation parameters for evaluating the parachain validity function. -// TODO: consolidated ingress and balance downloads -#[derive(PartialEq, Eq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct ValidationParams { - /// The collation body. - pub block_data: Vec<u8>, - /// Previous head-data. - pub parent_head: Vec<u8>, -} - -/// The result of parachain validation. -// TODO: egress and balance uploads -#[derive(PartialEq, Eq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct ValidationResult { - /// New head data that should be included in the relay chain state. - pub head_data: Vec<u8> -} - -/// Load the validation params from memory when implementing a Rust parachain. -/// -/// Offset and length must have been provided by the validation -/// function's entry point. -pub unsafe fn load_params(offset: usize, len: usize) -> ValidationParams { - let mut slice = ::core::slice::from_raw_parts(offset as *const u8, len); - - ValidationParams::decode(&mut slice).expect("Invalid input data") -} - -/// Allocate the validation result in memory, getting the return-pointer back. -/// -/// As described in the crate docs, this is a pointer to the appended length -/// of the vector. -pub fn write_result(result: ValidationResult) -> usize { - let mut encoded = result.encode(); - let len = encoded.len(); - - assert!(len <= u32::max_value() as usize, "Len too large for parachain-WASM abi"); - (len as u32).using_encoded(|s| encoded.extend(s)); - - // do not alter `encoded` beyond this point. may reallocate. - let end_ptr = &encoded[len] as *const u8 as usize; - - // leak so it doesn't get zeroed. - ::core::mem::forget(encoded); - end_ptr -} diff --git a/substrate/polkadot/parachain/src/wasm.rs b/substrate/polkadot/parachain/src/wasm.rs deleted file mode 100644 index 73ccfdfdaff..00000000000 --- a/substrate/polkadot/parachain/src/wasm.rs +++ /dev/null @@ -1,165 +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 <http://www.gnu.org/licenses/>. - -//! WASM re-execution of a parachain candidate. -//! In the context of relay-chain candidate evaluation, there are some additional -//! steps to ensure that the provided input parameters are correct. -//! Assuming the parameters are correct, this module provides a wrapper around -//! a WASM VM for re-execution of a parachain candidate. - -use codec::{Decode, Encode}; - -use wasmi::{self, Module, ModuleInstance, MemoryInstance, MemoryDescriptor, MemoryRef, ModuleImportResolver}; -use wasmi::{memory_units, RuntimeValue}; -use wasmi::Error as WasmError; -use wasmi::memory_units::{Bytes, Pages, RoundUpTo}; - -use super::{ValidationParams, ValidationResult}; - -use std::cell::RefCell; - -error_chain! { - types { Error, ErrorKind, ResultExt; } - foreign_links { - Wasm(WasmError); - } - errors { - /// Call data too big. WASM32 only has a 32-bit address space. - ParamsTooLarge(len: usize) { - description("Validation parameters took up too much space to execute in WASM"), - display("Validation parameters took up {} bytes, max allowed by WASM is {}", len, i32::max_value()), - } - /// Bad return data or type. - BadReturn { - description("Validation function returned invalid data."), - display("Validation function returned invalid data."), - } - } -} - -struct Resolver { - max_memory: u32, // in pages. - memory: RefCell<Option<MemoryRef>>, -} - -impl ModuleImportResolver for Resolver { - fn resolve_memory( - &self, - field_name: &str, - descriptor: &MemoryDescriptor, - ) -> Result<MemoryRef, WasmError> { - if field_name == "memory" { - let effective_max = descriptor.maximum().unwrap_or(self.max_memory); - if descriptor.initial() > self.max_memory || effective_max > self.max_memory { - Err(WasmError::Instantiation("Module requested too much memory".to_owned())) - } else { - let mem = MemoryInstance::alloc( - memory_units::Pages(descriptor.initial() as usize), - descriptor.maximum().map(|x| memory_units::Pages(x as usize)), - )?; - *self.memory.borrow_mut() = Some(mem.clone()); - Ok(mem) - } - } else { - Err(WasmError::Instantiation("Memory imported under unknown name".to_owned())) - } - } -} - -/// Validate a candidate under the given validation code. -/// -/// This will fail if the validation code is not a proper parachain validation module. -pub fn validate_candidate(validation_code: &[u8], params: ValidationParams) -> Result<ValidationResult, Error> { - use wasmi::LINEAR_MEMORY_PAGE_SIZE; - - // maximum memory in bytes - const MAX_MEM: u32 = 1024 * 1024 * 1024; // 1 GiB - - // instantiate the module. - let (module, memory) = { - let module = Module::from_buffer(validation_code)?; - - let module_resolver = Resolver { - max_memory: MAX_MEM / LINEAR_MEMORY_PAGE_SIZE.0 as u32, - memory: RefCell::new(None), - }; - - let module = ModuleInstance::new( - &module, - &wasmi::ImportsBuilder::new().with_resolver("env", &module_resolver), - )?.run_start(&mut wasmi::NopExternals).map_err(WasmError::Trap)?; - - let memory = module_resolver.memory.borrow() - .as_ref() - .ok_or_else(|| WasmError::Instantiation("No imported memory instance".to_owned()))? - .clone(); - - (module, memory) - }; - - // allocate call data in memory. - let (offset, len) = { - let encoded_call_data = params.encode(); - - // hard limit from WASM. - if encoded_call_data.len() > i32::max_value() as usize { - bail!(ErrorKind::ParamsTooLarge(encoded_call_data.len())); - } - - // allocate sufficient amount of wasm pages to fit encoded call data. - let call_data_pages: Pages = Bytes(encoded_call_data.len()).round_up_to(); - let allocated_mem_start: Bytes = memory.grow(call_data_pages)?.into(); - - memory.set(allocated_mem_start.0 as u32, &encoded_call_data) - .expect( - "enough memory allocated just before this; \ - copying never fails if memory is large enough; qed" - ); - - (allocated_mem_start.0, encoded_call_data.len()) - }; - - let output = module.invoke_export( - "validate", - &[RuntimeValue::I32(offset as i32), RuntimeValue::I32(len as i32)], - &mut wasmi::NopExternals, - )?; - - match output { - Some(RuntimeValue::I32(len_offset)) => { - let len_offset = len_offset as u32; - - let mut len_bytes = [0u8; 4]; - memory.get_into(len_offset, &mut len_bytes)?; - - let len = u32::decode(&mut &len_bytes[..]) - .ok_or_else(|| ErrorKind::BadReturn)?; - - let return_offset = if len > len_offset { - bail!(ErrorKind::BadReturn); - } else { - len_offset - len - }; - - // TODO: optimize when `wasmi` lets you inspect memory with a closure. - let raw_return = memory.get(return_offset, len as usize)?; - ValidationResult::decode(&mut &raw_return[..]) - .ok_or_else(|| ErrorKind::BadReturn) - .map_err(Into::into) - } - _ => bail!(ErrorKind::BadReturn), - } -} diff --git a/substrate/polkadot/parachain/tests/adder.rs b/substrate/polkadot/parachain/tests/adder.rs deleted file mode 100644 index 7ba3ff04fe8..00000000000 --- a/substrate/polkadot/parachain/tests/adder.rs +++ /dev/null @@ -1,135 +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 <http://www.gnu.org/licenses/>. - -//! Basic parachain that adds a number as part of its state. - -#[macro_use] -extern crate substrate_codec_derive; -extern crate substrate_codec as codec; -extern crate polkadot_parachain as parachain; -extern crate tiny_keccak; - -use parachain::ValidationParams; -use codec::{Decode, Encode}; - -/// Head data for this parachain. -#[derive(Default, Clone, Encode, Decode)] -struct HeadData { - /// Block number - number: u64, - /// parent block keccak256 - parent_hash: [u8; 32], - /// hash of post-execution state. - post_state: [u8; 32], -} - -/// Block data for this parachain. -#[derive(Default, Clone, Encode, Decode)] -struct BlockData { - /// State to begin from. - state: u64, - /// Amount to add (overflowing) - add: u64, -} - -const TEST_CODE: &[u8] = include_bytes!("res/adder.wasm"); - -fn hash_state(state: u64) -> [u8; 32] { - ::tiny_keccak::keccak256(state.encode().as_slice()) -} - -fn hash_head(head: &HeadData) -> [u8; 32] { - ::tiny_keccak::keccak256(head.encode().as_slice()) -} - -#[test] -fn execute_good_on_parent() { - let parent_head = HeadData { - number: 0, - parent_hash: [0; 32], - post_state: hash_state(0), - }; - - let block_data = BlockData { - state: 0, - add: 512, - }; - - let ret = parachain::wasm::validate_candidate(TEST_CODE, ValidationParams { - parent_head: parent_head.encode(), - block_data: block_data.encode(), - }).unwrap(); - - let new_head = HeadData::decode(&mut &ret.head_data[..]).unwrap(); - - assert_eq!(new_head.number, 1); - assert_eq!(new_head.parent_hash, hash_head(&parent_head)); - assert_eq!(new_head.post_state, hash_state(512)); -} - -#[test] -fn execute_good_chain_on_parent() { - let mut number = 0; - let mut parent_hash = [0; 32]; - let mut last_state = 0; - - for add in 0..10 { - let parent_head = HeadData { - number, - parent_hash, - post_state: hash_state(last_state), - }; - - let block_data = BlockData { - state: last_state, - add, - }; - - let ret = parachain::wasm::validate_candidate(TEST_CODE, ValidationParams { - parent_head: parent_head.encode(), - block_data: block_data.encode(), - }).unwrap(); - - let new_head = HeadData::decode(&mut &ret.head_data[..]).unwrap(); - - assert_eq!(new_head.number, number + 1); - assert_eq!(new_head.parent_hash, hash_head(&parent_head)); - assert_eq!(new_head.post_state, hash_state(last_state + add)); - - number += 1; - parent_hash = hash_head(&new_head); - last_state += add; - } -} - -#[test] -fn execute_bad_on_parent() { - let parent_head = HeadData { - number: 0, - parent_hash: [0; 32], - post_state: hash_state(0), - }; - - let block_data = BlockData { - state: 256, // start state is wrong. - add: 256, - }; - - let _ret = parachain::wasm::validate_candidate(TEST_CODE, ValidationParams { - parent_head: parent_head.encode(), - block_data: block_data.encode(), - }).unwrap_err(); -} diff --git a/substrate/polkadot/parachain/tests/res/adder.wasm b/substrate/polkadot/parachain/tests/res/adder.wasm deleted file mode 100644 index 9f0145a78b1ba6bedc78efb63e862e61f91f29bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10174 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 diff --git a/substrate/polkadot/primitives/Cargo.toml b/substrate/polkadot/primitives/Cargo.toml deleted file mode 100644 index b277f074c3f..00000000000 --- a/substrate/polkadot/primitives/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "polkadot-primitives" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] - -[dependencies] -serde = { version = "1.0", default_features = false } -serde_derive = { version = "1.0", optional = true } -substrate-codec = { path = "../../substrate/codec", default_features = false } -substrate-codec-derive = { path = "../../substrate/codec/derive", default_features = false } -substrate-primitives = { path = "../../substrate/primitives", default_features = false } -substrate-runtime-std = { path = "../../substrate/runtime-std", default_features = false } -substrate-runtime-primitives = { path = "../../substrate/runtime/primitives", default_features = false } - -[dev-dependencies] -substrate-serializer = { path = "../../substrate/serializer" } -pretty_assertions = "0.4" - -[features] -default = ["std"] -std = [ - "substrate-codec/std", - "substrate-primitives/std", - "substrate-runtime-std/std", - "substrate-runtime-primitives/std", - "serde_derive", - "serde/std", -] diff --git a/substrate/polkadot/primitives/README.adoc b/substrate/polkadot/primitives/README.adoc deleted file mode 100644 index a8468a0cd96..00000000000 --- a/substrate/polkadot/primitives/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot primitives - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/primitives/src/lib.rs b/substrate/polkadot/primitives/src/lib.rs deleted file mode 100644 index bf3e2fd5653..00000000000 --- a/substrate/polkadot/primitives/src/lib.rs +++ /dev/null @@ -1,123 +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 <http://www.gnu.org/licenses/>. - -//! Shareable Polkadot types. - -#![warn(missing_docs)] - -#![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] - -extern crate substrate_codec as codec; -extern crate substrate_primitives as primitives; -extern crate substrate_runtime_primitives as runtime_primitives; -extern crate substrate_runtime_std as rstd; - -#[cfg(test)] -extern crate substrate_serializer; - -#[macro_use] -extern crate substrate_codec_derive; - -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - -#[cfg(feature = "std")] -extern crate serde; - -#[cfg(feature = "std")] -use primitives::bytes; - -use rstd::prelude::*; -use runtime_primitives::traits::BlakeTwo256; -use runtime_primitives::generic; - -pub mod parachain; - -/// Block header type as expected by this runtime. -pub type Header = generic::Header<BlockNumber, BlakeTwo256, Log>; - -/// Opaque, encoded, unchecked extrinsic. -pub type UncheckedExtrinsic = Vec<u8>; - -/// 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<Header, UncheckedExtrinsic>; - -/// 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. -pub type AccountId = primitives::hash::H256; - -/// The type for looking up accounts. We don't expect more than 4 billion of them, but you -/// never know... -pub type AccountIndex = u64; - -/// 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; - -/// 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; - -/// 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<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; - -/// "generic" block ID for the future-proof block type. -// TODO: parameterize blockid only as necessary. -pub type BlockId = generic::BlockId<Block>; - -/// A log entry in the block. -#[derive(PartialEq, Eq, Clone, Default, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec<u8>); - -/// Inherent data to include in a block. -#[derive(Encode, Decode)] -pub struct InherentData { - /// Current timestamp. - pub timestamp: Timestamp, - /// Parachain heads update. - pub parachain_heads: Vec<::parachain::CandidateReceipt>, - /// Indices of offline validators. - pub offline_indices: Vec<u32>, -} diff --git a/substrate/polkadot/primitives/src/parachain.rs b/substrate/polkadot/primitives/src/parachain.rs deleted file mode 100644 index 8ceec3f9fd5..00000000000 --- a/substrate/polkadot/primitives/src/parachain.rs +++ /dev/null @@ -1,207 +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 <http://www.gnu.org/licenses/>. - -//! Polkadot parachain types. - -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, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Id(u32); - -impl From<Id> for u32 { - fn from(x: Id) -> Self { x.0 } -} - -impl From<u32> 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 - } -} - -/// Identifier for a chain, either one of a number of parachains or the relay chain. -#[derive(Copy, Clone, PartialEq, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum Chain { - /// The relay chain. - Relay, - /// A parachain of the given index. - Parachain(Id), -} - -/// The duty roster specifying what jobs each validator must do. -#[derive(Clone, PartialEq, Encode, Decode)] -#[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<Chain>, - /// Lookup from validator index to chain on which that validator has a duty to guarantee - /// availability. - pub guarantor_duty: Vec<Chain>, -} - -/// 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 receipt type. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[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, - /// Signature on blake2-256 of the block data by collator. - pub signature: CandidateSignature, - /// 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, - /// blake2-256 Hash of block data. - pub block_data_hash: Hash, -} - -impl CandidateReceipt { - /// Get the blake2_256 hash - #[cfg(feature = "std")] - pub fn hash(&self) -> Hash { - use runtime_primitives::traits::{BlakeTwo256, Hash}; - BlakeTwo256::hash_of(self) - } - - /// Check integrity vs. provided block data. - pub fn check_signature(&self) -> Result<(), ()> { - use runtime_primitives::traits::Verify; - - if self.signature.verify(&self.block_data_hash.0[..], &self.collator) { - Ok(()) - } else { - Err(()) - } - } -} - -impl PartialOrd for CandidateReceipt { - fn partial_cmp(&self, other: &Self) -> Option<Ordering> { - 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)) - } -} - -/// A full collation. -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[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 Collation { - /// Block data. - pub block_data: BlockData, - /// Candidate receipt itself. - pub receipt: CandidateReceipt, -} - -/// 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<u8>); - -/// 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<Message>)>); - -/// Parachain block data. -/// -/// contains everything required to validate para-block, may contain block and witness data -#[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec<u8>); - -impl BlockData { - /// Compute hash of block data. - #[cfg(feature = "std")] - pub fn hash(&self) -> Hash { - use runtime_primitives::traits::{BlakeTwo256, Hash}; - BlakeTwo256::hash(&self.0[..]) - } -} -/// 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<u8>); - -/// Parachain head data included in the chain. -#[derive(PartialEq, Eq, Clone, PartialOrd, Ord, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec<u8>); - -/// 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<u8>); - -/// Activitiy bit field -#[derive(PartialEq, Eq, Clone, Default, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Activity(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec<u8>); - -/// Statements which can be made about parachain candidates. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -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), -} diff --git a/substrate/polkadot/runtime/Cargo.toml b/substrate/polkadot/runtime/Cargo.toml deleted file mode 100644 index 3a595fef7ca..00000000000 --- a/substrate/polkadot/runtime/Cargo.toml +++ /dev/null @@ -1,57 +0,0 @@ -[package] -name = "polkadot-runtime" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] - -[dependencies] -rustc-hex = "1.0" -log = { version = "0.3", optional = true } -serde = { version = "1.0", default_features = false } -serde_derive = { version = "1.0", optional = true } -safe-mix = { version = "1.0", 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" } -substrate-runtime-io = { path = "../../substrate/runtime-io" } -substrate-runtime-support = { path = "../../substrate/runtime-support" } -substrate-primitives = { path = "../../substrate/primitives" } -substrate-keyring = { path = "../../substrate/keyring" } -substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } -substrate-runtime-council = { path = "../../substrate/runtime/council" } -substrate-runtime-democracy = { path = "../../substrate/runtime/democracy" } -substrate-runtime-executive = { path = "../../substrate/runtime/executive" } -substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } -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" } -substrate-runtime-version = { path = "../../substrate/runtime/version" } - -[dev-dependencies] -hex-literal = "0.1.0" - -[features] -default = ["std"] -std = [ - "polkadot-primitives/std", - "substrate-codec/std", - "substrate-primitives/std", - "substrate-runtime-std/std", - "substrate-runtime-io/std", - "substrate-runtime-support/std", - "substrate-runtime-consensus/std", - "substrate-runtime-council/std", - "substrate-runtime-democracy/std", - "substrate-runtime-executive/std", - "substrate-runtime-primitives/std", - "substrate-runtime-session/std", - "substrate-runtime-staking/std", - "substrate-runtime-system/std", - "substrate-runtime-timestamp/std", - "substrate-runtime-version/std", - "serde_derive", - "serde/std", - "log", - "safe-mix/std" -] diff --git a/substrate/polkadot/runtime/README.adoc b/substrate/polkadot/runtime/README.adoc deleted file mode 100644 index 86dc313134a..00000000000 --- a/substrate/polkadot/runtime/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Runtime - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/runtime/src/checked_block.rs b/substrate/polkadot/runtime/src/checked_block.rs deleted file mode 100644 index d193d26963f..00000000000 --- a/substrate/polkadot/runtime/src/checked_block.rs +++ /dev/null @@ -1,118 +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 <http://www.gnu.org/licenses/>. - -//! Typesafe block interaction. - -use super::{Call, Block, TIMESTAMP_SET_POSITION, PARACHAINS_SET_POSITION, NOTE_OFFLINE_POSITION}; -use timestamp::Call as TimestampCall; -use parachains::Call as ParachainsCall; -use session::Call as SessionCall; -use primitives::parachain::CandidateReceipt; - -/// Provides a type-safe wrapper around a structurally valid block. -pub struct CheckedBlock { - inner: Block, - file_line: Option<(&'static str, u32)>, -} - -impl CheckedBlock { - /// Create a new checked block. Fails if the block is not structurally valid. - pub fn new(block: Block) -> Result<Self, Block> { - 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), - } - } - - /// Extract the noted offline validator indices (if any) from the block. - pub fn noted_offline(&self) -> &[u32] { - self.inner.extrinsics.get(NOTE_OFFLINE_POSITION as usize).and_then(|xt| match xt.extrinsic.function { - Call::Session(SessionCall::note_offline(ref x)) => Some(&x[..]), - _ => None, - }).unwrap_or(&[]) - } - - /// Convert into inner block. - pub fn into_inner(self) -> Block { self.inner } -} - -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. -#[macro_export] -macro_rules! assert_polkadot_block { - ($block: expr) => { - $crate::CheckedBlock::new_unchecked($block, file!(), line!()) - } -} diff --git a/substrate/polkadot/runtime/src/lib.rs b/substrate/polkadot/runtime/src/lib.rs deleted file mode 100644 index 203ac58c6b6..00000000000 --- a/substrate/polkadot/runtime/src/lib.rs +++ /dev/null @@ -1,408 +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 <http://www.gnu.org/licenses/>. - -//! The Polkadot runtime. This can be compiled with ``#[no_std]`, ready for Wasm. - -#![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; - -#[macro_use] -extern crate substrate_runtime_support; - -#[macro_use] -extern crate substrate_runtime_primitives as runtime_primitives; - -#[cfg(test)] -#[macro_use] -extern crate hex_literal; - -#[cfg(test)] -extern crate substrate_serializer; - -extern crate substrate_primitives; - -#[macro_use] -extern crate substrate_runtime_std as rstd; - -extern crate polkadot_primitives as primitives; -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; -#[macro_use] -extern crate substrate_runtime_version as version; - -#[cfg(feature = "std")] -mod checked_block; -mod parachains; -mod utils; - -#[cfg(feature = "std")] -pub use checked_block::CheckedBlock; -pub use utils::{inherent_extrinsics, check_extrinsic}; -pub use staking::address::Address as RawAddress; - -use primitives::{AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, Log, SessionKey, Signature}; -use runtime_primitives::{generic, traits::{HasPublicAux, BlakeTwo256, Convert}}; -use version::RuntimeVersion; - -#[cfg(feature = "std")] -pub use runtime_primitives::BuildStorage; - -pub use consensus::Call as ConsensusCall; -pub use timestamp::Call as TimestampCall; -pub use parachains::Call as ParachainsCall; -pub use primitives::Header; - -/// 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; -/// The position of the offline nodes noting extrinsic. -pub const NOTE_OFFLINE_POSITION: u32 = 2; - -/// The address format for describing accounts. -pub type Address = staking::Address<Concrete>; -/// Block Id type for this block. -pub type BlockId = generic::BlockId<Block>; -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, Index, Call, Signature>; -/// Extrinsic type as expected by this runtime. This is not the type that is signed. -pub type Extrinsic = generic::Extrinsic<Address, Index, Call>; -/// Extrinsic type that is signed. -pub type BareExtrinsic = generic::Extrinsic<AccountId, Index, Call>; -/// Block type as expected by this runtime. -pub type Block = generic::Block<Header, UncheckedExtrinsic>; - -/// Concrete runtime type used to parameterize the various modules. -// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. -#[derive(Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct Concrete; - -/// Polkadot runtime version. -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: ver_str!("polkadot"), - impl_name: ver_str!("parity-polkadot"), - authoring_version: 1, - spec_version: 101, - impl_version: 0, -}; - -impl version::Trait for Concrete { - const VERSION: RuntimeVersion = VERSION; -} - -/// Version module for this concrete runtime. -pub type Version = version::Module<Concrete>; - -impl HasPublicAux for Concrete { - type PublicAux = AccountId; // TODO: Option<AccountId> -} - -impl system::Trait for Concrete { - type Index = Index; - type BlockNumber = BlockNumber; - type Hash = Hash; - type Hashing = BlakeTwo256; - type Digest = generic::Digest<Log>; - type AccountId = AccountId; - type Header = Header; -} -/// System module for this concrete runtime. -pub type System = system::Module<Concrete>; - -impl consensus::Trait for Concrete { - type PublicAux = <Concrete as HasPublicAux>::PublicAux; - type SessionKey = SessionKey; -} -/// Consensus module for this concrete runtime. -pub type Consensus = consensus::Module<Concrete>; - -impl timestamp::Trait for Concrete { - const TIMESTAMP_SET_POSITION: u32 = TIMESTAMP_SET_POSITION; - type Moment = u64; -} -/// Timestamp module for this concrete runtime. -pub type Timestamp = timestamp::Module<Concrete>; - -/// Session key conversion. -pub struct SessionKeyConversion; -impl Convert<AccountId, SessionKey> for SessionKeyConversion { - fn convert(a: AccountId) -> SessionKey { - a.0.into() - } -} - -impl session::Trait for Concrete { - const NOTE_OFFLINE_POSITION: u32 = NOTE_OFFLINE_POSITION; - type ConvertAccountIdToSessionKey = SessionKeyConversion; - type OnSessionChange = Staking; -} -/// Session module for this concrete runtime. -pub type Session = session::Module<Concrete>; - -impl staking::Trait for Concrete { - type Balance = Balance; - type AccountIndex = AccountIndex; - type OnAccountKill = (); -} -/// Staking module for this concrete runtime. -pub type Staking = staking::Module<Concrete>; - -impl democracy::Trait for Concrete { - type Proposal = PrivCall; -} -/// Democracy module for this concrete runtime. -pub type Democracy = democracy::Module<Concrete>; - -impl council::Trait for Concrete {} -/// Council module for this concrete runtime. -pub type Council = council::Module<Concrete>; -/// Council voting module for this concrete runtime. -pub type CouncilVoting = council::voting::Module<Concrete>; - -impl parachains::Trait for Concrete { - const SET_POSITION: u32 = PARACHAINS_SET_POSITION; - - type PublicAux = <Concrete as HasPublicAux>::PublicAux; -} -pub type Parachains = parachains::Module<Concrete>; - -impl_outer_dispatch! { - /// Call type for polkadot transactions. - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - pub enum Call where aux: <Concrete as HasPublicAux>::PublicAux { - Consensus = 0, - Session = 1, - Staking = 2, - Timestamp = 3, - Democracy = 5, - Council = 6, - CouncilVoting = 7, - Parachains = 8, - } - - /// Internal calls. - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] - pub enum PrivCall { - Consensus = 0, - Session = 1, - Staking = 2, - Democracy = 5, - Council = 6, - CouncilVoting = 7, - Parachains = 8, - } -} - -/// Executive: handles dispatch to the various modules. -pub type Executive = executive::Executive<Concrete, Block, Staking, Staking, - (((((((), Parachains), Council), Democracy), Staking), Session), Timestamp)>; - -impl_outer_config! { - pub struct GenesisConfig for Concrete { - ConsensusConfig => consensus, - SystemConfig => system, - SessionConfig => session, - StakingConfig => staking, - DemocracyConfig => democracy, - CouncilConfig => council, - TimestampConfig => timestamp, - ParachainsConfig => parachains, - } -} - -pub mod api { - impl_stubs!( - version => |()| super::Version::version(), - authorities => |()| super::Consensus::authorities(), - initialise_block => |header| super::Executive::initialise_block(&header), - apply_extrinsic => |extrinsic| super::Executive::apply_extrinsic(extrinsic), - execute_block => |block| super::Executive::execute_block(block), - finalise_block => |()| super::Executive::finalise_block(), - inherent_extrinsics => |inherent| super::inherent_extrinsics(inherent), - validator_count => |()| super::Session::validator_count(), - validators => |()| super::Session::validators() - ); -} - -#[cfg(test)] -mod tests { - use super::*; - use substrate_primitives as primitives; - use codec::{Encode, Decode}; - use substrate_primitives::hexdisplay::HexDisplay; - use substrate_serializer as ser; - use runtime_primitives::traits::{Digest as DigestT, Header as HeaderT}; - type Digest = generic::Digest<Log>; - - #[test] - fn test_header_serialization() { - let header = Header { - parent_hash: 5.into(), - number: 67, - state_root: 3.into(), - extrinsics_root: 6.into(), - digest: { let mut d = Digest::default(); d.push(Log(vec![1])); d }, - }; - - 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 block_encoding_round_trip() { - let mut block = Block { - header: Header::new(1, Default::default(), Default::default(), Default::default(), Default::default()), - extrinsics: vec![ - UncheckedExtrinsic::new( - generic::Extrinsic { - function: Call::Timestamp(timestamp::Call::set(100_000_000)), - signed: Default::default(), - index: Default::default(), - }, - Default::default(), - ) - ], - }; - - let raw = block.encode(); - let decoded = Block::decode(&mut &raw[..]).unwrap(); - - assert_eq!(block, decoded); - - block.extrinsics.push(UncheckedExtrinsic::new( - generic::Extrinsic { - function: Call::Staking(staking::Call::stake()), - signed: Default::default(), - index: 10101, - }, - Default::default(), - )); - - let raw = block.encode(); - let decoded = Block::decode(&mut &raw[..]).unwrap(); - - assert_eq!(block, decoded); - } - - #[test] - fn block_encoding_substrate_round_trip() { - let mut block = Block { - header: Header::new(1, Default::default(), Default::default(), Default::default(), Default::default()), - extrinsics: vec![ - UncheckedExtrinsic::new( - generic::Extrinsic { - function: Call::Timestamp(timestamp::Call::set(100_000_000)), - signed: Default::default(), - index: Default::default(), - }, - Default::default(), - ) - ], - }; - - block.extrinsics.push(UncheckedExtrinsic::new( - generic::Extrinsic { - function: Call::Staking(staking::Call::stake()), - signed: Default::default(), - index: 10101, - }, - Default::default() - )); - - let raw = block.encode(); - 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); - } - - #[test] - fn serialize_unchecked() { - let tx = UncheckedExtrinsic::new( - Extrinsic { - signed: AccountId::from([1; 32]).into(), - index: 999, - function: Call::Timestamp(TimestampCall::set(135135)), - }, - runtime_primitives::Ed25519Signature(primitives::hash::H512([0; 64])).into() - ); - - // 6f000000 - // ff0101010101010101010101010101010101010101010101010101010101010101 - // e7030000 - // 0300 - // df0f0200 - // 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - - let v = Encode::encode(&tx); - assert_eq!(&v[..], &hex!["6f000000ff0101010101010101010101010101010101010101010101010101010101010101e70300000300df0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"][..]); - println!("{}", HexDisplay::from(&v)); - assert_eq!(UncheckedExtrinsic::decode(&mut &v[..]).unwrap(), tx); - } - - #[test] - fn serialize_checked() { - let xt = Extrinsic { - signed: AccountId::from(hex!["0d71d1a9cad6f2ab773435a7dec1bac019994d05d1dd5eb3108211dcf25c9d1e"]).into(), - index: 0, - function: Call::CouncilVoting(council::voting::Call::propose(Box::new( - PrivCall::Consensus(consensus::PrivCall::set_code( - vec![] - )) - ))), - }; - let v = Encode::encode(&xt); - assert_eq!(Extrinsic::decode(&mut &v[..]).unwrap(), xt); - } - - #[test] - fn parachain_calls_are_privcall() { - let _register = PrivCall::Parachains(parachains::PrivCall::register_parachain(0.into(), vec![1, 2, 3], vec![])); - let _deregister = PrivCall::Parachains(parachains::PrivCall::deregister_parachain(0.into())); - } -} diff --git a/substrate/polkadot/runtime/src/parachains.rs b/substrate/polkadot/runtime/src/parachains.rs deleted file mode 100644 index 677b86e847c..00000000000 --- a/substrate/polkadot/runtime/src/parachains.rs +++ /dev/null @@ -1,380 +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 <http://www.gnu.org/licenses/>. - -//! Main parachains logic. For now this is just the determination of which validators do what. - -use rstd::prelude::*; -use codec::Decode; - -use runtime_primitives::traits::{Hash, BlakeTwo256, 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<Hash = ::primitives::Hash> + session::Trait { - /// The position of the set_heads call in the block. - const SET_POSITION: u32; - - type PublicAux: RefInto<Self::AccountId> + MaybeEmpty; -} - -decl_module! { - /// Parachains module. - pub struct Module<T: Trait>; - /// Call type for parachains. - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum Call where aux: <T as Trait>::PublicAux { - // provide candidate receipts for parachains, in ascending order by id. - fn set_heads(aux, heads: Vec<CandidateReceipt>) -> Result = 0; - } - - /// Private calls for parachains. - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] - pub enum PrivCall { - fn register_parachain(id: Id, code: Vec<u8>, initial_head_data: Vec<u8>) -> Result = 0; - fn deregister_parachain(id: Id) -> Result = 1; - } -} - -decl_storage! { - trait Store for Module<T: Trait>; - // Vector of all parachain IDs. - pub Parachains get(active_parachains): b"para:chains" => default Vec<Id>; - // The parachains registered at present. - pub Code get(parachain_code): b"para:code" => map [ Id => Vec<u8> ]; - // The heads of the parachains registered at present. these are kept sorted. - pub Heads get(parachain_head): b"para:head" => map [ Id => Vec<u8> ]; - - // Did the parachain heads get updated in this block? - DidUpdate: b"para:did" => default bool; -} - -impl<T: Trait> Module<T> { - /// 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 = <session::Module<T>>::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::<Vec<_>>(); - - let mut roles_gua = roles_val.clone(); - - let mut random_seed = system::Module::<T>::random_seed().to_vec(); - random_seed.extend(b"validator_role_pairs"); - let mut seed = BlakeTwo256::hash(&random_seed); - - // shuffle - for i in 0..(validator_count - 1) { - // 8 bytes of entropy used per cycle, 32 bytes entropy per hash - let offset = (i * 8 % 32) as usize; - - // number of roles remaining to select from. - let remaining = (validator_count - i) as usize; - - // 4 * 2 32-bit ints per 256-bit seed. - 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 { - // into the last 8 bytes - rehash to gather new entropy - seed = BlakeTwo256::hash(&seed); - } - - // exchange last item with randomly chosen first. - 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<u8>, initial_head_data: Vec<u8>) -> Result { - let mut parachains = Self::active_parachains(); - match parachains.binary_search(&id) { - Ok(_) => fail!("Parachain already exists"), - Err(idx) => parachains.insert(idx, id), - } - - <Code<T>>::insert(id, code); - <Parachains<T>>::put(parachains); - <Heads<T>>::insert(id, initial_head_data); - - Ok(()) - } - - /// Deregister a parachain with given id - pub fn deregister_parachain(id: Id) -> Result { - let mut parachains = Self::active_parachains(); - match parachains.binary_search(&id) { - Ok(idx) => { parachains.remove(idx); } - Err(_) => {} - } - - <Code<T>>::remove(id); - <Heads<T>>::remove(id); - <Parachains<T>>::put(parachains); - Ok(()) - } - - fn set_heads(aux: &<T as Trait>::PublicAux, heads: Vec<CandidateReceipt>) -> Result { - ensure!(aux.is_empty(), "set_heads must not be signed"); - ensure!(!<DidUpdate<T>>::exists(), "Parachain heads must be updated only once in the block"); - ensure!( - <system::Module<T>>::extrinsic_index() == T::SET_POSITION, - "Parachain heads update extrinsic must be at position {} in the block" -// , T::SET_POSITION - ); - - let active_parachains = Self::active_parachains(); - let mut iter = active_parachains.iter(); - - // perform this check before writing to storage. - for head in &heads { - ensure!( - iter.find(|&p| p == &head.parachain_index).is_some(), - "Submitted candidate for unregistered or out-of-order parachain {}" -// , head.parachain_index.into_inner() - ); - } - - for head in heads { - let id = head.parachain_index.clone(); - <Heads<T>>::insert(id, head.head_data.0); - } - - <DidUpdate<T>>::put(true); - - Ok(()) - } -} - -impl<T: Trait> Executable for Module<T> { - fn execute() { - assert!(<Self as Store>::DidUpdate::take(), "Parachain heads must be updated once in the block"); - } -} - -/// Parachains module genesis configuration. -#[cfg(any(feature = "std", test))] -#[derive(Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -#[serde(deny_unknown_fields)] -pub struct GenesisConfig<T: Trait> { - /// The initial parachains, mapped to code and initial head data - pub parachains: Vec<(Id, Vec<u8>, Vec<u8>)>, - /// Phantom data. - #[serde(skip)] - pub phantom: PhantomData<T>, -} - -#[cfg(any(feature = "std", test))] -impl<T: Trait> Default for GenesisConfig<T> { - fn default() -> Self { - GenesisConfig { - parachains: Vec::new(), - phantom: PhantomData, - } - } -} - -#[cfg(any(feature = "std", test))] -impl<T: Trait> runtime_primitives::BuildStorage for GenesisConfig<T> -{ - fn build_storage(mut self) -> ::std::result::Result<runtime_io::TestExternalities, String> { - use std::collections::HashMap; - use codec::Encode; - - 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<_, _> = map![ - Self::hash(<Parachains<T>>::key()).to_vec() => only_ids.encode() - ]; - - for (id, code, genesis) in self.parachains { - let code_key = Self::hash(&<Code<T>>::key_for(&id)).to_vec(); - let head_key = Self::hash(&<Heads<T>>::key_for(&id)).to_vec(); - - map.insert(code_key, code.encode()); - map.insert(head_key, genesis.encode()); - } - - Ok(map.into()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::with_externalities; - use substrate_primitives::H256; - use runtime_primitives::BuildStorage; - use runtime_primitives::traits::{HasPublicAux, Identity, BlakeTwo256}; - use runtime_primitives::testing::{Digest, Header}; - use {consensus, timestamp}; - - #[derive(Clone, Eq, PartialEq)] - pub struct Test; - impl HasPublicAux for Test { - type PublicAux = u64; - } - impl consensus::Trait for Test { - type PublicAux = <Self as HasPublicAux>::PublicAux; - type SessionKey = u64; - } - impl system::Trait for Test { - type Index = u64; - type BlockNumber = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type Digest = Digest; - type AccountId = u64; - type Header = Header; - } - impl session::Trait for Test { - const NOTE_OFFLINE_POSITION: u32 = 1; - type ConvertAccountIdToSessionKey = Identity; - type OnSessionChange = (); - } - impl timestamp::Trait for Test { - const TIMESTAMP_SET_POSITION: u32 = 0; - type Moment = u64; - } - impl Trait for Test { - const SET_POSITION: u32 = 0; - - type PublicAux = <Self as HasPublicAux>::PublicAux; - } - - type Parachains = Module<Test>; - - fn new_test_ext(parachains: Vec<(Id, Vec<u8>, Vec<u8>)>) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap(); - t.extend(consensus::GenesisConfig::<Test>{ - code: vec![], - authorities: vec![1, 2, 3], - }.build_storage().unwrap()); - t.extend(session::GenesisConfig::<Test>{ - session_length: 1000, - validators: vec![1, 2, 3, 4, 5, 6, 7, 8], - broken_percent_late: 100, - }.build_storage().unwrap()); - t.extend(GenesisConfig::<Test>{ - parachains: parachains, - phantom: PhantomData, - }.build_storage().unwrap()); - t - } - - #[test] - fn active_parachains_should_work() { - let parachains = vec![ - (5u32.into(), vec![1,2,3], vec![1]), - (100u32.into(), vec![4,5,6], vec![2]), - ]; - - with_externalities(&mut new_test_ext(parachains), || { - assert_eq!(Parachains::active_parachains(), vec![5u32.into(), 100u32.into()]); - assert_eq!(Parachains::parachain_code(&5u32.into()), Some(vec![1,2,3])); - assert_eq!(Parachains::parachain_code(&100u32.into()), Some(vec![4,5,6])); - }); - } - - #[test] - fn register_deregister() { - let parachains = vec![ - (5u32.into(), vec![1,2,3], vec![1]), - (100u32.into(), vec![4,5,6], vec![2,]), - ]; - - with_externalities(&mut new_test_ext(parachains), || { - assert_eq!(Parachains::active_parachains(), vec![5u32.into(), 100u32.into()]); - - assert_eq!(Parachains::parachain_code(&5u32.into()), Some(vec![1,2,3])); - assert_eq!(Parachains::parachain_code(&100u32.into()), Some(vec![4,5,6])); - - Parachains::register_parachain(99u32.into(), vec![7,8,9], vec![1, 1, 1]).unwrap(); - - assert_eq!(Parachains::active_parachains(), vec![5u32.into(), 99u32.into(), 100u32.into()]); - assert_eq!(Parachains::parachain_code(&99u32.into()), Some(vec![7,8,9])); - - Parachains::deregister_parachain(5u32.into()).unwrap(); - - assert_eq!(Parachains::active_parachains(), vec![99u32.into(), 100u32.into()]); - assert_eq!(Parachains::parachain_code(&5u32.into()), None); - }); - } - - #[test] - fn duty_roster_works() { - let parachains = vec![ - (0u32.into(), vec![], vec![]), - (1u32.into(), vec![], vec![]), - ]; - - with_externalities(&mut new_test_ext(parachains), || { - let check_roster = |duty_roster: &DutyRoster| { - assert_eq!(duty_roster.validator_duty.len(), 8); - assert_eq!(duty_roster.guarantor_duty.len(), 8); - for i in (0..2).map(Id::from) { - assert_eq!(duty_roster.validator_duty.iter().filter(|&&j| j == Chain::Parachain(i)).count(), 3); - assert_eq!(duty_roster.guarantor_duty.iter().filter(|&&j| j == Chain::Parachain(i)).count(), 3); - } - assert_eq!(duty_roster.validator_duty.iter().filter(|&&j| j == Chain::Relay).count(), 2); - assert_eq!(duty_roster.guarantor_duty.iter().filter(|&&j| j == Chain::Relay).count(), 2); - }; - - system::Module::<Test>::set_random_seed([0u8; 32].into()); - let duty_roster_0 = Parachains::calculate_duty_roster(); - check_roster(&duty_roster_0); - - system::Module::<Test>::set_random_seed([1u8; 32].into()); - let duty_roster_1 = Parachains::calculate_duty_roster(); - check_roster(&duty_roster_1); - assert!(duty_roster_0 != duty_roster_1); - - - system::Module::<Test>::set_random_seed([2u8; 32].into()); - let duty_roster_2 = Parachains::calculate_duty_roster(); - check_roster(&duty_roster_2); - assert!(duty_roster_0 != duty_roster_2); - assert!(duty_roster_1 != duty_roster_2); - }); - } -} diff --git a/substrate/polkadot/runtime/src/utils.rs b/substrate/polkadot/runtime/src/utils.rs deleted file mode 100644 index acef0609253..00000000000 --- a/substrate/polkadot/runtime/src/utils.rs +++ /dev/null @@ -1,54 +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 <http://www.gnu.org/licenses/>. - -//! Utils for block interaction. - -use rstd::prelude::*; -use super::{Call, UncheckedExtrinsic, Extrinsic, Staking}; -use runtime_primitives::traits::{Checkable, AuxLookup}; -use timestamp::Call as TimestampCall; -use parachains::Call as ParachainsCall; -use session::Call as SessionCall; - -/// Produces the list of inherent extrinsics. -pub fn inherent_extrinsics(data: ::primitives::InherentData) -> Vec<UncheckedExtrinsic> { - let make_inherent = |function| UncheckedExtrinsic::new( - Extrinsic { - signed: Default::default(), - function, - index: 0, - }, - Default::default(), - ); - - let mut inherent = vec![ - make_inherent(Call::Timestamp(TimestampCall::set(data.timestamp))), - make_inherent(Call::Parachains(ParachainsCall::set_heads(data.parachain_heads))), - ]; - - if !data.offline_indices.is_empty() { - inherent.push(make_inherent( - Call::Session(SessionCall::note_offline(data.offline_indices)) - )); - } - - inherent -} - -/// Checks an unchecked extrinsic for validity. -pub fn check_extrinsic(xt: UncheckedExtrinsic) -> bool { - xt.check_with(Staking::lookup).is_ok() -} diff --git a/substrate/polkadot/runtime/wasm/Cargo.lock b/substrate/polkadot/runtime/wasm/Cargo.lock deleted file mode 100644 index 7f6ce977734..00000000000 --- a/substrate/polkadot/runtime/wasm/Cargo.lock +++ /dev/null @@ -1,1256 +0,0 @@ -[[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.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "arrayvec" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "atty" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.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 = "base58" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "bitflags" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "blake2-rfc" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "byteorder" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "cc" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "cfg-if" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -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 = [ - "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 = "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" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "ed25519" -version = "0.1.0" -dependencies = [ - "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 = "elastic-array" -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.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "environmental" -version = "0.1.0" - -[[package]] -name = "ethbloom" -version = "0.5.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)", - "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 = "ethcore-bytes" -version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#dec390a89fe038337399315daf15e628ffbb4d8e" - -[[package]] -name = "ethcore-logger" -version = "1.12.0" -source = "git+https://github.com/paritytech/parity.git#dec390a89fe038337399315daf15e628ffbb4d8e" -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)", - "atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "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.5.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.40 (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]] -name = "fixed-hash" -version = "0.1.3" -source = "git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm#8dc457899afdaf968ff7f16140b03d1e37b01d71" -dependencies = [ - "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 = "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.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)", -] - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "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)", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "gcc" -version = "0.3.54" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "hashdb" -version = "0.1.1" -source = "git+https://github.com/paritytech/parity.git#dec390a89fe038337399315daf15e628ffbb4d8e" -dependencies = [ - "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)", -] - -[[package]] -name = "heapsize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "hex-literal" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "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.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.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.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "keccak-hash" -version = "0.1.2" -source = "git+https://github.com/paritytech/parity.git#dec390a89fe038337399315daf15e628ffbb4d8e" -dependencies = [ - "ethereum-types 0.3.2 (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 = "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.41" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "log" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "log" -version = "0.4.1" -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 = "memchr" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.41 (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" -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#dec390a89fe038337399315daf15e628ffbb4d8e" -dependencies = [ - "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)", - "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.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)", -] - -[[package]] -name = "nan-preserving-float" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -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.41 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "owning_ref" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parity-wasm" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.3 (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.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot" -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.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parking_lot_core" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "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.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "patricia-trie" -version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#dec390a89fe038337399315daf15e628ffbb4d8e" -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.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.1.1 (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)", - "rlp 0.2.1 (git+https://github.com/paritytech/parity.git)", - "triehash 0.1.0 (git+https://github.com/paritytech/parity.git)", -] - -[[package]] -name = "plain_hasher" -version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#dec390a89fe038337399315daf15e628ffbb4d8e" -dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "polkadot-primitives" -version = "0.1.0" -dependencies = [ - "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-codec-derive 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 1.0.0 (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", - "substrate-runtime-council 0.1.0", - "substrate-runtime-democracy 0.1.0", - "substrate-runtime-executive 0.1.0", - "substrate-runtime-io 0.1.0", - "substrate-runtime-primitives 0.1.0", - "substrate-runtime-session 0.1.0", - "substrate-runtime-staking 0.1.0", - "substrate-runtime-std 0.1.0", - "substrate-runtime-support 0.1.0", - "substrate-runtime-system 0.1.0", - "substrate-runtime-timestamp 0.1.0", - "substrate-runtime-version 0.1.0", -] - -[[package]] -name = "proc-macro-hack" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -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.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "pwasm-libc" -version = "0.1.0" - -[[package]] -name = "quote" -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" -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.41 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand" -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.41 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rayon" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rayon-core" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "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.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "redox_syscall" -version = "0.1.40" -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.40 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex" -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.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.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 = "ring" -version = "0.12.1" -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.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)", -] - -[[package]] -name = "rlp" -version = "0.2.1" -source = "git+https://github.com/paritytech/parity.git#dec390a89fe038337399315daf15e628ffbb4d8e" -dependencies = [ - "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)", -] - -[[package]] -name = "rlp" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "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)", -] - -[[package]] -name = "rustc-hex" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rustc-hex" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "rustc_version" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "safe-mix" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "scopeguard" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "semver" -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)", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde_derive" -version = "1.0.64" -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)", - "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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stable_deref_trait" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "substrate-codec" -version = "0.1.0" -dependencies = [ - "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "substrate-codec-derive" -version = "0.1.0" -dependencies = [ - "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 = "substrate-keyring" -version = "0.1.0" -dependencies = [ - "ed25519 0.1.0", - "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]] -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.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 (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-codec-derive 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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "substrate-runtime-consensus" -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", - "substrate-runtime-primitives 0.1.0", - "substrate-runtime-std 0.1.0", - "substrate-runtime-support 0.1.0", - "substrate-runtime-system 0.1.0", -] - -[[package]] -name = "substrate-runtime-council" -version = "0.1.0" -dependencies = [ - "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 1.0.0 (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-keyring 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-consensus 0.1.0", - "substrate-runtime-democracy 0.1.0", - "substrate-runtime-io 0.1.0", - "substrate-runtime-primitives 0.1.0", - "substrate-runtime-session 0.1.0", - "substrate-runtime-staking 0.1.0", - "substrate-runtime-std 0.1.0", - "substrate-runtime-support 0.1.0", - "substrate-runtime-system 0.1.0", -] - -[[package]] -name = "substrate-runtime-democracy" -version = "0.1.0" -dependencies = [ - "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "safe-mix 1.0.0 (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-codec-derive 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-consensus 0.1.0", - "substrate-runtime-io 0.1.0", - "substrate-runtime-primitives 0.1.0", - "substrate-runtime-session 0.1.0", - "substrate-runtime-staking 0.1.0", - "substrate-runtime-std 0.1.0", - "substrate-runtime-support 0.1.0", - "substrate-runtime-system 0.1.0", -] - -[[package]] -name = "substrate-runtime-executive" -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-runtime-io 0.1.0", - "substrate-runtime-primitives 0.1.0", - "substrate-runtime-std 0.1.0", - "substrate-runtime-support 0.1.0", - "substrate-runtime-system 0.1.0", -] - -[[package]] -name = "substrate-runtime-io" -version = "0.1.0" -dependencies = [ - "ed25519 0.1.0", - "environmental 0.1.0", - "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", - "substrate-state-machine 0.1.0", - "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)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "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)", - "substrate-codec 0.1.0", - "substrate-codec-derive 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-sandbox" -version = "0.1.0" -dependencies = [ - "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.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "substrate-runtime-session" -version = "0.1.0" -dependencies = [ - "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "safe-mix 1.0.0 (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-keyring 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-consensus 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", - "substrate-runtime-system 0.1.0", - "substrate-runtime-timestamp 0.1.0", -] - -[[package]] -name = "substrate-runtime-staking" -version = "0.1.0" -dependencies = [ - "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "safe-mix 1.0.0 (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-keyring 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-consensus 0.1.0", - "substrate-runtime-io 0.1.0", - "substrate-runtime-primitives 0.1.0", - "substrate-runtime-sandbox 0.1.0", - "substrate-runtime-session 0.1.0", - "substrate-runtime-std 0.1.0", - "substrate-runtime-support 0.1.0", - "substrate-runtime-system 0.1.0", - "substrate-runtime-timestamp 0.1.0", -] - -[[package]] -name = "substrate-runtime-std" -version = "0.1.0" -dependencies = [ - "pwasm-alloc 0.1.0", - "pwasm-libc 0.1.0", - "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "substrate-runtime-support" -version = "0.1.0" -dependencies = [ - "ed25519 0.1.0", - "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", - "substrate-runtime-std 0.1.0", -] - -[[package]] -name = "substrate-runtime-system" -version = "0.1.0" -dependencies = [ - "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "safe-mix 1.0.0 (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", - "substrate-runtime-primitives 0.1.0", - "substrate-runtime-std 0.1.0", - "substrate-runtime-support 0.1.0", -] - -[[package]] -name = "substrate-runtime-timestamp" -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", - "substrate-runtime-io 0.1.0", - "substrate-runtime-primitives 0.1.0", - "substrate-runtime-std 0.1.0", - "substrate-runtime-support 0.1.0", - "substrate-runtime-system 0.1.0", -] - -[[package]] -name = "substrate-runtime-version" -version = "0.1.0" -dependencies = [ - "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-codec-derive 0.1.0", - "substrate-runtime-std 0.1.0", - "substrate-runtime-support 0.1.0", -] - -[[package]] -name = "substrate-state-machine" -version = "0.1.0" -dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hashdb 0.1.1 (git+https://github.com/paritytech/parity.git)", - "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)", - "memorydb 0.1.1 (git+https://github.com/paritytech/parity.git)", - "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "patricia-trie 0.1.0 (git+https://github.com/paritytech/parity.git)", - "substrate-primitives 0.1.0", - "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "syn" -version = "0.14.1" -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)", - "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 = "termion" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (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.1 (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.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.40 (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.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 = "triehash" -version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#dec390a89fe038337399315daf15e628ffbb4d8e" -dependencies = [ - "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.2 (git+https://github.com/paritytech/parity.git)", - "rlp 0.2.1 (git+https://github.com/paritytech/parity.git)", -] - -[[package]] -name = "triehash" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "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]] -name = "twox-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -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" -source = "git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm#8dc457899afdaf968ff7f16140b03d1e37b01d71" -dependencies = [ - "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.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.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "void 1.0.2 (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" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "wasmi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "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)", - "nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -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.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455" -"checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" -"checksum atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2fc4a1aa4c24c0718a250f0681885c1af91419d242f29eb8f2ab28502d80dbd1" -"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.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 elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" -"checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" -"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" -"checksum ethcore-bytes 0.1.0 (git+https://github.com/paritytech/parity.git)" = "<none>" -"checksum ethcore-logger 1.12.0 (git+https://github.com/paritytech/parity.git)" = "<none>" -"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)" = "<none>" -"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 (git+https://github.com/paritytech/parity.git)" = "<none>" -"checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" -"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)" = "<none>" -"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)" = "<none>" -"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"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 memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" -"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 memorydb 0.1.1 (git+https://github.com/paritytech/parity.git)" = "<none>" -"checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f" -"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.31.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1c91199d14bd5b78ecade323d4a891d094799749c1b9e82d9c590c2e2849a40" -"checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" -"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 patricia-trie 0.1.0 (git+https://github.com/paritytech/parity.git)" = "<none>" -"checksum plain_hasher 0.1.0 (git+https://github.com/paritytech/parity.git)" = "<none>" -"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 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.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" -"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" -"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"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 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)" = "<none>" -"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 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b03280c2813907a030785570c577fb27d3deec8da4c18566751ade94de0ace" -"checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" -"checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" -"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"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.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.4 (registry+https://github.com/rust-lang/crates.io-index)" = "211a489e65e94b103926d2054ae515a1cdb5d515ea0ef414fee23b7e043ce748" -"checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b" -"checksum syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6dfd71b2be5a58ee30a6f8ea355ba8290d397131c00dfa55c3d34e6e13db5101" -"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.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" -"checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" -"checksum triehash 0.1.0 (git+https://github.com/paritytech/parity.git)" = "<none>" -"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)" = "<none>" -"checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" -"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"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.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "522fe3fdd44a56f25cd5ddcd8ccdb1cf2e982ceb28fcb00f41d8a018ae5245a8" -"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/polkadot/runtime/wasm/Cargo.toml b/substrate/polkadot/runtime/wasm/Cargo.toml deleted file mode 100644 index ba21f37d110..00000000000 --- a/substrate/polkadot/runtime/wasm/Cargo.toml +++ /dev/null @@ -1,56 +0,0 @@ -[package] -name = "polkadot-runtime" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] - -[lib] -crate-type = ["cdylib"] - -[dependencies] -integer-sqrt = { git = "https://github.com/paritytech/integer-sqrt-rs.git", branch = "master" } -polkadot-primitives = { path = "../../primitives", default-features = false } -safe-mix = { version = "1.0", default-features = false } -substrate-codec = { path = "../../../substrate/codec", default-features = false } -substrate-primitives = { path = "../../../substrate/primitives", default-features = false } -substrate-runtime-std = { path = "../../../substrate/runtime-std", default-features = false } -substrate-runtime-io = { path = "../../../substrate/runtime-io", default-features = false } -substrate-runtime-support = { path = "../../../substrate/runtime-support", default-features = false } -substrate-runtime-consensus = { path = "../../../substrate/runtime/consensus", default-features = false } -substrate-runtime-council = { path = "../../../substrate/runtime/council", default-features = false } -substrate-runtime-democracy = { path = "../../../substrate/runtime/democracy", default-features = false } -substrate-runtime-executive = { path = "../../../substrate/runtime/executive", default-features = false } -substrate-runtime-primitives = { path = "../../../substrate/runtime/primitives", default-features = false } -substrate-runtime-session = { path = "../../../substrate/runtime/session", default-features = false } -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 } -substrate-runtime-version = { path = "../../../substrate/runtime/version", default-features = false } - -[features] -default = [] -std = [ - "polkadot-primitives/std", - "safe-mix/std", - "substrate-codec/std", - "substrate-primitives/std", - "substrate-runtime-std/std", - "substrate-runtime-io/std", - "substrate-runtime-support/std", - "substrate-runtime-consensus/std", - "substrate-runtime-council/std", - "substrate-runtime-democracy/std", - "substrate-runtime-executive/std", - "substrate-runtime-primitives/std", - "substrate-runtime-session/std", - "substrate-runtime-staking/std", - "substrate-runtime-system/std", - "substrate-runtime-timestamp/std", - "substrate-runtime-version/std", -] - -[profile.release] -panic = "abort" -lto = true - -[workspace] -members = [] diff --git a/substrate/polkadot/runtime/wasm/build.sh b/substrate/polkadot/runtime/wasm/build.sh deleted file mode 100755 index 88010211f95..00000000000 --- a/substrate/polkadot/runtime/wasm/build.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -e - -cargo +nightly build --target=wasm32-unknown-unknown --release -for i in polkadot_runtime -do - wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm -done diff --git a/substrate/polkadot/runtime/wasm/src b/substrate/polkadot/runtime/wasm/src deleted file mode 120000 index 5cd551cf269..00000000000 --- a/substrate/polkadot/runtime/wasm/src +++ /dev/null @@ -1 +0,0 @@ -../src \ No newline at end of file diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm deleted file mode 100644 index 055036f6662de56188b6716239d2c24430d42cb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328049 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 diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm deleted file mode 100755 index 6bc54e865541bab0dfbc73d912d2c33e44c90886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328142 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∾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 diff --git a/substrate/polkadot/service/Cargo.toml b/substrate/polkadot/service/Cargo.toml deleted file mode 100644 index b0561122e15..00000000000 --- a/substrate/polkadot/service/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "polkadot-service" -version = "0.3.0" -authors = ["Parity Technologies <admin@parity.io>"] - -[dependencies] -parking_lot = "0.4" -error-chain = "0.12" -lazy_static = "1.0" -log = "0.3" -slog = "^2" -tokio = "0.1.7" -hex-literal = "0.1" -ed25519 = { path = "../../substrate/ed25519" } -polkadot-availability-store = { path = "../availability-store" } -polkadot-primitives = { path = "../primitives" } -polkadot-runtime = { path = "../runtime" } -polkadot-consensus = { path = "../consensus" } -polkadot-executor = { path = "../executor" } -polkadot-api = { path = "../api" } -polkadot-transaction-pool = { path = "../transaction-pool" } -polkadot-network = { path = "../network" } -substrate-runtime-io = { path = "../../substrate/runtime-io" } -substrate-primitives = { path = "../../substrate/primitives" } -substrate-network = { path = "../../substrate/network" } -substrate-client = { path = "../../substrate/client" } -substrate-codec = { path = "../../substrate/codec" } -substrate-service = { path = "../../substrate/service" } -substrate-telemetry = { path = "../../substrate/telemetry" } diff --git a/substrate/polkadot/service/README.adoc b/substrate/polkadot/service/README.adoc deleted file mode 100644 index 3de38671285..00000000000 --- a/substrate/polkadot/service/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Service - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/service/res/krummelanke.json b/substrate/polkadot/service/res/krummelanke.json deleted file mode 100644 index 0e76ea124b9..00000000000 --- a/substrate/polkadot/service/res/krummelanke.json +++ /dev/null @@ -1,51 +0,0 @@ -{ -"name": "Krumme Lanke", -"id": "krummelanke", -"genesis": {"raw": { - "0x9768f3cbdd14c1a63474dfbdbe052f42": "0x80f4030000000000", - "0x3b700687fecdff5ec1c4a5b714521eb6": "0x0000000000000000", - "0xa059ae3b3ef725721e97452642803b61": "0x0c00000000000000", - "0x81c1e7165a6371a30eda241a30ea26dd": "0x6400000000000000", - "0x45e71d57a2e3a4eace16dbc9286652e3": "0x00000000", - "0x1d72be21946c0b245c026b7be8256cc5": "0x00000000", - "0xd68ee884e4baac617d9823d543ab9295": "0x0000000000000010", - "0x1d007e138cb61e2524a67b15ec01d8cb": "0x0000000000000010", - "0xbfde7c86a8efd60ee5db2de6446703d5": "0xc04e000000000000", - "0x3a617574683a6c656e": "0x04000000", - "0xb54b186fe8782c2a03f2fd15f95c26bf": "0x00000000", - "0x9dd24013e492bdbb3544fba06734baf7": "0xd002000000000000", - "0xd52c584b1e542130e5b277f1af7b7714": "0x00000000", - "0x3a617574683a03000000": "0x8101764f45778d4980dadaceee6e8af2517d3ab91ac9bec9cd1714fa5994081c", - "0x916dbd78366f27a9597bd4c831e7914d": "0x00e9070000000000", - "0xf37d2c26c6953b18878dbc1dc65edbc0": "0x1800000000000000", - "0x8d62e0fbc08e8694f8991f88d763c5fb": "0x5a00000000000000", - "0xa659ecb253960cfd890e08809104b815": "0x809d000000000000", - "0x3a617574683a00000000": "0x82c39b31a2b79a90f8e66e7a77fdb85a4ed5517f2ae39f6a80565e8ecae85cf5", - "0x3a617574683a02000000": "0x063d7787ebca768b7445dfebe7d62cbb1625ff4dba288ea34488da266dd6dca5", - "0xe885ffcc2245c8b7d128685cac6b1a0b": "0x0100000000000000", - "0x94b01408fc662bcf2e97df23ce6d67e2": "0x0100000000000000", - "0x6cac40e934558080fbf29c55c113b461": "0x0000000000000000", - "0x8379e35e0cd953085e0404b9223c0cb0": "0xc04e000000000000", - "0x5a3dcf1edb28ea65a038d1eef6767380": "0x003b010000000000", - "0x7a5bafa684003bc748abe89bfbd20f76": "0xe803000000000000", - "0x3d5680071e92ff27a2914bba661e5d83": "0x400b000000000000", - "0x274351e20682cb2ed212b6eab04ef89f": "0x00000000", - "0x3a617574683a01000000": "0x4de37a07567ebcbf8c64568428a835269a566723687058e017b6d69db00a77e7", - "0x482b5d7b62ccccac45d55bd43c767266": "0x6400000000000000", - "0x35b8ced31f34a951bc3b56db2f425c51": "0x00000000", - "0x98b9e95963cac608a3d0d537fbeaf5c2": "0x0400000082c39b31a2b79a90f8e66e7a77fdb85a4ed5517f2ae39f6a80565e8ecae85cf54de37a07567ebcbf8c64568428a835269a566723687058e017b6d69db00a77e7063d7787ebca768b7445dfebe7d62cbb1625ff4dba288ea34488da266dd6dca58101764f45778d4980dadaceee6e8af2517d3ab91ac9bec9cd1714fa5994081c", - "0xce83497694648564e47482d0dc444564": "0x18000000", - "0xa0c2154e69bce912f28e890561fcb95c": "0x0400000082c39b31a2b79a90f8e66e7a77fdb85a4ed5517f2ae39f6a80565e8ecae85cf54de37a07567ebcbf8c64568428a835269a566723687058e017b6d69db00a77e7063d7787ebca768b7445dfebe7d62cbb1625ff4dba288ea34488da266dd6dca58101764f45778d4980dadaceee6e8af2517d3ab91ac9bec9cd1714fa5994081c", - "0x9b7ecc8eb0fade7c91d94b8715fc9ee1": "0xe803000000000000", - "0x3a636f6465": "0x0061736d010000000197011760027f7f0060057f7f7f7f7f017f60017f017f60037f7f7f017f60017f0060000060037f7f7f0060047f7f7f7f006000017e60027f7f017f60027f7e0060037e7f7f0060017f017e600a7f7f7f7f7f7f7f7f7f7f0060017e0060067f7f7f7f7f7f0060047f7f7f7f017f60047f7f7f7f017e60067f7f7f7f7f7f017f60057f7f7f7f7f0060027f7f017e60027f7e017f60037f7f7e0002f1031603656e76146578745f6765745f73746f726167655f696e746f000103656e760a6578745f6d616c6c6f63000203656e76086578745f66726565000403656e760c6578745f74776f785f313238000603656e760f6578745f7365745f73746f72616765000703656e76116578745f636c6561725f73746f72616765000003656e760a6578745f6d656d636d70000303656e76186578745f656e756d6572617465645f747269655f726f6f74000703656e760e6578745f7072696e745f75746638000003656e760d6578745f7072696e745f6e756d000e03656e760a6578745f6d656d637079000303656e760b6578745f6d656d6d6f7665000303656e760a6578745f6d656d736574000303656e76166578745f73616e64626f785f6d656d6f72795f6e6577000903656e76176578745f73616e64626f785f696e7374616e7469617465001203656e76126578745f73616e64626f785f696e766f6b65001003656e76166578745f73616e64626f785f6d656d6f72795f676574001003656e76166578745f73616e64626f785f6d656d6f72795f736574001003656e760e6578745f626c616b65325f323536000603656e760d6578745f7072696e745f686578000003656e76106578745f73746f726167655f726f6f74000403656e76126578745f656432353531395f766572696679001003d001ce010003040505050500030000020404050400060000060505000804040900000505040004030004060a040b0005000c0c00040405060404060d0504050002040400050505050505050505050505050505050505040504050405050405040505040504050405040504050405040506060000060007070f070f0710070707071107130906000409060000040500140014061404140a06041414140002060a15000000000400000004040000040c000405070a1400000000000413060706160704140616060000060000000000000000090405017001161605030100110609017f0141d0c3c0000b07a8010b066d656d6f7279020011727573745f626567696e5f756e77696e64004d066d616c6c6f630052046672656500530b617574686f72697469657300a10110696e697469616c6973655f626c6f636b00a3010f6170706c795f65787472696e73696300a5010d657865637574655f626c6f636b00a7010e66696e616c6973655f626c6f636b00ab010f76616c696461746f725f636f756e7400ac010a76616c696461746f727300ad010930010041010b158f019001910192019301cc01cd01ce01c601cf01d001d101c701d30195019b01d4019401d501d6019c010abbe40cce01ea0403067f017e057f230041106b220224002002410036020020012001280208220341002001280200220420012802042205200241042003100022032003417f461b2203410420034104491b6a22063602080240024002400240200341034d0d0020022802002207ad420c7e2208422088a70d022008a72203417f4c0d01024002402003450d002003100122090d010c050b410421090b20022007360204200220093602002002410036020802402007450d00200141086a210a4100210b4100210c03402002410036020c200a4100200420052002410c6a41042006100022012001417f461b2201410420014104491b20066a2206360200024002400240200141034d0d00200228020c2201417f4c0d01024002402001450d00200110012203450d0a20034100200110171a0c010b410121030b200a20014100200420052003200120061000220d200d417f461b220d200d20014b1b20066a220636020002402001200d4b0d002003450d01200c41016a210c2001ad22084220862008842108200b2002280204470d0320021018200241086a280200210b200228020021090c030b200310020b200228020021060240200b450d00200b410c6c21032006210103400240200141046a280200450d00200128020010020b2001410c6a2101200341746a22030d000b0b2002280204450d04200610020c040b1019000b2009200b410c6c6a2201200837020420012003360200200241086a200b41016a220b360200200c2007490d000b200228020021090b2009450d002000200229020437020420002009360200200241106a24000f0b20004100360200200241106a24000f0b101a000b101b000b101c000b0a00200020012002100c0b810101057f410421010240024002400240200041046a2802002202450d00200241186c2201417f4c0d0320002802002103200110012204450d022004200320012002410c6c2205200520014b1b101e1a20031002200241017421010c010b413010012204450d010b20002004360200200041046a20013602000f0b101c000b1073000b05001041000b05001041000b05001041000b0500104e000bc11105097f037e017f017e027f230041a0026b220224002001280200210320024180026a20012802042204412020044120491b22056a41004100412020056b2005411f4b1b10171a20024180026a20032005101e1a2001200420056b22063602042001200320056a22053602000240024002400240024002400240024002402004411f4d0d00200241e0016a41186a220420024180026a41186a2203290300370300200241e0016a41106a220720024180026a41106a2208290300370300200241e0016a41086a220920024180026a41086a220a29030037030020022002290380023703e00120032004290300220b37030020082007290300220c370300200a2009290300220d370300200241c0006a41086a2204200d370300200241c0006a41106a2203200c370300200241c0006a41186a2207200b370300200220022903e001220b3703402002200b37038002200241206a41186a2007290300370300200241206a41106a2003290300370300200241206a41086a200429030037030020022002290340370320200242003703800220024180026a20052006410820064108491b2204101e1a200141046a2207200620046b22033602002001200520046a2204360200200641074d0d01200229038002210c20024180026a2003412020034120491b22056a41004100412020056b2005411f4b1b10171a20024180026a20042005101e1a2007200320056b22063602002001200420056a22043602002003411f4d0d02200241e0016a41186a220320024180026a41186a2207290300370300200241e0016a41106a220820024180026a41106a2209290300370300200241e0016a41086a220a20024180026a41086a220e29030037030020022002290380023703e00120072003290300220b37030020092008290300220d370300200e200a290300220f37030020024180016a41086a2205200f37030020024180016a41106a2210200d37030020024180016a41186a2211200b370300200220022903e001220b370380012002200b37038002200241e0006a41186a2011290300370300200241e0006a41106a2010290300370300200241e0006a41086a2005290300370300200220022903800137036020024180026a2006412020064120491b22056a41004100412020056b2005411f4b1b10171a20024180026a20042005101e1a200141046a2211200620056b22103602002001200420056a22053602002006411f4d0d032003200729030037030020082009290300370300200a200e29030037030020022002290380023703e00120072003290300220b37030020092008290300220d370300200e200a290300220f370300200241c0016a41086a2204200f370300200241c0016a41106a2203200d370300200241c0016a41186a2206200b370300200220022903e001220b3703c0012002200b37038002200241a0016a41186a2006290300370300200241a0016a41106a2003290300370300200241a0016a41086a2004290300370300200220022903c0013703a001200241003602800220024180026a20052010410420104104491b2204101e1a2011201020046b3602002001200520046a360200201041034d0d062002280280022208ad420c7e220b422088a70d08200ba72205417f4c0d072005450d042005100122070d05101c000b20024180026a41186a200241e0016a41186a29000037030020024180026a41106a200241e0016a41106a29000037030020024180026a41086a200241e0016a41086a290000370300200220022900e0013703800220004100360208200241a0026a24000f0b20004100360208200241a0026a24000f0b20024180026a41186a200241e0016a41186a29000037030020024180026a41106a200241e0016a41106a29000037030020024180026a41086a200241e0016a41086a290000370300200220022900e0013703800220004100360208200241a0026a24000f0b2007200329000037030020092008290000370300200e200a290000370300200220022900e0013703800220004100360208200241a0026a24000f0b410421070b200220083602e401200220073602e00141002105200241003602e80102402008450d00200241e8016a210941002104034020024180026a2001101f024002402002280280022203450d00200441016a2104200229028402210b200520022802e401470d01200241e0016a10182009280200210520022802e00121070c010b20022802e001210402402005450d002005410c6c21052004210103400240200141046a280200450d00200128020010020b2001410c6a2101200541746a22050d000b0b20022802e401450d03200410020c030b20072005410c6c6a2206200b370204200620033602002009200541016a220536020020042008490d000b20022802e00121070b2007450d0020022902e401210b20024180026a41186a2201200241206a41186a29030037030020024180026a41106a2205200241206a41106a29030037030020024180026a41086a2204200241206a41086a290300370300200241e0016a41086a2203200241e0006a41086a290300370300200241e0016a41106a2206200241e0006a41106a290300370300200241e0016a41186a2208200241e0006a41186a290300370300200241086a2209200241a0016a41086a290300370300200241106a220a200241a0016a41106a290300370300200241186a220e200241a0016a41186a2903003703002002200229032037038002200220022903603703e001200220022903a001370300200020073602082000200c3703002000200b37020c200041146a2002290380023702002000411c6a2004290300370200200041246a20052903003702002000412c6a2001290300370200200041346a20022903e0013702002000413c6a2003290300370200200041c4006a2006290300370200200041cc006a2008290300370200200041ec006a200e290300370200200041e4006a200a290300370200200041dc006a2009290300370200200041d4006a2002290300370200200241a0026a24000f0b20004100360208200241a0026a24000f0b101a000b101b000b0a00200020012002100a0b880201067f230041106b220224002002410036020c2002410c6a2001280200220320012802042204410420044104491b2205101e1a2001200420056b22063602042001200320056a220536020002400240024002400240200441034d0d00200228020c2204417f4c0d032004450d01200410012207450d0420074100200410171a0c020b20004100360200200241106a24000f0b410121070b200720052006200420062004491b2203101e2107200141046a200620036b3602002001200520036a3602000240200620044f0d002000410036020020071002200241106a24000f0b2000200436020420002007360200200041086a2004360200200241106a24000f0b1019000b101c000ba6c80107097f047e047f027e257f057e077f230041f0126b2202240020012001280200200128020422034104200341044922041b22056a22063602002001200320056b2203360204024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040d00200241d8096a2003412020034120491b22046a41004100412020046b2004411f4b1b10171a200241d8096a20062004101e1a200141046a200320046b22053602002001200620046a22043602002003411f4d0d01200241086a41186a2203200241d8096a41186a2206290300370300200241086a41106a2207200241d8096a41106a2208290300370300200241086a41086a2209200241d8096a41086a220a290300370300200220022903d80937030820062003290300220b37030020082007290300220c370300200a2009290300220d370300200241e0076a41086a2203200d370300200241e0076a41106a2206200c370300200241e0076a41186a2207200b37030020022002290308220b3703e0072002200b3703d809200241c0076a41186a2007290300370300200241c0076a41106a2006290300370300200241c0076a41086a2003290300370300200220022903e0073703c00720024200370308200241086a200420054108200541084922061b2203101e1a200141046a2207200520036b22053602002001200420036a220336020020060d022002290308210e200241003a0008200241086a200320054100472204101e1a2007200520046b220f3602002001200320046a22043602002005450d184107210320022d0008221041074b0d37024020100e08000507083b090406000b200241003a0008200241086a2004200f4100472205101e1a200141046a2208200f20056b22063602002001200420056a2207360200410321094200210d20022d00084108744100200f1b2005724181fe03714101470d35200241f8096a2006412020064120491b22046a41004100412020046b2004411f4b1b10171a200241f8096a20072004101e1a2008200620046b22053602002001200720046a22043602002006411f4d0d0c200241086a41186a2206200241f8096a41186a2207290300370300200241086a41106a2208200241f8096a41106a220a290300370300200241086a41086a2211200241f8096a41086a2212290300370300200220022903f80937030820072006290300220b370300200a2008290300220c370300201220112903002213370300200241d8116a41086a22062013370300200241d8116a41106a2207200c370300200241d8116a41186a2208200b37030020022002290308220b3703d8112002200b3703f80920024198106a41186a200829030037030020024198106a41106a200729030037030020024198106a41086a2006290300370300200220022903d8113703981020024200370308200241086a200420054108200541084922071b2206101e1a200141046a2208200520066b22053602002001200420066a220636020020070d332002290308210b200241f8096a2005412020054120491b22046a41004100412020046b2004411f4b1b10171a200241f8096a20062004101e1a2008200520046b22073602002001200620046a22043602002005411f4d0d20200241086a41186a2205200241f8096a41186a2206290300370300200241086a41106a2208200241f8096a41106a220a290300370300200241086a41086a2211200241f8096a41086a2212290300370300200220022903f80937030820062005290300220c370300200a20082903002213370300201220112903002214370300200241d8116a41086a22052014370300200241d8116a41106a22062013370300200241d8116a41186a2208200c37030020022002290308220c3703d8112002200c3703f809200241b8106a41186a2008290300370300200241b8106a41106a2006290300370300200241b8106a41086a2005290300370300200220022903d8113703b810200241003a0008200241086a200420074100472205101e1a200141046a200720056b22063602002001200420056a22043602002007450d3341014102410320022d000822054112461b20054111461b22054101460d2b20054103460d3320024100360208200241086a20042006410420064104491b2205101e1a200141046a2208200620056b22073602002001200420056a2205360200200641034d0d3320022802082115200241f8096a2007412020074120491b22046a41004100412020046b2004411f4b1b10171a200241f8096a20052004101e1a2008200720046b22063602002001200520046a22083602002007411f4d0d2a200241086a41186a2216200241f8096a41186a2207290300370300200241086a41106a2217200241f8096a41106a2218290300370300200241086a41086a2219200241f8096a41086a221a290300370300200220022903f80937030820182017290300370300201a20192903003703002007201629030037030020024198126a41086a2204200241870a6a221b280000360200200220022903083703f809200220022900ff093703981220072d0000210520022800fb09211c20022d008b0a211d20022d008c0a211e20022f008d0a210a20022d008f0a211120022f00910a210f20022d00930a211220022d00940a211f20022f00950a212020022d00970a211020022f01f809212120022d00fa092122200241d8096a41086a200428020036020020022002290398123703d809200241f8096a200641c000200641c000491b22046a4100410041c00020046b2004413f4b1b10171a200241f8096a20082004101e1a200141046a2223200620046b22243602002001200820046a22253602002006413f4d0d29200241086a41386a2204200241f8096a41386a2206290300370300200241086a41306a2208200241f8096a41306a2226290300370300200241086a41286a2227200241f8096a41286a2228290300370300200241086a41206a2229200241f8096a41206a222a29030037030020162007290300370300201720182903003703002019201a290300370300200220022903f80937030820182017290300370300201a201929030037030020072016290300370300202a202929030037030020282027290300370300202620082903003703002006200429030037030020024198116a41086a2204201b29000037030020024198116a41106a22062002418f0a6a29000037030020024198116a41186a2207200241f8096a411f6a29000037030020024198116a41206a22082002419f0a6a29000037030020024198116a41286a2216200241a70a6a29000037030020024198116a41306a2217200241af0a6a29000037030020024198116a41386a2218200241f8096a413f6a2d00003a0000200220022903083703f809200220022900ff093703981120023502f809210c20023201fc09211320023100fe092114200241d8106a41086a2004290300370300200241d8106a41106a2006290300370300200241d8106a41186a2007290300370300200241d8106a41206a2008290300370300200241d8106a41286a2016290300370300200241d8106a41306a2017290300370300200241d8106a41386a20182d00003a000020022002290398113703d81020022f01e209211620022d00e109210820022d00e009211920022f01de09211720022d00dd09210720022d00dc09211820022802d809212b200241f8096a2024412020244120491b22046a41004100412020046b2004411f4b1b10171a200241f8096a20252004101e1a2023202420046b22063602002001202520046a222c3602002024411f4d0d28200241086a41186a222d200241f8096a41186a222e290300370300200241086a41106a222f200241f8096a41106a2230290300370300200241086a41086a2231200241f8096a41086a2232290300370300200220022903f8093703082030202f29030037030020322031290300370300202e202d290300370300200241b8126a41086a2204200241870a6a280000360200200220022903083703f809200220022900ff093703b812202e2d0000212620022800fb09211a20022d008b0a212420022d008c0a212520022f008d0a211b20022d008f0a212320022f00910a212720022d00930a212820022d00940a212920022f00950a212a20022d00970a213320022f01f809213420022d00fa092135200241d8096a41086a22362004280200360200200220022903b8123703d809200241f8096a200641c000200641c000491b22046a4100410041c00020046b2004413f4b1b10171a200241f8096a202c2004101e1a200141046a200620046b3602002001202c20046a3602002006413f4d0d2720212022411074722137200c201320144210868442208684210c20342035411074722106200241086a41386a2204200241f8096a41386a2221290300370300200241086a41306a2222200241f8096a41306a222c290300370300200241086a41286a2234200241f8096a41286a2235290300370300200241086a41206a2238200241f8096a41206a2239290300370300202d202e290300370300202f203029030037030020312032290300370300200220022903f809370308202120042903002213370300202c2022290300221437030020352034290300223a37030020392038290300223b370300202e202d290300223c3703002030202f290300223d37030020322031290300223e370300200241d8116a41086a223f203e370300200241d8116a41106a2240203d370300200241d8116a41186a2241203c370300200241d8116a41206a2242203b370300200241d8116a41286a2243203a370300200241d8116a41306a22442014370300200241d8116a41386a224520133703002002200229030822133703d811200220133703f809200241e0126a41086a20362802003602002031203f290300370300202f2040290300370300202d204129030037030020382042290300370300203420432903003703002022204429030037030020042045290300370300200220022903d8093703e012200220022903d8113703082021200241d8106a41386a2d00003a0000202c200241d8106a41306a2903003703002035200241d8106a41286a2903003703002039200241d8106a41206a290300370300202e200241d8106a41186a2903003703002030200241d8106a41106a2903003703002032200241d8106a41086a290300370300200220022903d8103703f809410121040c2c0b200041073a0008200241f0126a24000f0b200241d8096a41186a200241086a41186a290000370300200241d8096a41106a200241086a41106a290000370300200241d8096a41086a200241086a41086a290000370300200220022900083703d8090b410721040c380b200241003a0008200241086a2004200f4100472206101e1a200141046a200f20066b22053602002001200420066a2206360200200f450d3320022d0008220441044b0d33024020040e050019161714000b20024100360208200241086a20062005410420054104491b2207101e1a200141046a200520076b22043602002001200620076a2206360200200541034d0d332002280208220a417f4c0d22200a450d20200a100122110d21101c000b200241003a0008200241086a2004200f4100472205101e1a200141046a2208200f20056b22063602002001200420056a220736020020022d00084108744100200f1b2005724181fe03714101470d05200241f8096a20064120200641204922051b22046a41004100412020046b2004411f4b1b10171a200241f8096a20072004101e1a2008200620046b3602002001200720046a36020020050d04200241086a41186a2205200241f8096a41186a2204290300370300200241086a41106a2206200241f8096a41106a2207290300370300200241086a41086a2208200241f8096a41086a2209290300370300200220022903f809370308200720062903003703002009200829030037030020042005290300370300200241d8116a41086a2209200241870a6a280000360200200220022903083703f809200220022900ff093703d81120042d0000211120022800fb09210520022d008b0a211220022d008c0a211d20022f008d0a211620022d008f0a211720022f00910a210620022d00930a210720022d00940a211820022f00950a210a20022d00970a210820022f01f809210420022d00fa092119200241d8096a41086a22152009280200360200200220022903d8113703d809200241b00e6a41086a2015280200360200200220022903d8093703b00e20042019411074722104410121090c060b200241003a0008200241086a2004200f4100472205101e1a200141046a200f20056b22063602002001200420056a2204360200200f450d3120022d00082205450d0a20054101460d0720054102470d31200241f8096a2006412020064120491b22056a41004100412020056b2005411f4b1b10171a200241f8096a20042005101e1a200141046a200620056b3602002001200420056a3602002006411f4d0d18200241086a41186a2204200241f8096a41186a2203290300370300200241086a41106a2205200241f8096a41106a2206290300370300200241086a41086a2207200241f8096a41086a2208290300370300200220022903f809370308200620052903003703002008200729030037030020032004290300370300200241d8116a41086a2205200241870a6a280000360200200220022903083703f809200220022900ff093703d81120032d0000210720022800fb09210420022d008b0a212b20022d008c0a212020022f008d0a211f20022d008f0a211820022f00910a211720022d00930a211920022d00940a210820022f00950a211620022d00970a211d20022f01f809210320022d00fa092106200241d8096a41086a2005280200360200200220022903d8113703d8092003200641107472210520022902dc09210d20022802d809210f4103211c0c0b0b200241003a0008200241086a2004200f4100472205101e1a200141046a200f20056b22063602002001200420056a2205360200200f450d3020022d00082204450d0b20044101460d0720044102470d33410321060c080b200241003a0008200241086a2004200f4100472205101e1a200141046a2207200f20056b22063602002001200420056a220436020020022d00084108744100200f1b2005724181fe03714101470d2f20024200370308200241086a20042006410820064108491b2203101e1a2007200620036b3602002001200420036a36020041072103200641074d0d2f2002290308210d20024198096a41086a200241d8116a41086a29030037030020024198096a41106a200241d8116a41106a29030037030020024198096a41186a200241d8116a41186a29030037030020024198096a41206a200241d8116a41206a29030037030020024198096a41286a200241d8116a41286a29030037030020024198096a41306a200241d8116a41306a29030037030020024198096a41386a200241d8116a41386a2d00003a0000200220022f0198113b01d609200220022903d8113703980920024188096a41086a200241800b6a41086a280200360200200241c8086a41086a200241086a41086a290000370300200241c8086a41106a200241086a41106a290000370300200241c8086a41186a200241086a41186a290000370300200241c8086a41206a200241086a41206a290000370300200241c8086a41286a200241086a41286a290000370300200241c8086a41306a200241086a41306a290000370300200241c8086a41386a200241086a41386a290000370300200220022903800b37038809200220022900083703c808200241c4086a41026a200241f8096a41026a2d00003a0000200241a0086a41186a200241b00e6a41186a290300370300200241a0086a41106a200241b00e6a41106a290300370300200241a0086a41086a200241b00e6a41086a29030037030020024180086a41186a200241d80c6a41186a29030037030020024180086a41106a200241d80c6a41106a29030037030020024180086a41086a200241d80c6a41086a290300370300200220022f00f8093b01c408200220022903b00e3703a008200220022903d80c37038008410321034201210b0c0e0b200241003a0008200241086a2004200f4100472205101e1a200141046a200f20056b22063602002001200420056a2204360200200f450d2e20022d00082205450d0b20054101460d0a20054102470d2e20024100360208200241086a20042006410420064104491b2205101e1a200141046a2208200620056b22073602002001200420056a2205360200200641034d0d2e20022802082104200241003a0008200241086a200520074100472206101e1a2008200720066b3602002001200520066a3602002007450d2e2002310008420183210b410321030c0c0b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090b410221090b200241870a6a200241b00e6a41086a280200360000200220053600fb09200220123a008b0a2002201d3a008c0a200220163b008d0a200220173a008f0a200220113a00900a200220063b00910a200220073a00930a200220183a00940a2002200a3b00950a200220083a00970a200220022903b00e3700ff09200220043b01f809200220044110763a00fa0920094102460d2b200220022f01f8093b01d609200241940a6a2f0100211720022901fe09210b20022901860a210d200228018e0a212b20024198096a41386a200241d8116a41386a2d00003a000020024198096a41306a200241d8116a41306a29010037030020024198096a41286a200241d8116a41286a29010037030020024198096a41206a200241d8116a41206a29010037030020024198096a41186a200241d8116a41186a29010037030020024198096a41106a200241d8116a41106a29010037030020024198096a41086a200241d8116a41086a29010037030020024188096a41086a200241800b6a41086a280100360200200220022901d81137039809200220022901800b37038809200241c8086a41386a200241086a41386a290000370300200241c8086a41306a200241086a41306a290000370300200241c8086a41286a200241086a41286a290000370300200241c8086a41206a200241086a41206a290000370300200241c8086a41186a200241086a41186a290000370300200241c8086a41106a200241086a41106a290000370300200241c8086a41086a200241086a41086a290000370300200241c4086a41026a200241f8096a41026a2d00003a0000200220022900083703c808200220022f00f8093b01c408200241a0086a41186a200241b00e6a41186a290100370300200241a0086a41106a200241b00e6a41106a290100370300200241a0086a41086a200241b00e6a41086a29010037030020024180086a41186a200241d80c6a41186a29010037030020024180086a41106a200241d80c6a41106a29010037030020024180086a41086a200241d80c6a41086a290100370300200220022901b00e3703a008200220022901d80c37038008202b411076211f202b41087621202004418080fc0771411076211c20064180fe03714108762118200a4180fe03714108762119410121030c2e0b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090c260b200241f8096a2006412020064120491b22056a41004100412020056b2005411f4b1b10171a200241f8096a20042005101e1a200141046a220a200620056b22093602002001200420056a22053602002006411f4d0d0f200241086a41186a2206200241f8096a41186a2204290300370300200241086a41106a2207200241f8096a41106a2208290300370300200241086a41086a2211200241f8096a41086a2212290300370300200220022903f809370308200820072903003703002012201129030037030020042006290300370300200241d8116a41086a2206200241870a6a280000360200200220022903083703f809200220022900ff093703d81120042d0000210720022800fb09210420022d008b0a212b20022d008c0a212020022f008d0a211f20022d008f0a211820022f00910a211720022d00930a211920022d00940a210820022f00950a211620022d00970a211d20022f01f809211120022d00fa092112200241d8096a41086a2006280200360200200220022903d8113703d809200241003a0008200241086a200520094100472206101e1a200a200920066b3602002001200520066a3602002009450d292011201241107472210520022d0008410171211e20022902dc09210d20022802d809210f4102211c0c030b410221060b0c220b4101211c200110212204450d290b20024198096a41086a200241d8116a41086a29030037030020024198096a41106a200241d8116a41106a29030037030020024198096a41186a200241d8116a41186a29030037030020024198096a41206a200241d8116a41206a29030037030020024198096a41286a200241d8116a41286a29030037030020024198096a41306a200241d8116a41306a29030037030020024198096a41386a200241d8116a41386a2d00003a0000200220022f0198113b01d609200220022903d8113703980920024188096a41086a200241800b6a41086a280200360200200241c8086a41086a200241086a41086a290000370300200241c8086a41106a200241086a41106a290000370300200241c8086a41186a200241086a41186a290000370300200241c8086a41206a200241086a41206a290000370300200241c8086a41286a200241086a41286a290000370300200241c8086a41306a200241086a41306a290000370300200241c8086a41386a200241086a41386a290000370300200220022903800b37038809200220022900083703c808200241c4086a41026a200241f8096a41026a2d00003a0000200241a0086a41186a200241b00e6a41186a290300370300200241a0086a41106a200241b00e6a41106a290300370300200241a0086a41086a200241b00e6a41086a29030037030020024180086a41186a200241d80c6a41186a29030037030020024180086a41106a200241d80c6a41106a29030037030020024180086a41086a200241d80c6a41086a290300370300200220022f00f8093b01c408200220022903b00e3703a008200220022903d80c37038008200fad4220862004ad84210b410621030c270b200241f8096a2006412020064120491b22046a41004100412020046b2004411f4b1b10171a200241f8096a20052004101e1a200141046a2212200620046b22093602002001200520046a22113602002006411f4d0d0c200241086a41186a2204200241f8096a41186a2203290300370300200241086a41106a2205200241f8096a41106a2206290300370300200241086a41086a2207200241f8096a41086a2208290300370300200220022903f809370308200620052903003703002008200729030037030020032004290300370300200241d8116a41086a2206200241870a6a280000360200200220022903083703f809200220022900ff093703d81120032d0000210820022800fb09210520022d008b0a211820022d008c0a210720022f008d0a211720022d008f0a211920022f00910a211620022d00930a211d20022d00940a211e20022f00950a210a20022d00970a210420022f01f809211520022d00fa09211a200241d8096a41086a2006280200360200200220022903d8113703d80920024200370308200241086a20112009410820094108491b2203101e1a2012200920036b3602002001201120036a36020041072103200941074d0d242015201a4110747221092002290308210c20022802e009212b20022903d809210d410121060c1f0b20024100360208200241086a20042006410420064104491b2205101e1a200141046a200620056b3602002001200420056a360200200641034d0d2320022802082104410221034200210b0c010b200110212204450d22200220043602d8104200210b20024200370308200241086a20012802002206200141046a22072802002205410820054108491b2203101e1a2007200520036b3602002001200620036a36020041072103200541074d0d0d2002290308210d410121030b20024198096a41086a200241d8116a41086a29030037030020024198096a41106a200241d8116a41106a29030037030020024198096a41186a200241d8116a41186a29030037030020024198096a41206a200241d8116a41206a29030037030020024198096a41286a200241d8116a41286a29030037030020024198096a41306a200241d8116a41306a29030037030020024198096a41386a200241d8116a41386a2d00003a0000200220022f0198113b01d609200220022903d8113703980920024188096a41086a200241800b6a41086a280200360200200241c8086a41086a200241086a41086a290000370300200241c8086a41106a200241086a41106a290000370300200241c8086a41186a200241086a41186a290000370300200241c8086a41206a200241086a41206a290000370300200241c8086a41286a200241086a41286a290000370300200241c8086a41306a200241086a41306a290000370300200241c8086a41386a200241086a41386a290000370300200220022903800b37038809200220022900083703c808200241c4086a41026a200241f8096a41026a2d00003a0000200241a0086a41186a200241b00e6a41186a290300370300200241a0086a41106a200241b00e6a41106a290300370300200241a0086a41086a200241b00e6a41086a29030037030020024180086a41186a200241d80c6a41186a29030037030020024180086a41106a200241d80c6a41106a29030037030020024180086a41086a200241d80c6a41086a290300370300200220022f00f8093b01c408200220022903b00e3703a008200220022903d80c37038008200b2004ad42188684420886200341ff0171ad84210b410421030b4100211f410021200c210b200241f8096a2005412020054120491b22046a41004100412020046b2004411f4b1b10171a200241f8096a20062004101e1a200141046a2212200520046b22093602002001200620046a22043602002005411f4d0d09200241086a41186a2205200241f8096a41186a2203290300370300200241086a41106a2206200241f8096a41106a2207290300370300200241086a41086a2208200241f8096a41086a220a290300370300200220022903f80937030820072006290300370300200a200829030037030020032005290300370300200241d8116a41086a2206200241870a6a280000360200200220022903083703f809200220022900ff093703d81120032d0000210820022800fb09210520022d008b0a211820022d008c0a210720022f008d0a211720022d008f0a211920022f00910a211620022d00930a211d20022d00940a211e20022f00950a210a20022d00970a211120022f01f809211520022d00fa09211a200241d8096a41086a2006280200360200200220022903d8113703d80920024200370308200241086a20042009410820094108491b2203101e1a2012200920036b22063602002001200420036a2203360200200941074d0d002002290308210c20024100360208200241086a20032006410420064104491b2204101e1a200141046a200620046b3602002001200320046a360200200641034d0d002015201a4110747221032002280208211220022802e009212b20022903d809210d410521040c190b410721030c1e0b20024100360208200241086a20062005410420054104491b2204101e1a200141046a200520046b3602002001200620046a36020041032104200541034d0d1d0c010b2002410036020841042104200241086a20062005410420054104491b2207101e1a200141046a200520076b3602002001200620076a360200200541034d0d1c0b200228020821050c150b20024100360208200241086a20062005410420054104491b2204101e1a200141046a2208200520046b22073602002001200620046a2206360200200541034d0d1a20022802082112200241f8096a2007412020074120491b22046a41004100412020046b2004411f4b1b10171a200241f8096a20062004101e1a2008200720046b22093602002001200620046a22043602002007411f4d0d06200241086a41186a2206200241f8096a41186a2205290300370300200241086a41106a2207200241f8096a41106a2208290300370300200241086a41086a220a200241f8096a41086a2211290300370300200220022903f809370308200820072903003703002011200a29030037030020052006290300370300200241d8116a41086a2206200241870a6a280000360200200220022903083703f809200220022900ff093703d81120052d0000210820022800fb09210520022d008b0a211820022d008c0a210720022f008d0a211720022d008f0a211920022f00910a211620022d00930a211d20022d00940a211e20022f00950a210a20022d00970a211120022f01f809212420022d00fa092125200241d8096a41086a2006280200360200200220022903d8113703d80920024100360208200241086a20042009410420094104491b2206101e1a200141046a221a200920066b22153602002001200420066a2204360200200941034d0d1a2002350208210b20024100360208200241086a20042015410420154104491b2206101e1a201a201520066b3602002001200420066a360200201541034d0d1a202420254110747221032002350208422086200b84210c20022802e009212b20022903d809210d410221040c140b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090c190b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090c180b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090c170b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090c120b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090c150b200241d8106a10220c140b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090c130b410121110b2002200a36020c20022011360208200241003602100240200a450d00200141046a211d200241106a211241002105410021080340200241003a00d811200241d8116a200620044100472207101e1a201d200420076b22093602002001200620076a2206360200024002402004450d00200841016a210820022d00d81141017121042005200228020c470d01200241086a102320122802002105200228020821110c010b200228020c450d14201110020c140b201120056a20043a00002012200541016a2205360200200921042008200a490d000b200228020821110b2011450d112011410020111b2105200229020c210d20024100360208200241086a20012802002207200141046a22082802002204410420044104491b2206101e1a2008200420066b3602002001200720066a3602000240200441034d0d002002280208212b410121040c0c0b200da7450d11200510020c110b1024000b200241f8096a41386a200241086a41386a290000370300200241f8096a41306a200241086a41306a290000370300200241f8096a41286a200241086a41286a290000370300200241f8096a41206a200241086a41206a290000370300202e202d2900003703002030202f29000037030020322031290000370300200220022900083703f8090c0b0b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090c0a0b200241f8096a41386a200241086a41386a290000370300200241f8096a41306a200241086a41306a290000370300200241f8096a41286a200241086a41286a290000370300200241f8096a41206a200241086a41206a2900003703002007201629000037030020182017290000370300201a2019290000370300200220022900083703f8090c090b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090c080b20024100360208200241086a20042006410420064104491b2205101e1a200141046a2208200620056b22073602002001200420056a2205360200200641034d0d0720022802082115200241f8096a2007412020074120491b22046a41004100412020046b2004411f4b1b10171a200241f8096a20052004101e1a2008200720046b22063602002001200520046a22253602002007411f4d0d01200241086a41186a221b200241f8096a41186a221a290300370300200241086a41106a2223200241f8096a41106a2224290300370300200241086a41086a2226200241f8096a41086a2227290300370300200220022903f80937030820242023290300370300201a201b29030037030020272026290300370300200220022903083703f80920242d00002108201a2d0000210520022800fb09211c20022800ff09212b20022d00830a211820022d00840a210720022f00850a211720022d00870a211920022f00890a211620022d008b0a211d20022d008c0a211e20022f008d0a210a20022d008f0a211120022f00910a210f20022d00930a211220022d00940a211f20022f00950a212020022d00970a211020022f01f809212a20022d00fa092133200241f8096a200641c000200641c0004922281b22046a4100410041c00020046b2004413f4b1b10171a200241f8096a20252004101e1a200141046a2229200620046b22063602002001202520046a222536020020280d02200241086a41386a2204200241f8096a41386a2228290300370300200241086a41306a222e200241f8096a41306a2221290300370300200241086a41286a2222200241f8096a41286a222c290300370300200241086a41206a222d200241f8096a41206a222f290300370300201b201a2903003703002023202429030037030020262027290300370300200220022903f8093703082024202329030037030020272026290300370300201a201b290300370300202f202d290300370300202c20222903003703002021202e2903003703002028200429030037030020024198116a41086a2204200241870a6a29000037030020024198116a41106a221a2002418f0a6a29000037030020024198116a41186a2224200241f8096a411f6a29000037030020024198116a41206a221b2002419f0a6a29000037030020024198116a41286a2223200241a70a6a29000037030020024198116a41306a2226200241af0a6a29000037030020024198116a41386a2227200241f8096a413f6a2d00003a0000200220022903083703f809200220022900ff093703981120023502f809210c20023201fc09211320023100fe092114200241d8106a41386a20272d00003a0000200241d8106a41306a2026290300370300200241d8106a41286a2023290300370300200241d8106a41206a201b290300370300200241d8106a41186a2024290300370300200241d8106a41106a201a290300370300200241d8106a41086a200429030037030020022002290398113703d810200241f8096a2006412020064120491b22046a41004100412020046b2004411f4b1b10171a200241f8096a20252004101e1a2029200620046b221a3602002001202520046a22243602002006411f4d0d03200241086a41186a2225200241f8096a41186a222e290300370300200241086a41106a221b200241f8096a41106a2221290300370300200241086a41086a2223200241f8096a41086a2222290300370300200220022903f809370308202e2025290300223a3703002021201b290300223b37030020222023290300223c370300200241b8126a41086a2204203c370300200241b8126a41106a2206203b370300200241b8126a41186a2226203a37030020022002290308223a3703b8122002203a3703f809200241d8096a41186a2026290300370300200241d8096a41106a2006290300370300200241d8096a41086a2004290300370300200220022903b8123703d80941002104200241f8096a201a41c000201a41c000491b22066a4100410041c00020066b2006413f4b1b10171a200241f8096a20242006101e1a200141046a201a20066b3602002001202420066a360200201a413f4d0d04202a2033411074722137200c201320144210868442208684210c200241086a41386a2206200241f8096a41386a222c290300370300200241086a41306a221a200241f8096a41306a222d290300370300200241086a41286a2224200241f8096a41286a222f290300370300200241086a41206a2226200241f8096a41206a22302903003703002025202e290300370300201b202129030037030020232022290300370300200220022903f809370308202c20062903002213370300202d201a2903002214370300202f2024290300223a37030020302026290300223b370300202e2025290300223c3703002021201b290300223d37030020222023290300223e370300200241d8116a41086a2227203e370300200241d8116a41106a2228203d370300200241d8116a41186a2229203c370300200241d8116a41206a222a203b370300200241d8116a41286a2233203a370300200241d8116a41306a22312014370300200241d8116a41386a223220133703002002200229030822133703d811200220133703f809200241e0126a41086a200241e7096a28000036020020232027290300370300201b2028290300370300202520292903003703002026202a29030037030020242033290300370300201a203129030037030020062032290300370300200220022900df093703e012200220022903d81137030820022800db09211a20022d00eb09212420022d00ec09212520022f00ed09211b20022d00ef09212320022d00f009212620022f00f109212720022d00f309212820022d00f409212920022f00f509212a20022d00f709213320022f01d809210620022d00da092131202c200241d8106a41386a2d00003a0000202d200241d8106a41306a290300370300202f200241d8106a41286a2903003703002030200241d8106a41206a290300370300202e200241d8106a41186a2903003703002021200241d8106a41106a2903003703002022200241d8106a41086a290300370300200220022903d8103703f809200620314110747221060b20024198116a41386a200241f8096a41386a2d00003a000020024198116a41306a200241f8096a41306a29030037030020024198116a41286a200241f8096a41286a29030037030020024198116a41206a200241f8096a41206a29030037030020024198116a41186a200241f8096a41186a29030037030020024198116a41106a200241f8096a41106a29030037030020024198116a41086a200241f8096a41086a29030037030020024188106a41086a200241e0126a41086a280200360200200220022903f80937039811200220022903e01237038810200241d8116a41386a200241086a41386a290300370300200241d8116a41306a200241086a41306a290300370300200241d8116a41286a200241086a41286a290300370300200241d8116a41206a200241086a41206a290300370300200241d8116a41186a200241086a41186a290300370300200241d8116a41106a200241086a41106a290300370300200241d8116a41086a200241086a41086a29030037030020024184106a41026a200241d8106a41026a2d00003a0000200220022903083703d811200220022f00d8103b018410200241e00f6a41186a20024198106a41186a290300370300200241e00f6a41106a20024198106a41106a290300370300200241e00f6a41086a20024198106a41086a29030037030020022002290398103703e00f200241c00f6a41186a200241b8106a41186a290300370300200241c00f6a41106a200241b8106a41106a290300370300200241c00f6a41086a200241b8106a41086a290300370300200220022903b8103703c00f0c070b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090c050b200241f8096a41386a200241086a41386a290000370300200241f8096a41306a200241086a41306a290000370300200241f8096a41286a200241086a41286a290000370300200241f8096a41206a200241086a41206a290000370300201a201b2900003703002024202329000037030020272026290000370300200220022900083703f8090c040b200241f8096a41186a200241086a41186a290000370300200241f8096a41106a200241086a41106a290000370300200241f8096a41086a200241086a41086a290000370300200220022900083703f8090c030b200241f8096a41386a200241086a41386a290000370300200241f8096a41306a200241086a41306a290000370300200241f8096a41286a200241086a41286a290000370300200241f8096a41206a200241086a41206a290000370300202e20252900003703002021201b29000037030020222023290000370300200220022900083703f8090c020b20024198096a41086a200241d8116a41086a29030037030020024198096a41106a200241d8116a41106a29030037030020024198096a41186a200241d8116a41186a29030037030020024198096a41206a200241d8116a41206a29030037030020024198096a41286a200241d8116a41286a29030037030020024198096a41306a200241d8116a41306a29030037030020024198096a41386a200241d8116a41386a2d00003a0000200220022f0198113b01d609200220022903d8113703980920024188096a41086a200241800b6a41086a280200360200200241c8086a41086a200241086a41086a290000370300200241c8086a41106a200241086a41106a290000370300200241c8086a41186a200241086a41186a290000370300200241c8086a41206a200241086a41206a290000370300200241c8086a41286a200241086a41286a290000370300200241c8086a41306a200241086a41306a290000370300200241c8086a41386a200241086a41386a290000370300200220022903800b37038809200220022900083703c808200241c4086a41026a200241f8096a41026a2d00003a0000200241a0086a41186a200241b00e6a41186a290300370300200241a0086a41106a200241b00e6a41106a290300370300200241a0086a41086a200241b00e6a41086a29030037030020024180086a41186a200241d80c6a41186a29030037030020024180086a41106a200241d80c6a41106a29030037030020024180086a41086a200241d80c6a41086a290300370300200220022f00f8093b01c408200220022903b00e3703a008200220022903d80c370380082005ad421886200341ffffff0771ad84420886200441ff0171ad84210b202b411076211f202b4108762120410521030c060b20024198096a41086a200241d8116a41086a29030037030020024198096a41106a200241d8116a41106a29030037030020024198096a41186a200241d8116a41186a29030037030020024198096a41206a200241d8116a41206a29030037030020024198096a41286a200241d8116a41286a29030037030020024198096a41306a200241d8116a41306a29030037030020024198096a41386a200241d8116a41386a2d00003a0000200220022f0198113b01d609200220022903d8113703980920024188096a41086a200241800b6a41086a280200360200200241c8086a41086a200241086a41086a290000370300200241c8086a41106a200241086a41106a290000370300200241c8086a41186a200241086a41186a290000370300200241c8086a41206a200241086a41206a290000370300200241c8086a41286a200241086a41286a290000370300200241c8086a41306a200241086a41306a290000370300200241c8086a41386a200241086a41386a290000370300200220022903800b37038809200220022900083703c80841022103200241c4086a41026a200241f8096a41026a2d00003a0000200241a0086a41186a200241b00e6a41186a290300370300200241a0086a41106a200241b00e6a41106a290300370300200241a0086a41086a200241b00e6a41086a29030037030020024180086a41186a200241d80c6a41186a29030037030020024180086a41106a200241d80c6a41106a29030037030020024180086a41086a200241d80c6a41086a290300370300200220022f00f8093b01c408200220022903b00e3703a008200220022903d80c370380082005ad421886200941ffffff0771ad84420886200641ff0171ad84210b202b411076211f202b4108762120200441ff017121110c050b410221040b200241f8096a41386a222e20024198116a41386a2d00003a0000200241f8096a41306a222120024198116a41306a290300370300200241f8096a41286a222220024198116a41286a290300370300200241f8096a41206a222c20024198116a41206a290300370300200241f8096a41186a222d20024198116a41186a290300370300200241f8096a41106a222f20024198116a41106a290300370300200241f8096a41086a223020024198116a41086a290300370300200241e0126a41086a223120024188106a41086a28020036020020022002290398113703f80920022002290388103703e012200241086a41386a2232200241d8116a41386a290300370300200241086a41306a2234200241d8116a41306a290300370300200241086a41286a2235200241d8116a41286a290300370300200241086a41206a2236200241d8116a41206a290300370300200241086a41186a2238200241d8116a41186a290300370300200241086a41106a2239200241d8116a41106a290300370300200241086a41086a223f200241d8116a41086a290300370300200241dc126a41026a20024184106a41026a2d00003a0000200220022903d811370308200220022f0184103b01dc12200241b8126a41186a2240200241e00f6a41186a290300370300200241b8126a41106a2241200241e00f6a41106a290300370300200241b8126a41086a2242200241e00f6a41086a29030037030020024198126a41186a2243200241c00f6a41186a29030037030020024198126a41106a2244200241c00f6a41106a29030037030020024198126a41086a2245200241c00f6a41086a290300370300200220022903e00f3703b812200220022903c00f370398120240024020044102470d004102210441024102470d010c020b200241800f6a41386a202e2d00003a0000200241800f6a41306a2021290300370300200241800f6a41286a2022290300370300200241800f6a41206a202c290300370300200241800f6a41186a202d290300370300200241800f6a41106a202f290300370300200241800f6a41086a2030290300370300200241f00e6a41086a2031280200360200200220022903f8093703800f200220022903e0123703f00e200241b00e6a41386a2032290300370300200241b00e6a41306a2034290300370300200241b00e6a41286a2035290300370300200241b00e6a41206a2036290300370300200241b00e6a41186a2038290300370300200241b00e6a41106a2039290300370300200241b00e6a41086a203f290300370300200241ac0e6a41026a200241dc126a41026a2d00003a0000200220022903083703b00e200220022f01dc123b01ac0e200241880e6a41186a2040290300370300200241880e6a41106a2041290300370300200241880e6a41086a2042290300370300200220022903b8123703880e200241e80d6a41186a2043290300370300200241e80d6a41106a2044290300370300200241e80d6a41086a204529030037030020022002290398123703e80d200c420886201041ff0171ad84210c2020411074201f41ff017141087472201241ff0171722112200f411074200541ff017141087472201141ff017172211120044102460d010b20024198116a41386a200241800f6a41386a2d00003a000020024198116a41306a200241800f6a41306a29030037030020024198116a41286a200241800f6a41286a29030037030020024198116a41206a200241800f6a41206a29030037030020024198116a41186a200241800f6a41186a29030037030020024198116a41106a200241800f6a41106a29030037030020024198116a41086a200241800f6a41086a29030037030020024188106a41086a200241f00e6a41086a280200360200200220022903800f37039811200220022903f00e37038810200241d8116a41386a200241b00e6a41386a290300370300200241d8116a41306a200241b00e6a41306a290300370300200241d8116a41286a200241b00e6a41286a290300370300200241d8116a41206a200241b00e6a41206a290300370300200241d8116a41186a200241b00e6a41186a290300370300200241d8116a41106a200241b00e6a41106a290300370300200241d8116a41086a200241b00e6a41086a29030037030020024184106a41026a200241ac0e6a41026a2d00003a0000200220022903b00e3703d811200220022f01ac0e3b018410200241e00f6a41186a200241880e6a41186a290300370300200241e00f6a41106a200241880e6a41106a290300370300200241e00f6a41086a200241880e6a41086a290300370300200220022903880e3703e00f200241c00f6a41186a200241e80d6a41186a290300370300200241c00f6a41106a200241e80d6a41106a290300370300200241c00f6a41086a200241e80d6a41086a290300370300200220022903e80d3703c00f201cad421886203741ffffff0771ad84420886210d0c010b410321040b200241f8096a41386a220520024198116a41386a2d00003a0000200241f8096a41306a221c20024198116a41306a290300370300200241f8096a41286a220f20024198116a41286a290300370300200241f8096a41206a221f20024198116a41206a290300370300200241f8096a41186a222020024198116a41186a290300370300200241f8096a41106a221020024198116a41106a290300370300200241f8096a41086a20024198116a41086a290300370300200241e0126a41086a20024188106a41086a28020036020020022002290398113703f80920022002290388103703e012200241086a41386a222e200241d8116a41386a290300370300200241086a41306a2221200241d8116a41306a290300370300200241086a41286a2222200241d8116a41286a290300370300200241086a41206a222c200241d8116a41206a290300370300200241086a41186a222d200241d8116a41186a290300370300200241086a41106a222f200241d8116a41106a290300370300200241086a41086a200241d8116a41086a290300370300200241dc126a41026a223020024184106a41026a2d00003a0000200220022903d811370308200220022f0184103b01dc12200241b8126a41186a2231200241e00f6a41186a290300370300200241b8126a41106a2232200241e00f6a41106a290300370300200241b8126a41086a200241e00f6a41086a29030037030020024198126a41186a2234200241c00f6a41186a29030037030020024198126a41106a2235200241c00f6a41106a29030037030020024198126a41086a200241c00f6a41086a290300370300200220022903e00f3703b812200220022903c00f37039812024020044103460d00200241a80d6a41386a20052d00003a0000200241a80d6a41306a201c290300370300200241a80d6a41286a200f290300370300200241a80d6a41206a201f290300370300200241a80d6a41186a2020290300370300200241a80d6a41106a2010290300370300200241a80d6a41086a200241f8096a41086a290300370300200241980d6a41086a200241e0126a41086a280200360200200220022903f8093703a80d200220022903e0123703980d200241d80c6a41386a202e290300370300200241d80c6a41306a2021290300370300200241d80c6a41286a2022290300370300200241d80c6a41206a202c290300370300200241d80c6a41186a202d290300370300200241d80c6a41106a202f290300370300200241d80c6a41086a200241086a41086a290300370300200241d40c6a41026a20302d00003a0000200220022903083703d80c200220022f01dc123b01d40c200241b00c6a41186a2031290300370300200241b00c6a41106a2032290300370300200241b00c6a41086a200241b8126a41086a290300370300200220022903b8123703b00c200241900c6a41186a2034290300370300200241900c6a41106a2035290300370300200241900c6a41086a20024198126a41086a29030037030020022002290398123703900c200421090b20094103460d0020024198096a41086a200241a80d6a41086a29030037030020024198096a41106a200241a80d6a41106a29030037030020024198096a41186a200241a80d6a41186a29030037030020024198096a41206a200241a80d6a41206a29030037030020024198096a41286a200241a80d6a41286a29030037030020024198096a41306a200241a80d6a41306a29030037030020024198096a41386a200241a80d6a41386a2d00003a0000200220022f018e0c3b01d609200220022903a80d3703980920024188096a41086a200241980d6a41086a280200360200200241c8086a41086a200241d80c6a41086a290300370300200241c8086a41106a200241d80c6a41106a290300370300200241c8086a41186a200241d80c6a41186a290300370300200241c8086a41206a200241d80c6a41206a290300370300200241c8086a41286a200241d80c6a41286a290300370300200241c8086a41306a200241d80c6a41306a290300370300200241c8086a41386a200241d80c6a41386a290300370300200220022903980d37038809200220022903d80c3703c808200241c4086a41026a200241d40c6a41026a2d00003a0000200241a0086a41186a200241b00c6a41186a290300370300200241a0086a41106a200241b00c6a41106a290300370300200241a0086a41086a200241b00c6a41086a29030037030020024180086a41186a200241900c6a41186a29030037030020024180086a41106a200241900c6a41106a29030037030020024180086a41086a200241900c6a41086a290300370300200220022f01d40c3b01c408200220022903b00c3703a008200220022903900c37038008202b411076211f202b4108762120200d200941ff0171ad84210d410021030c010b0c020b0b0b200241d00b6a41086a220f20024198096a41086a290300370300200241d00b6a41106a221020024198096a41106a290300370300200241d00b6a41186a222e20024198096a41186a290300370300200241d00b6a41206a222120024198096a41206a290300370300200241d00b6a41286a222220024198096a41286a290300370300200241d00b6a41306a222c20024198096a41306a290300370300200241d00b6a41386a222d20024198096a41386a2d00003a0000200220022f01d6093b018e0c20022002290398093703d00b200241c00b6a41086a222f20024188096a41086a280200360200200241800b6a41086a2230200241c8086a41086a290300370300200241800b6a41106a2231200241c8086a41106a290300370300200241800b6a41186a2232200241c8086a41186a290300370300200241800b6a41206a2234200241c8086a41206a290300370300200241800b6a41286a2235200241c8086a41286a290300370300200241800b6a41306a2236200241c8086a41306a290300370300200241800b6a41386a2238200241c8086a41386a29030037030020022002290388093703c00b200220022903c8083703800b200241fc0a6a41026a2239200241c4086a41026a2d00003a0000200241d80a6a41186a223f200241a0086a41186a290300370300200241d80a6a41106a2240200241a0086a41106a290300370300200241d80a6a41086a2241200241a0086a41086a290300370300200241b80a6a41186a224220024180086a41186a290300370300200241b80a6a41106a224320024180086a41106a290300370300200241b80a6a41086a224420024180086a41086a290300370300200220022f01c4083b01fc0a200220022903a0083703d80a20022002290380083703b80a4107210420034107460d00200241d80c6a41086a200f290300370300200241d80c6a41106a2010290300370300200241d80c6a41186a202e290300370300200241d80c6a41206a2021290300370300200241d80c6a41286a2022290300370300200241d80c6a41306a202c290300370300200241d80c6a41386a202d2d00003a0000200220022f018e0c3b01c00f200220022903d00b3703d80c200241b8126a41086a202f280200360200200241d8116a41086a2030290300370300200241d8116a41106a2031290300370300200241d8116a41186a2032290300370300200241d8116a41206a2034290300370300200241d8116a41286a2035290300370300200241d8116a41306a2036290300370300200241d8116a41386a2038290300370300200220022903c00b3703b812200220022903800b3703d81120024198126a41026a20392d00003a000020024198116a41186a203f29030037030020024198116a41106a204029030037030020024198116a41086a2041290300370300200241800f6a41186a2042290300370300200241800f6a41106a2043290300370300200241800f6a41086a2044290300370300200220022f01fc0a3b019812200220022903d80a37039811200220022903b80a3703800f200241a80d6a41186a200241c0076a41186a290300370300200241a80d6a41106a200241c0076a41106a290300370300200241a80d6a41086a200241c0076a41086a290300370300200220022903c0073703a80d201f411074202041ff017141087472202b41ff017172210f200321040c010b0b200241b00e6a41086a222b200241d80c6a41086a290300370300200241b00e6a41106a221f200241d80c6a41106a290300370300200241b00e6a41186a2220200241d80c6a41186a290300370300200241b00e6a41206a2210200241d80c6a41206a290300370300200241b00e6a41286a222e200241d80c6a41286a290300370300200241b00e6a41306a2221200241d80c6a41306a290300370300200241b00e6a41386a2222200241d80c6a41386a2d00003a0000200220022f01c00f3b01e00f200220022903d80c3703b00e200241d00b6a41086a222c200241b8126a41086a280200360200200241086a41086a222d200241d8116a41086a290300370300200241086a41106a222f200241d8116a41106a290300370300200241086a41186a2230200241d8116a41186a290300370300200241086a41206a2231200241d8116a41206a290300370300200241086a41286a2232200241d8116a41286a290300370300200241086a41306a2234200241d8116a41306a290300370300200241086a41386a2235200241d8116a41386a290300370300200220022903b8123703d00b200220022903d81137030820024198096a41026a223620024198126a41026a2d00003a0000200241800b6a41186a223820024198116a41186a290300370300200241800b6a41106a223920024198116a41106a290300370300200241800b6a41086a223f20024198116a41086a290300370300200241f8096a41186a2240200241800f6a41186a290300370300200241f8096a41106a2241200241800f6a41106a290300370300200241f8096a41086a2242200241800f6a41086a290300370300200220022f0198123b01980920022002290398113703800b200220022903800f3703f809200241c8086a41186a2243200241a80d6a41186a290300370300200241c8086a41106a2244200241a80d6a41106a290300370300200241c8086a41086a2245200241a80d6a41086a290300370300200220022903a80d3703c80841072103024020044107460d0020024180076a41086a202b29030037030020024180076a41106a201f29030037030020024180076a41186a202029030037030020024180076a41206a201029030037030020024180076a41286a202e29030037030020024180076a41306a202129030037030020024180076a41386a20222d00003a0000200220022f01e00f3b01be07200220022903b00e37038007200241f0066a41086a202c280200360200200241b0066a41086a202d290300370300200241b0066a41106a202f290300370300200241b0066a41186a2030290300370300200241b0066a41206a2031290300370300200241b0066a41286a2032290300370300200241b0066a41306a2034290300370300200241b0066a41386a2035290300370300200220022903d00b3703f006200220022903083703b006200241ac066a41026a20362d00003a000020024188066a41186a203829030037030020024188066a41106a203929030037030020024188066a41086a203f290300370300200241e8056a41186a2040290300370300200241e8056a41106a2041290300370300200241e8056a41086a2042290300370300200220022f0198093b01ac06200220022903800b37038806200220022903f8093703e805200241c8056a41186a2043290300370300200241c8056a41106a2044290300370300200241c8056a41086a2045290300370300200220022903c8083703c805200421030b024020034107470d00200041073a0008200241f0126a24000f0b20024197036a20054110763a000020024195036a20053b000020024191036a20093a000020024192036a20022f01be073b010020024194036a201c3a000020024188036a41106a2209200b37030020024188036a41186a200d37030020024188036a41206a200f360200200241ac036a20183a0000200241ad036a20073a0000200241ae036a20173b010020024188036a41286a20193a0000200241b1036a20083a0000200241b2036a20163b0100200241b4036a201d3a0000200241b5036a201e3a0000200241b6036a200a3b0100200220033a0090032002200e37038803200241bc036a201236020020024188036a41306a201136020020024188036a41386a200c37030020024188036a41c0006a200229038007370300200241d0036a20024180076a41086a290300370300200241d8036a20024180076a41106a290300370300200241e0036a20024180076a41186a290300370300200241e8036a20024180076a41206a290300370300200241f0036a20024180076a41286a290300370300200241f8036a20024180076a41306a29030037030020024180046a20024180076a41386a2d00003a000020024183046a20064110763a000020024181046a20063b000020024184046a201a36020020024194046a20243a000020024195046a20253a000020024196046a201b3b010020024198046a20233a000020024199046a20263a00002002419a046a20273b01002002419c046a20283a00002002419d046a20293a00002002419e046a202a3b0100200241a0046a20333a000020024190046a200241f0066a41086a28020036020020024188046a20022903f006370300200241d9046a200241b0066a41386a290300370000200241d1046a200241b0066a41306a290300370000200241c9046a200241b0066a41286a290300370000200241c1046a200241b0066a41206a290300370000200241b9046a200241b0066a41186a290300370000200241b1046a200241b0066a41106a290300370000200241a9046a200241b0066a41086a290300370000200241a1046a20022903b006370000200241e3046a200241ae066a2d00003a0000200241e1046a20022f01ac063b0000200241e4046a201536020020024180056a20024188066a41186a290300370300200241f8046a20024188066a41106a290300370300200241f0046a20024188066a41086a290300370300200241e8046a200229038806370300200241a0056a200241e8056a41186a29030037030020024198056a200241e8056a41106a29030037030020024190056a200241e8056a41086a29030037030020024188056a20022903e805370300200241c0056a200241c8056a41186a290300370300200241b8056a200241c8056a41106a290300370300200241b0056a200241c8056a41086a290300370300200220022903c8053703a80520012802002105200241f8096a200141046a2206280200220441c000200441c000491b22036a4100410041c00020036b2003413f4b1b10171a200241f8096a20052003101e1a2006200420036b3602002001200520036a36020002402004413f4d0d00200241086a41386a2209200241f8096a41386a2201290300370300200241086a41306a220a200241f8096a41306a2203290300370300200241086a41286a2211200241f8096a41286a2204290300370300200241086a41206a2212200241f8096a41206a2205290300370300200241086a41186a221d200241f8096a41186a2206290300370300200241086a41106a2216200241f8096a41106a2207290300370300200241086a41086a2217200241f8096a41086a2208290300370300200220022903f80937030820012009290300220b3703002003200a290300220c37030020042011290300220d37030020052012290300220e3703002006201d290300221337030020072016290300221437030020082017290300223a370300200241d8116a41086a2209203a370300200241d8116a41106a220a2014370300200241d8116a41186a22112013370300200241d8116a41206a2212200e370300200241d8116a41286a221d200d370300200241d8116a41306a2216200c370300200241d8116a41386a2217200b37030020022002290308220b3703d8112002200b3703f809200241b00e6a41386a22182017290300370300200241b00e6a41306a22172016290300370300200241b00e6a41286a2216201d290300370300200241b00e6a41206a221d2012290300370300200241b00e6a41186a22122011290300370300200241b00e6a41106a2211200a290300370300200241b00e6a41086a220a2009290300370300200220022903d8113703b00e20012018290300220b37030020032017290300220c37030020042016290300220d3703002005201d290300220e3703002006201229030022133703002007201129030022143703002008200a290300223a370300200241d80c6a41086a2201203a370300200241d80c6a41106a22032014370300200241d80c6a41186a22042013370300200241d80c6a41206a2205200e370300200241d80c6a41286a2206200d370300200241d80c6a41306a2207200c370300200241d80c6a41386a2208200b370300200220022903b00e220b3703d80c2002200b3703f809200241086a20024188036a41c002101e1a20024180036a2008290300370300200241f8026a2007290300370300200241f0026a2006290300370300200241e8026a2005290300370300200241e0026a2004290300370300200241d8026a2003290300370300200241d0026a2001290300370300200220022903d80c3703c8022000200241086a418003101e1a200241f0126a24000f0b200241f8096a41386a2201200241086a41386a290000370300200241f8096a41306a2203200241086a41306a290000370300200241f8096a41286a2204200241086a41286a290000370300200241f8096a41206a2205200241086a41206a290000370300200241f8096a41186a2206200241086a41186a290000370300200241f8096a41106a2207200241086a41106a290000370300200241f8096a41086a2208200241086a41086a290000370300200220022900083703f8092001200241b00e6a41386a2900003703002003200241b00e6a41306a2900003703002004200241b00e6a41286a2900003703002005200241b00e6a41206a2900003703002006200241b00e6a41186a2900003703002007200241b00e6a41106a2900003703002008200241b00e6a41086a290000370300200220022900b00e3703f809200041073a0008024020024188036a41086a2d00002201411d74411d75417f4a0d000240024020014104460d0020014105470d0120024198036a2d00004101470d02200241a0036a280200450d022002419c036a2802001002200241f0126a24000f0b20024198036a2d00004101470d012002419c036a1025200241f0126a24000f0b20024194036a2d00004101470d0020091025200241f0126a24000f0b200241f0126a24000bd81a05077f017e027f017e017f230041c0016b22012400200141003a00a001200141a0016a20002802002202200028020422034100472204101e1a2000200320046b22053602042000200220046a220236020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d004106210420012d00a001220341074b0d19024020030e080004021b1b050603000b200141003a00a001200141a0016a200220054100472203101e1a200041046a200520036b22063602002000200220036a22033602002005450d1920012d00a0012205450d0820054101470d19200141003602a001200141a0016a20032006410420064104491b2205101e1a200041046a200620056b3602002000200320056a360200200641034d0d1920012802a0012207ad42187e2208422088a70d152008a72203417f4c0d142003450d112003100122090d120c1b0b410621040c180b200141003a00a001200141a0016a200220054100472203101e1a41042109200041046a200520036b22063602002000200220036a22033602002005450d1720012d00a001220541034b0d17024020050e04000a0b0c000b200142003703a001200141a0016a20032006410820064108491b2205101e1a200041046a200620056b3602002000200320056a360200200641074d0d1720012903a0012108410121090c0b0b200141003a00a001200141a0016a200220054100472203101e1a200041046a200520036b22063602002000200220036a22033602002005450d1620012d00a0012205450d0320054101470d16200142003703a001200141a0016a20032006410820064108491b2205101e1a200041046a200620056b3602002000200320056a360200200641074d0d1620012903a00121084202210b0c040b200141003a00a001200141a0016a200220054100472203101e1a200041046a200520036b22063602002000200220036a22033602002005450d1520012d00a0012205450d054202210b20054101460d060c160b200141a0016a200010a00120012903a001220ba741ff01714103460d1520014180016a41086a200141a0016a41086a29020037030020014180016a41106a200141a0016a41106a290200370300200120012902a001370380012001200b370348410321040c150b200141003a00a001200141a0016a200220054100472206101e1a200041046a200520066b22033602002000200220066a220236020002402005450d004105210520012d00a001220641034b0d11024020060e04000c0a0b000b200141003602a001200141a0016a20022003410420034104491b2206101e1a200041046a200320066b3602002000200220066a360200200341034d0d1120012802a0012100410121050c130b410521050c100b200142003703a001200141a0016a20032006410820064108491b2205101e1a200041046a200620056b3602002000200320056a360200200641074d0d1220012903a00121084201210b0b20014180016a41086a200141a0016a41086a29030037030020014180016a41106a200141a0016a41106a290300370300200120012903a001370380012001200b37024c410521040c120b200141a0016a2000101f20012802a0012209450d1020012902a4012108410121000c0a0b200142003703a001200141a0016a200320064108200641084922021b2205101e1a200041046a200620056b3602002000200320056a36020020020d0f20012903a00121084201210b0b20014180016a41086a200141a0016a41086a29030037030020014180016a41106a200141a0016a41106a290300370300200120012903a001370380012001200b37024c410121040c0f0b200142003703a001200141a0016a20032006410820064108491b2205101e1a200041046a200620056b3602002000200320056a360200200641074d0d0d20012903a0012108410221090c010b200141003602a001200141a0016a20032006410420064104491b2205101e1a200041046a200620056b3602002000200320056a36020041032109200641034d0d0c20012802a00121020b20014180016a41086a200141a0016a41086a29030037030020014180016a41106a200141a0016a41106a290300370300200120023602502001200936024c200120012903a00137038001410221040c0c0b200142003703a001200141a0016a20022003410820034108491b2206101e1a200041046a200320066b3602002000200220066a360200200341074d0d0720012903a0012108410321050c080b200142003703a001200141a0016a20022003410820034108491b2206101e1a200041046a200320066b3602002000200220066a360200200341074d0d0620012903a0012108410421050c080b200141a0016a2003412020034120491b22066a41004100412020066b2006411f4b1b10171a200141a0016a20022006101e1a200041046a200320066b3602002000200220066a36020002402003411f4d0d0020014180016a41186a2200200141a0016a41186a220329030037030020014180016a41106a2205200141a0016a41106a220229030037030020014180016a41086a2206200141a0016a41086a2209290300370300200120012903a0013703800120032000290300370300200220052903003703002009200629030037030020012001290380013703a00141022105200141fc006a41026a220320012d00a2013a0000200141e8006a41086a2202200141b7016a290000370300200141e8006a41106a2206200141a0016a411f6a2d00003a0000200120012f01a0013b017c200120012900af0137036820012800a301210020012900a7012108200141e4006a41026a20032d00003a0000200141c8006a41086a2002290300370300200141c8006a41106a20062d00003a0000200120012f017c3b0164200120012903683703480c080b200141a0016a41186a20014180016a41186a290000370300200141a0016a41106a20014180016a41106a290000370300200141a0016a41086a20014180016a41086a29000037030020012001290080013703a0010c050b410421090b2001200736024c20012009360248410021032001410036025002402007450d00200141d0006a210c41002102034020014180016a2000101f024002402001280280012206450d002001290284012108200141a0016a2000101f024020012802a001220a450d00200241016a210220012902a401210b2003200128024c470d02200141c8006a1076200c2802002103200128024821090c020b2008a7450d00200610020b2001280248210502402003450d00200341186c21032005210003400240200041046a280200450d00200028020010020b0240200041106a280200450d002000410c6a28020010020b200041186a2100200341686a22030d000b0b200128024c450d09200510020c090b2009200341186c6a22052008370204200520063602002005410c6a200a360200200541106a200b370200200c200341016a220336020020022007490d000b200128024821090b2009450d06200129024c2108410221000b20014180016a41086a200141a0016a41086a29020037030020014180016a41106a200141a0016a41106a29020037030020012000360248200120012902a00137038001200120084220862009ad8437024c20084220882108410021040c060b1061000b1060000b0b0b20014180016a41026a2203200141e4006a41026a2d00003a0000200141a0016a41086a2202200141c8006a41086a290300370300200141a0016a41106a2206200141c8006a41106a290300370300200120012f01643b018001200120012903483703a00120054105460d00200141c4006a41026a220420032d00003a0000200141286a41086a22032002290300370300200141286a41106a22022006290300370300200120012f0180013b0144200120012903a00137032820014180016a41086a200329030037030020014180016a41106a2002290300370300200120053a004c20012000360250200120012f01443b004d200120042d00003a004f2001200129032837038001410421040c010b0b200141c4006a41026a220020012d004f3a0000200141286a41086a220520014180016a41086a290300370300200141286a41106a220220014180016a41106a290300370300200120012f004d3b014420012001290380013703282001280250210620012d004c21092001280248210a41062103024020044106460d00200141246a41026a20002d00003a0000200141086a41086a2005290300370300200141086a41106a2002290300370300200120012f01443b012420012001290328370308200421030b024020034106470d00200141c0016a240041000f0b20014180016a41026a2204200141246a41026a2d00003a0000200141a0016a41086a2205200141086a41086a290300370300200141a0016a41106a2202200141086a41106a290300370300200120012f01243b018001200120012903083703a001413010012200450d002000200a36020420002003360200200020093a0008200020012f0180013b00092000200636000c20002008370210200020012903a0013702182000410b6a20042d00003a0000200041206a2005290300370200200041286a2002290300370200200141c0016a240020000f0b101c000be60101037f0240024002402000280200220128020022024103460d0020020d0220012802042202450d0220024101470d012001410c6a280200450d02200141086a2802001002200028020010020f0b20012d00044101470d01200141086a1022200028020010020f0b0240200141106a2802002203450d00200141086a2802002102200341186c210303400240200241046a280200450d00200228020010020b0240200241106a280200450d002002410c6a28020010020b200241186a2102200341686a22030d000b0b2001410c6a280200450d00200141086a28020010020b200028020010020b7901047f0240024002400240200041046a2802002201450d002001418080808004710d03200028020021022001410174220310012204450d022004200220032001200120034b1b101e1a200210020c010b410410012204450d01410421030b20002004360200200041046a20033602000f0b101c000b106e000b05001041000be60101037f0240024002402000280200220128020022024103460d0020020d0220012802042202450d0220024101470d012001410c6a280200450d02200141086a2802001002200028020010020f0b20012d00044101470d01200141086a1025200028020010020f0b0240200141106a2802002203450d00200141086a2802002102200341186c210303400240200241046a280200450d00200228020010020b0240200241106a280200450d002002410c6a28020010020b200241186a2102200341686a22030d000b0b2001410c6a280200450d00200141086a28020010020b200028020010020b890403037f017e027f230041206b22022400200241003602082002420137030020024100410410272002280200200228020822036a41003600002002200341046a220336020820022003412010272002280200200228020822046a220320012900a002370000200341186a200141b8026a290000370000200341106a200141b0026a290000370000200341086a200141a8026a2900003700002002200441206a22033602082001290300210520022003410810272002280200200228020822036a20053700002002200341086a2206360208200241106a200141086a1028200228021021042002200620022802182203102720022003200228020822066a2207360208200620022802006a20042003101e1a02402002280214450d00200410020b2002200741c0001027200241086a22032003280200220441c0006a22063602002004200228020022076a220320012900c002370000200341086a200141c8026a290000370000200341106a200141d0026a290000370000200341186a200141d8026a290000370000200341206a200141e0026a290000370000200341286a200141e8026a290000370000200341306a200141f0026a290000370000200341386a200141f8026a2900003700000240200641034d0d002000200229030037020020072004413c6a360000200041086a200241086a280200360200200241206a24000f0b410420061029000ba10101027f024002400240200041046a280200220320016b20024f0d00200120026a220220014922010d0141000d01200341017422044100200220011b2201200420014b1b22014100480d01024002402003450d0020002802002104200110012202450d042002200420012003200320014b1b101e1a200410020c010b200110012202450d030b20002002360200200041046a20013602000b0f0b1041000b101c000bfb2602077f017e230041306b22022400200241003602082002420137030002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220341054b0d0002400240024002400240024020030e06000402030105000b2002107e2002280200200241086a22032802006a41013a00002003200328020041016a2204360200200241003602282002420137032020012d0001450d16200241206a107e2002280220200241206a41086a220528020022066a41003a00002005200641016a2206360200200241206a20064120102720052005280200220741206a22063602002007200228022022086a2205200141026a290000370000200541086a2001410a6a290000370000200541106a200141126a290000370000200541186a2001411a6a29000037000020022802242101200220042006102720032003280200220520066a360200200520022802006a20082006101e1a2001450d14200810020c140b2002107e2002280200200241086a22032802006a41063a00002003200328020041016a3602002002410036021820024201370310200141086a2d0000417f6a220341044b0d16024020030e05001210110f000b200241106a107e2002280210200241186a22032802006a41003a00002003200328020041016a2208360200200241206a2001410c6a10b80120022802202106200241106a200820022802282205102720032005200328020022086a360200200820022802106a20062005101e1a02402002280224450d00200610020b200141186a2802002101200241106a20032802004104102720032003280200220541046a360200200520022802106a20013600000c120b2002107e2002280200200241086a22032802006a41033a00002003200328020041016a3602002002410036022820024201370320200141086a2903004200510d16200241206a107e2002280220200241206a41086a220528020022066a41003a00002005200641016a2206360200200141106a2903002109200241206a20064108102720052005280200220641086a22013602002006200228022022056a200937000020022802242106200220032802002001102720032003280200220820016a360200200820022802006a20052001101e1a2006450d12200510020c120b2002107e2002280200200241086a22032802006a41053a00002003200328020041016a3602002002410036021820024201370310200141086a2d000022034103714101460d0520034102460d0320034103470d16200241106a107e2002280210200241186a220528020022036a41023a00002005200341016a22033602002001410c6a2802002106200241106a20034104102720052005280200220341046a2208360200200320022802106a2006360000200241106a20084101102720052005280200220641016a22033602002006200228021022056a200141096a2d00003a00000c060b2002107e2002280200200241086a22032802006a41023a00002003200328020041016a22063602002002410036022820024201370320200141086a2d000022054103714101460d0620054103460d0320054102470d16200241206a107e20022802202205200241286a220328020022016a41013a00002003200141016a22013602000c070b2002107e2002280200200241086a22032802006a41073a00002003200328020041016a22063602002002410036021820024201370310200141046a2d000022034103714101460d0820034102460d0720034103470d16200241106a107e2002280210200241106a41086a220528020022036a41023a00002005200341016a2203360200200241106a20034120102720052005280200220841206a22033602002008200228021022056a2208200141056a290000370000200841086a2001410d6a290000370000200841106a200141156a290000370000200841186a2001411d6a2900003700000c090b2002107e2002280200200241086a22032802006a41003a00002003200328020041016a3602002002410036022820024201370320200141106a2d00004102460d16200241206a107e2002280220200241206a41086a220328020022056a41003a00002003200541016a2207360200412010012203450d0f200341186a2206200141f0016a290000370000200341106a2208200141e8016a290000370000200341086a2204200141e0016a2900003700002003200141d8016a290000370000200141086a290300210941c00010012205450d0f20052003290000370000200541186a2006290000370000200541106a2008290000370000200541086a2004290000370000200310022005200937002041800110012203450d0f20032005290000370000200341386a2206200541386a290000370000200341306a2208200541306a290000370000200341286a2204200541286a290000370000200341206a200541206a290000370000200341186a200541186a290000370000200341106a200541106a290000370000200341086a200541086a29000037000020051002200341c0006a20014190026a290000370000200620014188026a290000370000200820014180026a2900003700002004200141f8016a29000037000020014191016a2105200141f1006a2108200141316a2106200141116a210402400240200141106a2d0000450d00200341c8006a41123a00002003200141d4016a2802003600492003200429000037004d200341d5006a200441086a290000370000200341dd006a200441106a290000370000200341e5006a200441186a29000037000041800210012201450d1120012003418001101e210120031002200141a5016a200641386a2900003700002001419d016a200641306a29000037000020014195016a200641286a2900003700002001418d016a200641206a29000037000020014185016a200641186a290000370000200141fd006a200641106a290000370000200141f5006a200641086a2900003700002001200629000037006d200120082900003700ad01200141b5016a200841086a290000370000200141bd016a200841106a290000370000200141c5016a200841186a29000037000041800410012206450d1120062001418002101e21032001100220034185026a200541386a290000370000200341fd016a200541306a290000370000200341f5016a200541286a290000370000200341ed016a200541206a290000370000200341e5016a200541186a290000370000200341dd016a200541106a290000370000200341d5016a200541086a290000370000200320052900003700cd010c010b200341c8006a41113a00002003200141d4016a2802003600492003200429000037004d200341d5006a200441086a290000370000200341dd006a200441106a290000370000200341e5006a200441186a29000037000041800210012201450d1020012003418001101e210120031002200141a5016a200641386a2900003700002001419d016a200641306a29000037000020014195016a200641286a2900003700002001418d016a200641206a29000037000020014185016a200641186a290000370000200141fd006a200641106a290000370000200141f5006a200641086a2900003700002001200629000037006d200120082900003700ad01200141b5016a200841086a290000370000200141bd016a200841106a290000370000200141c5016a200841186a29000037000041800410012206450d1020062001418002101e21032001100220034185026a200541386a290000370000200341fd016a200541306a290000370000200341f5016a200541286a290000370000200341ed016a200541206a290000370000200341e5016a200541186a290000370000200341dd016a200541106a290000370000200341d5016a200541086a290000370000200320052900003700cd010b200241206a2007418d021027200241206a41086a220120012802002203418d026a22013602002003200228022022056a2006418d02101e1a20061002200228022421062002200241086a22032802002001102720032003280200220820016a360200200820022802006a20052001101e1a2006450d0e200510020c0e0b200241106a107e2002280210200241186a220528020022036a41013a00002005200341016a22033602002001410c6a2802002101200241106a20034104102720052005280200220641046a22033602002006200228021022056a20013600000c020b200241206a107e20022802202205200241286a220328020022016a41023a00002003200141016a22013602000c030b200241106a107e2002280210200241106a41086a220328020022056a41003a00002003200541016a2208360200200241206a2001410c6a28020010d80120022802202106200241106a200820022802282205102720032005200328020022086a2204360200200820022802106a20062005101e1a02402002280224450d00200610020b200141106a2903002109200241106a200441081027200241106a41086a22012001280200220141086a22033602002001200228021022056a20093700000b200228021421062002200241086a22012802002003102720012001280200220820036a360200200820022802006a20052003101e1a2006450d0a200510020c0a0b200241206a107e2002280220200241206a41086a220628020022056a41003a00002006200541016a2205360200200241206a2005412010272002280220200628020022086a2205200141096a290000370000200541186a200141216a290000370000200541106a200141196a290000370000200541086a200141116a2900003700002006200841206a2205360200200141306a2903002109200241206a20054108102720022802202205200628020022016a20093700002006200141086a2201360200200328020021060b200228022421032002200620011027200241086a22062006280200220620016a360200200620022802006a20052001101e1a2003450d08200510020c080b200241106a107e2002280210200241106a41086a220628020022036a41013a00002006200341016a2203360200200241106a20034120102720062006280200220341206a2205360200200320022802106a2203200141056a290000370000200341086a2001410d6a290000370000200341106a200141156a290000370000200341186a2001411d6a290000370000200241106a20054101102720022802102205200628020022036a200141256a2d00003a00002006200341016a2203360200200241086a28020021060c010b200241106a107e2002280210200241106a41086a220528020022036a41003a00002005200341016a2203360200200241206a200141086a28020010d80120022802202108200241106a200320022802282201102720052001200528020022046a22033602002004200228021022056a20082001101e1a2002280224450d00200810020b200228021421012002200620031027200241086a22062006280200220620036a360200200620022802006a20052003101e1a2001450d05200510020c050b200241106a107e2002280210200241106a41086a22032802006a41043a00002003200328020041016a2205360200200241106a20054120102720032003280200220541206a2206360200200520022802106a220541186a200141216a290000370000200541106a200141196a290000370000200541086a200141116a2900003700002005200141096a290000370000200141306a2903002109200241106a20064108102720032003280200220541086a360200200520022802106a20093700002001412c6a2802002101200241106a20032802004104102720032003280200220541046a360200200520022802106a20013600000c030b200241106a107e2002280210200241186a22032802006a41023a00002003200328020041016a22053602002001410c6a2802002101200241106a20054104102720032003280200220541046a360200200520022802106a20013600000c020b200241106a107e2002280210200241186a22032802006a41033a00002003200328020041016a22053602002001410c6a2802002101200241106a20054104102720032003280200220541046a360200200520022802106a20013600000c010b200241106a107e2002280210200241106a41086a22032802006a41013a00002003200328020041016a22053602002001412c6a2802002106200241106a20054104102720032003280200220541046a360200200520022802106a2006360000200241106a20032802004120102720032003280200220541206a2206360200200520022802106a220541186a200141216a290000370000200541106a200141196a290000370000200541086a200141116a2900003700002005200141096a290000370000200141306a2802002105200241106a20064104102720032003280200220641046a360200200620022802106a2005360000200141346a2802002101200241106a20032802004104102720032003280200220541046a360200200520022802106a20013600000b20022802142106200228021021052002200241086a2201280200200241106a41086a2802002203102720012003200128020022086a360200200820022802006a20052003101e1a2006450d00200510020b20002002290300370200200041086a200241086a280200360200200241306a24000f0b101c000b41ec30103b000b419435103b000b41ec34103b000b41ac3f103b000b41943b103b000b41843e103b000b41ecc100103b000b08004194321054000b4b01017f02402002417f4c0d00024002402002450d002002100122030d01101c000b410121030b200320012002101e21012000200236020420002001360200200020023602080f0b102b000b05001041000ba10c03037f027e0c7f23004180016b22002400200041e0006a41086a220142003703002000420037036041c8084107200041e0006a1003200041306a41086a200129030037030020002000290360370330024002400240200041306a411041d02d410041001000417f460d002000420037036002400240200041306a4110200041e0006a41084100100041016a41084d0d002000200029036042017c370340200041e0006a41086a220242003703002000420037036041c8084107200041e0006a1003200041306a41086a2201200229030037030020002000290360370330200041306a4110200041c0006a41081004200142003703002000420037033041dd084107200041306a1003200041106a41086a2001290300370300200020002903303703100240200041106a411041d02d410041001000417f460d0020004200370360200041106a4110200041e0006a41084100100041016a41084d0d0220002903602103200041306a41086a220142003703002000420037033041dd084107200041306a1003200041e0006a41086a200129030037030020002000290330370360200041e0006a411010054201a74101470d050c040b4200a74101460d030c040b41c1214133102d000b41c1214133102d000b41f4214122102d000b102e210420002003370340200041e0006a41086a220142003703002000420037036041cf084107200041e0006a1003200041306a41086a2202200129030037030020002000290360370330200041306a4110200041c0006a4108100420002004370340200142003703002000420037036041d6084107200041e0006a10032002200129030037030020002000290360370330200041306a4110200041c0006a410810040b2000102f2000280200210502400240024020002802082201450d002001410574210620052107410021080340410810012201450d022000200136026020004208370264200041e0006a410041081027200041e0006a41086a22012001280200220241086a360200200220002802606a42f3cacdd3e38d9eba3a370000200041c0006a41086a2202200128020036020020002000290360370340412010012209450d022000200936026020004220370264200041e0006a41004120102720012001280200220a41206a2209360200200a2000280260220b6a220a2007290000370000200a41086a200741086a290000370000200a41106a200741106a290000370000200a41186a200741186a2900003700002000280264210c200041c0006a2002280200200910272000280240220a2002280200220d6a200b2009101e1a2002200d20096a220d3602000240200c450d00200b10020b2000280244210c200041306a41086a2209420037030020004200370330200a200d200041306a1003200041106a41086a220b20092903003703002000200029033037031002400240200041106a411041d02d410041001000417f460d00200041e0006a41186a220e4200370300200041e0006a41106a220f42003703002001420037030020004200370360200041106a4110200041e0006a4120410010002210417f460d052010411f4d0d05200041c0006a41186a200e290300370300200041c0006a41106a200f29030037030020022001290300370300200020002903603703402009420037030020004200370330200a200d200041306a10032001200929030037030020002000290330370360200041e0006a41101005410121090c010b410021090b200041106a41186a220d200041c0006a41186a290300370300200041106a41106a220e200041c0006a41106a290300370300200b2002290300370300200020002903403703100240200c450d00200a10020b02402009450d00200041e0006a41186a200d290300370300200041e0006a41106a200e2903003703002001200b29030037030020002000290310370360200041c0006a10302000280240220920022802001031210102402000280244450d00200910020b200120084d0d00200041c0006a20081032200028024022012002280200200041e0006a412010042000280244450d00200110020b200741206a2107200841016a2108200641606a22060d000b0b02402000280204450d00200510020b20004180016a24000f0b101c000b41c1214133102d000b080041b4321054000b9f0102027f017e230041206b22002400200041106a41086a220142003703002000420037031041d12d4107200041106a1003200041086a20012903003703002000200029031037030002402000411041d02d410041001000417f460d0020004200370310024020004110200041106a41084100100041016a41084d0d0020002903102102200041206a240020020f0b41c1214133102d000b41f4214122102d000bab0101027f230041306b22012400200141206a41086a220242003703002001420037032041e4084107200141206a1003200141086a200229030037030020012001290320370300024002402001411041d02d410041001000417f460d002001421037021420012001360210200141206a200141106a103a20012802202202450d012000200129022437020420002002360200200141306a24000f0b41f4214122102d000b41c1214133102d000bd60101047f230041206b220124000240410610012202450d002001200236021020014206370214200141106a4100410610272001280210200128021822036a220441002800c12d360000200141086a2202200341066a2203360200200441046a41002f00c52d3b0000200120012903103703002001200336021820012002280200410310272000200129030037020020022002280200220341036a2204360200200320012802006a220241002f00ee2e3b0000200041086a2004360200200241026a41002d00f02e3a0000200141206a24000f0b101c000b6001027f230041106b2202240041002103024002402000200141d02d410041001000417f460d002002410036020c200020012002410c6a41044100100041016a41044d0d01200228020c21030b200241106a240020030f0b41eb1a4133102d000bc30101047f230041206b220224000240410610012203450d002002200336021020024206370214200241106a4100410610272002280210200228021822046a220541002800c12d360000200241086a2203200441066a2204360200200541046a41002f00c52d3b00002002200229031037030020022004360218200220032802004104102720032003280200220441046a36020020002002290300370200200420022802006a2001360000200041086a2003280200360200200241206a24000f0b101c000b810301047f230041306b220224000240024002400240024002400240200128020022032001280204460d002001200341186a36020020032802082201417f4c0d06200328020021042001450d012001100122050d020c030b20004100360200200241306a24000f0b410121050b200220013602242002200536022020024100360228200241206a41002001102720022002280228220520016a360228200520022802206a20042001101e1a200241106a20022802283602002002200229032037030820032802142201417f4c0d03200328020c21032001450d012001100122040d020b101c000b410121040b200220013602242002200436022020024100360228200241206a41002001102720022002280228220420016a360228200420022802206a20032001101e1a200241146a220141086a200228022836020020012002290320370200200041106a200241086a41106a290300370200200041086a200241086a41086a29030037020020002002290308370200200241306a24000f0b1019000bd55a09017f017e017f017e067f017e177f047e027f230041f0026b220024001035102e2101200041c8026a41086a22024200370300200042003703c802418a264107200041c8026a100320004198026a41086a2002290300370300200020002903c802370398020240024002400240024002400240024002400240024002400240024020004198026a411041d02d410041001000417f460d00200042003703680240024020004198026a4110200041e8006a41084100100041016a41084d0d00200029036822034200510d0320012003824200520d0a200041f8016a103620002802f80121080240024002402000280280022209450d00200041e8006a2008280230103720002802702207450d072008200941d8006c6a2104200841d8006a2102200041f8006a35020021032000290368210a02402000280274450d00200710020b20022004460d01200a20037e2103200941d8006c41a87f6a210b41002105200041f0006a210c200041f8006a210d200041f4006a210e41012104200821060340200041e8006a200241306a2802001037200c2802002207450d052000290368200d3502007e210a0240200e280200450d00200710020b2003200a2003200a5622071b21032005200420071b21052006200220071b2106200441016a2104200241d8006a2102200b41a87f6a220b0d000b20060d022009450d00200941d8006c210420082102034020021038200241d8006a2102200441a87f6a22040d000b0b20002802fc01450d0c200810020c0c0b410021050b200920054d0d06200041e8006a2008200541d8006c6a220241d800101e1a200220082009417f6a220441d8006c6a220741d80010391a2007200041e8006a41d800101e2102200041f8016a41086a2004360200200041e8006a41086a22042002410c6a290200370300200041e8006a41106a2207200241146a290200370300200041e8006a41186a22052002411c6a290200370300200041e8006a41206a2206200241246a290200370300200041e8006a41286a220b2002412c6a280200360200200020022902043703682002280200220c4106460d07200041c0016a41086a220d2004290300370300200041c0016a41106a22042007290300370300200041c0016a41186a22072005290300370300200041c0016a41206a22052006290300370300200041c0016a41286a2206200b280200360200200020002903683703c001200241046a28022c2102200041386a41286a2006280200360200200041386a41206a2005290300370300200041386a41186a2007290300370300200041386a41106a2004290300370300200041386a41086a200d290300370300200020002903c001370338410810012204450d0b200020043602682000420837026c200041e8006a4100410810272000280268200028027022046a42e4cab5d3c3ac99b83a3700002000200441086a360270200041c0016a41086a2000280270360200200020002903683703c001410410012204450d0b200020043602682000420437026c200041e8006a41004104102720002802682207200028027022046a20023600002000200441046a2202360270200028026c2105200041c0016a20002802c8012002102720002802c001220420002802c80122066a20072002101e1a2000200620026a22023602c80102402005450d00200710020b20002802c401210620004198026a41086a2207420037030020004200370398022004200220004198026a1003200041e8006a41086a20072903003703002000200029039802370368410021070240200041e8006a411041d02d410041001000417f460d002000200041e8006a3602082000411036020c200042003703c00120004100200041e8006a4110200041c0016a41084100100022072007417f461b2207410820074108491b360210200741074d0d0620002903c0012103200041c0016a200041086a103a20002802c0012207450d06200041c0016a41086a280200210520002802c401210b20004198026a41086a220d420037030020004200370398022004200220004198026a1003200041c8026a41086a200d29030037030020002000290398023703c802200041c8026a411010052006450d0a0c090b20060d080c090b41c1214133102d000b4198264132102d000b41f4214122102d000b41c43f103b000b4198264132102d000b41c1214133102d000b41dc3f20052009103c000b41ec3f103b000b200410020b024002402007450d0002402005450d002005410574210420072102034020022003103d200241206a2102200441606a22040d000b0b200041e8006a41086a2202200041f8016a41086a280200360200200020002903f801370368200041e8006a103e20002802682105024020022802002202450d00200241d8006c210420052102034020021038200241d8006a2102200441a87f6a22040d000b0b0240200028026c450d00200510020b200041c8026a41086a22024200370300200042003703c80241f7264107200041c8026a100320004198026a41086a2002290300370300200020002903c8023703980220004198026a411041d02d410041001000417f460d0120004200370368024020004198026a4110200041e8006a41084100100041016a41084d0d0020002903682103200041f4006a200041c0006a290300370200200041fc006a200041c8006a29030037020020004184016a200041d0006a2903003702002000418c016a200041d8006a29030037020020004194016a200041e0006a2802003602002000200c3602682000200029033837026c200320017c200041e8006a4100103f200b450d03200710020c030b41c1214133102d000b41ca26412d102d000b41f4214122102d000b200020013703f801200041c8026a41086a22024200370300200042003703c80241fe264107200041c8026a100320004198026a41086a2002290300370300200020002903c80237039802024002400240024020004198026a411041d02d410041001000417f460d00200041003602680240024020004198026a4110200041e8006a41044100100041016a41044d0d0020002802682104200041c8026a41086a22024200370300200042003703c8024185274107200041c8026a100320004198026a41086a2002290300370300200020002903c8023703980220004198026a411041d02d410041001000417f460d032000410036026820004198026a4110200041e8006a41044100100041016a41044d0d012000200028026822053602cc02200041003a00d402200020043602c8022000200041f8016a3602d0020240200420054f0d002000200441016a22023602c802200041f0006a210602400340200041e8006a20041040200628020022074106470d01200220054f0d022000200241016a22073602c80220022104200721020c000b0b200041386a41086a2205200041fc006a2206290200370300200041386a41106a220b20004184016a220c290200370300200041386a41186a220d2000418c016a220e290200370300200041386a41206a220820004194016a2209290200370300200041386a41286a220f2000419c016a221028020036020020002000290274370338200041a0016a2d0000211120002903682103200041b8026a41026a221220004198026a41026a2d00003a0000200020002f0098023b01b802200041e8006a410c6a2202200029033837020020062005290300370200200c200b290300370200200e200d290300370200200920082903003702002010200f280200360200200041a7016a20122d00003a00002000200736027020002003370368200020043602a001200020113a00a401200020002f01b8023b00a5010240200320002903f801520d00200041c0016a41306a200241306a280200360200200041c0016a41286a200241286a290200370300200041c0016a41206a200241206a290200370300200041c0016a41186a200241186a290200370300200041c0016a41106a200241106a290200370300200041c0016a41086a200241086a290200370300200020022902003703c00120074106460d010c060b200041c8026a410c6a41013a0000200041e8006a41086a10384106210741064106470d050b4108211341002102410021140c050b41c1214133102d000b41c1214133102d000b41f4214122102d000b41f4214122102d000b200041e8006a41306a2202200041c0016a41306a280200360200200041e8006a41286a2204200041c0016a41286a290300370300200041e8006a41206a2205200041c0016a41206a290300370300200041e8006a41186a2206200041c0016a41186a290300370300200041e8006a41106a220b200041c0016a41106a290300370300200041e8006a41086a220c200041c0016a41086a290300370300200020002903c00137036841c00010012213450d0120132007360208201320033703002013200029036837020c201341146a200c2903003702002013411c6a200b290300370200201341246a20062903003702002013412c6a2005290300370200201341346a20042903003702002013413c6a2002280200360200200041086a41086a200041c8026a41086a290300370300200020002903c802370308024020002d00140d0020002802082202200028020c4f0d002000200241016a360208200041f0006a210402400340200041e8006a20021040200428020022074106470d0120002802082202200028020c4f0d022000200241016a3602080c000b0b200041386a41086a2205200041fc006a2206290200370300200041386a41106a220b20004184016a220c290200370300200041386a41186a220d2000418c016a220e290200370300200041386a41206a220820004194016a2209290200370300200041386a41286a220f2000419c016a221028020036020020002000290274370338200041a0016a2d0000211120002903682103200041b8026a41026a221220004198026a41026a2d00003a0000200020002f0098023b01b802200041e8006a410c6a2204200029033837020020062005290300370200200c200b290300370200200e200d290300370200200920082903003702002010200f280200360200200041a7016a20122d00003a00002000200736027020002003370368200020023602a001200020113a00a401200020002f01b8023b00a5010240024020032000280210290300520d00200041c0016a41306a200441306a280200360200200041c0016a41286a200441286a290200370300200041c0016a41206a200441206a290200370300200041c0016a41186a200441186a290200370300200041c0016a41106a200441106a290200370300200041c0016a41086a200441086a290200370300200020042902003703c0014106210b20074106470d010c020b200041086a410c6a41013a0000200041e8006a41086a1038410621074106210b41064106460d010b200041e8006a41086a2106200041a5016a2111200041e8006a410c6a210d410121144101210202400340200041e8006a41306a2205200041c0016a41306a2212280200360200200041e8006a41286a220c200041c0016a41286a221c290300370300200041e8006a41206a2209200041c0016a41206a221e290300370300200041e8006a41186a220f200041c0016a41186a221d290300370300200041e8006a41106a2210200041c0016a41106a22202903003703002006200041c0016a41086a2215290300370300200020002903c001370368024020022014470d00201441016a2204201449221b0d02200e2014410174221f20082004201b1b22082008201f491b2204ad420686220aa7200a422088a7221b1b220e4100480d02201b4100470d02024002402014450d00200e1001221b450d07201b2013200e2014200b74221f201f200e4b1b101e211b20131002201b21130c010b200e10012213450d060b200421140b20132002200b746a22042007360208200420033703002004413c6a2005280200360200200441346a200c2903003702002004412c6a2009290300370200200441246a200f2903003702002004411c6a2010290300370200200441146a20062903003702002004410c6a2000290368370200200241016a2102200041086a410c6a22092d00000d0320002802082205200028020c220c4f0d032000200541016a220436020802400340200041e8006a2005104020062802002207200b470d012004200c4f0d052000200441016a220736020820042105200721040c000b0b200041386a41086a221f200d41086a2204290200370300200041386a41106a2221200d41106a220c290200370300200041386a41186a2219200d41186a220f290200370300200041386a41206a2216200d41206a2210290200370300200041386a41286a221a200d41286a221b2802003602002000200d290200370338200041a0016a22172d000021182000290368210a200041b8026a41026a222720004198026a41026a2d00003a0000200020002f0098023b01b8022006200736020020172005360200200041e8006a413c6a20183a0000200d20002903383702002004201f290300370200200c2021290300370200200f201929030037020020102016290300370200201b201a280200360200201120002f01b8023b0000201141026a20272d00003a00002000200a3703680240200a200041086a41086a280200290300520d002012200d41306a280200360200201c201b290200370300201e2010290200370300201d200f2902003703002020200c290200370300201520042902003703002000200d2902003703c001200a21032007200b470d010c040b200941013a000020061038410621074106200b470d000c030b0b1041000b41012114410121020b201320024106746a21152002450d01200041386a41086a2116200041386a4104722110200041a7026a2117200041f8016a4104722118200041c0016a41186a2119200041c9016a211a200041c0016a41086a2107200041e8006a4104722105200041e8006a41286a211b200041e8006a41206a2112200041e8006a41106a211c2013210f0340200f22022802082111201b200241346a28020036020020122002412c6a290200370300200041e8006a41186a221d200241246a290200370300201c2002411c6a290200370300200041e8006a41086a221e200241146a29020037030020002002410c6a290200370368200241c0006a210f20114106460d0320022802382109200041086a41086a2204201e290300370300200041086a41106a2206201c290300370300200041086a41186a220b201d290300370300200041086a41206a220c2012290300370300200041086a41286a220d201b2802003602002000200029036837030820022d003c211f20102000290308370200201041086a2004290300370200201041106a2006290300370200201041186a200b290300370200201041206a200c290300370200201041286a200d28020036020020002011360238200041f8016a2009104220002802f801212002400240024002400240200041f8016a41086a22212802002202450d002002410574210d420021034200210a20202102034020021043210120021044212220052002290000370000200541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a29000037000020002009360268410810012204450d07200020043602c001200042083702c401200041c0016a41004108102720072007280200220441086a360200200420002802c0016a42e4cab5d3e3ee9bba3a370000200041c8026a41086a22042007280200360200200020002903c0013703c802200041c0016a200041e8006a104520002802c401210e20002802c001210c200041c8026a200428020020072802002206102720002802c802220b200428020022086a200c2006101e1a2004200820066a22083602000240200e450d00200c10020b20002802cc02210620044200370300200042003703c802200b2008200041c8026a100320004198026a41086a2004290300370300200020002903c8023703980202400240024020004198026a411041d02d410041001000417f470d004102210420060d010c020b200041003a00c00120004198026a4110200041c0016a41014100100041016a41014d0d0520002d00c00121042006450d010b200b10020b200441ff01714102460d02200241206a21024200202220017c2201200441017122041b200a7c210a2001420020041b20037c2103200d41606a220d0d000b20002802fc01450d040c030b4200210a4200210320002802fc010d020c030b41f90941e000102d000b41c1214133102d000b202010020b0240200041c8026a41086a22064200370300200042003703c80241f9204107200041c8026a100320004198026a41086a220b2006290300370300200020002903c802370398020240024002400240024020004198026a411041d02d410041001000417f460d0020004200370368024020004198026a4110200041e8006a41084100100041016a41084d0d0020002903682101200910460240200a20037c22224202882223500d0020232022510d004100210402400340200441026a21022022200441046a413e71ad882223500d012002210420232022520d000b0b20222002413e71ad88420052ad212302402002450d0003402023420186222320234201842223202320237e202241002002417e6a2204200420024b1b2202413f71ad88561b212320020d000b0b20014202882222500d040c030b2022420052ad21232001420288222250450d020c030b41c1214133102d000b41f4214122102d000b20222001510d004100210402400340200441026a21022001200441046a413e71ad882222500d012002210420222001520d000b0b20012002413e71ad88420052ad212202402002450d0003402022420186222220224201842222202220227e200141002002417e6a2204200420024b1b2202413f71ad88561b212220020d000b0b2023500d020c010b2001420052ad21222023500d010b02400240024002400240201f41037122024101460d0020024102470d012003200a580d050c040b2022500d01200a202280222420032023802225540d0303402023210120252024540d05200a202282212320032001822224500d052023500d042022202380212520222103202421222001210a2001202480222420255a0d000c040b0b2022500d01200a202380222420032022802225540d0203402023210120252024540d04200a200182212520032022822223500d042025500d03202220238021242022210a20012103202521222024200120258022255a0d000c030b0b419c31103b000b419c31103b000b200041c0016a41286a200041386a41286a290300370300200041c0016a41206a200041386a41206a2903003703002019200041386a41186a290300370300200041c0016a41106a220c200041386a41106a29030037030020072016290300370300200020002903383703c00102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802c001220e417f6a220241044b0d000240024002400240024020020e050004020301000b200728020022024101460d0720024102470d13102c0c210b200c2903002103200728020022024101460d0420024102470d132000200337036820064200370300200042003703c80241e122410a200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a4110200041e8006a410810040c200b200020002902c40122033703f8012003422088a721022003a72204410371220c4101460d04200c4102470d1320021046200441ff01714101470d1f201810220c1f0b20004194026a41026a220d201a41026a2d00003a00002021201941086a290300370300200041f8016a41106a2208201941106a2903003703002000201a2f00003b019402200020192903003703f80120072d0000410771417f6a220241034b0d13200c2903002103200041c0016a410c6a2802002104024020020e04000a0709000b2000200436026820064200370300200042003703c802419b164107200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a4110200041e8006a410410040c1a0b2007280200410771417f6a220241034b0d13200c2903002103024020020e04000b070a000b2000200337036820064200370300200042003703c80241cf1d4107200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a4110200041e8006a410810040c1d0b200c2802002111200041c0016a410c6a280200211e2007280200210820002802c401410371221d4101460d03201d4102470d1302402011450d002008201141186c22046a210d2008210203402002280200200241086a2802002002410c6a280200200241146a2802001004200241186a2202200d470d000b2011450d002008210203400240200241046a280200450d00200228020010020b0240200241106a280200450d002002410c6a28020010020b200241186a2102200441686a22040d000b0b0240201e450d00200810020b41002104201d4101470d194100210441000d19201e450d1920081002200e41077122024103470d1a0c1b0b2000200337036820064200370300200042003703c802418d23410b200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a4110200041e8006a410810040c1b0b102e210a20064200370300200042003703c80241f7264107200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a411041d02d410041001000417f460d122000420037036820004198026a4110200041e8006a41084100100041016a41084d0d0b20002903682101201b200241286a2903003703002012200241206a290300370300201d200241186a290300370300201c200241106a290300370300201e200241086a290300370300200020022903003703682001200a7c200041e8006a2003420888a7103f200210020c1a0b2000200c29030037036820064200370300200042003703c80241dd084107200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a4110200041e8006a410810040c190b41942f4105200820111004201e450d18200810020c180b2000200337036820064200370300200042003703c80241a2164107200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a4110200041e8006a410810040c130b2000200041c0016a410c6a28020036026820064200370300200042003703c80241de1d4107200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a4110200041e8006a410410040c160b2000200337036820064200370300200042003703c80241a9164107200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a4110200041e8006a410810040c110b20004198026a41036a200436000020004198026a41076a2003370000201720002903f80137000020004198026a41026a200d2d00003a0000201741086a2021290300370000201741106a20082d00003a0000200020002f0194023b019802200041e8006a1047200028026c2126200028026821270240201e2802002202450d00200241286c220241b07f6a2104200241586a210d202721020340200241086a2903002103200241106a290300210a200241186a2903002101200229030021222012200241206a290300370300201d2001370300201c200a370300201e200337030020002022370368200041e8006a20004198026a412010060d04200241286a2102200441586a2104200d41586a220d4158470d000b0b41002102410821112026450d03202710024100210d0c0f0b1048102c0c130b2000200337036820064200370300200042003703c80241d21e4107200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a4110200041e8006a410810040c120b200041c8026a41206a22202012290300370300200041c8026a41186a221f201d290300370300200041c8026a41106a2221201c2903003703002006201e290300370300200020002903683703c802412810012211450d15201120002903c802370300201141206a2020290300370300201141186a201f290300370300201141106a2021290300370300201141086a2006290300370300200020113602b80220004281808080103702bc02200d450d01200241286a21024101210d03402012200241206a290300370300201d200241186a290300370300201c200241106a290300370300201e200241086a290300370300200020022903003703680240200041e8006a20004198026a41201006450d0020202012290300370300201f201d2903003703002021201c2903003703002006201e290300370300200020002903683703c80220122020290300370300201d201f290300370300201c2021290300370300201e2006290300370300200020002903c8023703680240200d20002802bc02470d00200041b8026a200d4101104920002802b80221110b2011200d41286c6a22082000290368370300200841206a2012290300370300200841186a201d290300370300200841106a201c290300370300200841086a201e290300370300200041b8026a41086a200d41016a220d3602000b02402004450d00200241286a2102200441586a21040c010b0b2026450d0b0c0a0b4100210d0c0b0b4101210d20260d080c090b41c1214133102d000b418431103b000b419c3e103b000b419cc000103b000b41ac35103b000b41f43b103b000b419cc200103b000b41f4214122102d000b202710020b20002802bc0221020b201e200d3602002000200236026c20002011360268200041e8006a104a2002450d00201110020b410121040b200e41077122024103460d010b20020d012004450d0120002802c4012202450d01024020024101470d00200041c0016a410c6a280200450d02200728020010020c020b2007280200210d0240200c2802002202450d00200241186c2104200d210203400240200241046a280200450d00200228020010020b0240200241106a280200450d002002410c6a28020010020b200241186a2102200441686a22040d000b0b200041c0016a410c6a280200450d01200d10020c010b41000d0020002d00c40141ff01714101470d002007104b0b2000200941016a36026820064200370300200042003703c80241fe264107200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a4110200041e8006a41041004200f2015470d020c010b2000200941016a36026820064200370300200042003703c80241fe264107200041c8026a1003200b2006290300370300200020002903c8023703980220004198026a4110200041e8006a41041004024002400240201141077122024103460d0020020d02200028023c2202450d0220024101470d01200041386a410c6a280200450d0220162802001002200f2015470d040c030b20002d003c4101470d0120161022200f2015470d030c020b201628020021060240200041386a41106a2802002202450d00200241186c21042006210203400240200241046a280200450d00200228020010020b0240200241106a280200450d002002410c6a28020010020b200241186a2102200441686a22040d000b0b200041386a410c6a280200450d00200610020b200f2015470d010b0b2015220f2015460d040c030b101c000b2013210f0b200f2015460d010b200041e8006a41086a211c200041e8006a410c6a2102200041e8006a41306a2105200041e8006a41286a2106200041e8006a41206a210b200041e8006a41186a210c200041e8006a41106a210d0340200f41086a2802002104200f29030021032005200f413c6a2802003602002006200f41346a290200370300200b200f412c6a290200370300200c200f41246a290200370300200d200f411c6a290200370300200041e8006a41086a2207200f41146a2902003703002000200f410c6a29020037036820044106460d01200041c0016a41306a220e2005280200360200200041c0016a41286a22082006290300370300200041c0016a41206a2209200b290300370300200041c0016a41186a2210200c290300370300200041c0016a41106a2211200d290300370300200041c0016a41086a22122007290300370300200020002903683703c00120072004360200200220002903c001370200200241086a2012290300370200200241106a2011290300370200200241186a2010290300370200200241206a2009290300370200200241286a2008290300370200200241306a200e28020036020020002003370368201c1038200f41c0006a220f2015470d000b0b02402014450d00201310020b102e2101200041e8006a41086a220242003703002000420037036841ba1d4107200041e8006a1003200041c8026a41086a22042002290300370300200020002903683703c802420021030240024002400240024002400240024002400240200041c8026a411041d02d410041001000417f460d0020004200370368200041c8026a4110200041e8006a41084100100041016a41084d0d01200029036821030b200242003703002000420037036841c11d4107200041e8006a100320042002290300370300200020002903683703c802200041c8026a411041d02d410041001000417f460d0320004200370368024002400240200041c8026a4110200041e8006a41084100100041016a41084d0d002000290368210a200041e8006a41086a220242003703002000420037036841cf084107200041e8006a1003200041c8026a41086a2002290300370300200020002903683703c802200041c8026a411041d02d410041001000417f460d0720004200370368200041c8026a4110200041e8006a41084100100041016a41084d0d012000290368200a7e22224200510d084200210a0240200120037d2022824200520d0010480b102e2103200041e8006a41086a220242003703002000420037036841d6084107200041e8006a1003200041c8026a41086a22042002290300370300200020002903683703c80202400240200041c8026a411041d02d410041001000417f460d0020004200370368200041c8026a4110200041e8006a41084100100041016a41084d0d06200029036821014201210a0c010b0b200242003703002000420037036841cf084107200041e8006a100320042002290300370300200020002903683703c802200041c8026a411041d02d410041001000417f460d0920004200370368200041c8026a4110200041e8006a41084100100041016a41084d0d02200029036822224200510d0a0240200342002001200a501b7d2022824200520d00102c0b200041c8026a41086a22024200370300200042003703c80241ad0b4107200041c8026a100320004198026a41086a2002290300370300200020002903c8023703980220004198026a411041d02d410041001000417f460d05200041003a006820004198026a4110200041e8006a41014100100041016a41014d0d0b20002d00682102200041c8026a41086a22044200370300200042003703c80241ad0b4107200041c8026a1003200041e8006a41086a2004290300370300200020002903c802370368200041e8006a411010052002450d05200041f0026a24000f0b41c1214133102d000b41c1214133102d000b41c1214133102d000b41c1214133102d000b41c1214133102d000b41c432103b000b41f4214122102d000b41f4214122102d000b41ac3b103b000b41f4214122102d000b41b431103b000b41c1214133102d000bdd91010b017f017e017f017e057f017e047f017e187f027e027f230041f0026b22002400102e2101200041286a41086a220242003703002000420037032841b0164107200041286a1003200041086a41086a200229030037030020002000290328370308024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a411041d02d410041001000417f460d00200042003703900202400240200041086a411020004190026a41084100100041016a41084d0d0020002903900222034200510d0320012003824200520d1d200041286a41086a2202420037030020004200370328419b164107200041286a1003200041086a41086a200229030037030020002000290328370308200041086a411041d02d410041001000417f460d052000410036029002200041086a411020004190026a41044100100041016a41044d0d012000280290022202450d1d200041e0016a1047200041286a41086a220442003703002000420037032841b00f4107200041286a1003200041086a41086a200429030037030020002000290328370308410021040240200041086a411041d02d410041001000417f460d002000200041086a360290012000411036029401200042003703900220004100200041086a411020004190026a41084100100022042004417f461b2204410820044108491b220d36029801200441074d0d05200029039002210e200041003602900220004198016a4100200041086a411020004190026a4104200d100022042004417f461b2204410420044104491b200d6a360200200441034d0d05200028029002210420004190026a20004190016a103a200028029002220f450d0520002802e801220d20046a2000290294022203422088a76b211002402003a7450d00200f10020b20102002490d080c070b102e210e20002802e801220d20024f0d060c070b41c1214133102d000b41c1214133102d000b41f4214122102d000b41ac39103b000b41c1214133102d000b41f4214122102d000b0240200420024f0d00200d200420026b6a2202200d4f0d0820002802e001200241286c6a290320210e0c010b200041286a41086a220242003703002000420037032841a9164107200041286a1003200041086a41086a200229030037030020002000290328370308200041086a411041d02d410041001000417f460d082000420037039002200041086a411020004190026a41084100100041016a41084d0d01200029039002200e7c210e0b200041286a41086a220242003703002000420037032841b0164107200041286a1003200041086a41086a200229030037030020002000290328370308200041086a411041d02d410041001000417f460d03200042003703900202400240200041086a411020004190026a41084100100041016a41084d0d0020002903900222034200510d06200e20037c427f7c220e200e2003827d2103024020002802e401450d0020002802e00110020b20032001520d17200041e8006a1047200041286a41086a2202420037030020004200370328419b164107200041286a1003200041086a41086a200229030037030020002000290328370308200041086a411041d02d410041001000417f460d072000410036029002200041086a411020004190026a41044100100041016a41044d0d012000280290022115102e21030240024020002802702214450d002000280268220241206a2903002003520d0020004190026a41186a2204200241186a29000037030020004190026a41106a220d200241106a29000037030020004190026a41086a2210200241086a290000370300200020022900003703900241201001220f450d12200241286a2102200f200029039002370000200f41186a2004290300370000200f41106a200d290300370000200f41086a20102903003700002000200f3602e00120004281808080103702e401412021104101210d0240201441286c41586a2211450d000340200241206a2903002003520d01200041c8006a41186a200241186a2204290000370300200041c8006a41106a200241106a2216290000370300200041c8006a41086a200241086a22172900003703002000200229000037034820004190016a41186a2218200429000037030020004190016a41106a2219201629000037030020004190016a41086a2216201729000037030020002002290000370390010240200d20002802e401470d00200041e0016a200d410110860120002802e001210f0b200241286a2102200f20106a2204200029039001370000200441186a2018290300370000200441106a2019290300370000200441086a2016290300370000200041e0016a41086a200d41016a220d360200201041206a2110201141586a22110d000b0b20002802e40121022014200d6b2015490d010c160b410021024101210f4100210d201441006b20154f0d150b200041286a41086a220442003703002000420037032841a2164107200041286a1003200041086a41086a200429030037030020002000290328370308200041086a411041d02d410041001000417f460d0a2000420037039002200041086a411020004190026a41084100100041016a41084d0d03200029039002210e20004190026a41106a2002360200200041a4026a200d3602002000200d20146b20156a2219360298022000200e20037c2203370390022000200f36029c02200041003602e801200042013703e001200041e0016a41004108102720002802e00120002802e80122046a20033700002000200441086a22043602e801200041e0016a20044104102720002802e00120002802e80122046a20193600002000200441046a22103602e80120004190016a2000419c026a10a201200028029001210d200041e0016a2010200028029801220410272000200420002802e80122116a22163602e801201120002802e00122106a200d2004101e1a0240200028029401450d00200d10020b200041286a41086a220442003703002000420037032841b00f4107200041286a1003200041086a41086a200429030037030020002000290328370308200041086a4110201020161004024020002802e401450d00201010020b02402002450d00200f10020b41082118200041286a41086a220242003703002000420037032841c50f4107200041286a1003200041086a41086a200229030037030020002000290328370308410021140240024002400240200041086a411041d02d410041001000417f460d0020004210370294012000200041086a3602900120004190026a20004190016a103a2000280290022215450d1341082118200028029402211b20004190026a41086a2802002202450d0120024105744105752214ad4203862203a722044100480d122003422088a74100470d12200410012218450d152002410574220d41606a410576211020182104201521020340200420021043200210447c370300200441086a2104200241206a2102200d41606a220d0d000b201041016a21020c030b410121154100211b0c010b410021140b410021020b2000410036029802200042013703900220004190026a41004104102720002802900220002802980222046a20023600002000200441046a3602980220004190016a41086a2204200028029802360200200020002903900237039001024002402002450d002002410374210f2018210d0340200d2903002103410810012202450d152000200236029002200042083702940220004190026a41004108102720004190026a41086a22022002280200221141086a2202360200201120002802900222106a2003370000200028029402211120004190016a2004280200200210272000280290012217200428020022166a20102002101e1a2004201620026a220236020002402011450d00201010020b200d41086a210d200f41786a220f0d000c020b0b200028029801210220002802900121170b2000280294012104200041286a41086a220d4200370300200042003703284181114107200041286a1003200041086a41086a200d29030037030020002000290328370308200041086a411020172002100402402004450d00201710020b02402014450d00201810020b200041286a41086a220242003703002000420037032841b7164107200041286a1003200041086a41086a200229030037030020002000290328370308200041086a411041d02d410041001000417f460d0b2000410036029002200041086a411020004190026a41044100100041016a41044d0d042000280290022102200041a8016a4200370300200041a0016a420037030020004198016a42003703002000420037039001200220196a220dad42287e2203422088a70d0c2003a72202417f4c0d0d4108210402402002450d00200210012204450d140b2000200d3602e401200020043602e001200041003602e80120004190026a41186a221020004190016a41186a29030037030020004190026a41106a220f20004190016a41106a29030037030020004190026a41086a20004190016a41086a290300370300200020002903900137039002200041e0016a200d10850120002802e00120002802e801221141286c6a2102024002400240200d4102490d0041012104034020024200370300200241206a2010290300370300200241186a200f290300370300200241106a20004190026a41086a290300370300200241086a200029039002370300200241286a2102200441016a2204200d490d000b201120046a417f6a21110c010b200d450d010b200220002903900237030820024200370300200241106a20004198026a290300370300200241186a20004190026a41106a290300370300200241206a20004190026a41186a290300370300201141016a21110b200041e0016a41086a2202201136020020004190026a41086a2002280200360200200020002903e0013703900220004190026a10b7010240200028029402450d0020002802900210020b201b450d15201510020c150b41c1214133102d000b41c1214133102d000b41c1214133102d000b41c1214133102d000b41c1214133102d000b41f4214122102d000b41c439103b000b41f4214122102d000b41cc362002200d103c000b41f4214122102d000b41f4214122102d000b41f4214122102d000b105e000b105f000b1041000b41c1214133102d000b41d900212a0c070b41d900212a0c060b41d900212a0c050b41d900212a0c040b2002450d00200f1002200028026c0d010c020b200028026c450d010b200028026810020b200041286a41086a220242003703002000420037032841b00f4107200041286a1003200041086a41086a20022903003703002000200029032837030802400240200041086a411041d02d410041001000417f460d002000200041086a360290012000411036029401200042003703900220004100200041086a411020004190026a41084100100022022002417f461b2202410820024108491b220436029801200241074d0d0b2000290390022103200041003602900220004198016a4100200041086a411020004190026a41042004100022022002417f461b22024104200241044922021b20046a36020020020d0b20004190026a20004190016a103a2000280290022205450d0b200028029402210620032001520d01200041286a41086a22024200370300200042003703284181114107200041286a1003200041086a41086a2204200229030037030020002000290328370308200041086a41101005200442003703002000420037030841b00f4107200041086a10032002200429030037030020002000290308370328200041286a411041d02d410041001000417f460d082000200041286a360290012000411036029401200042003703900220004100200041286a411020004190026a41084100100022022002417f461b22024108200241084922041b22023602980120040d09200041003602900220004198016a4100200041286a411020004190026a41042002100022042004417f461b2204410420044104491b20026a360200200441034d0d09200028029002210720004190026a20004190016a103a2000280290022208450d0920002902940221094108210a200041086a41086a220242003703002000420037030841b00f4107200041086a1003200041286a41086a2204200229030037030020002000290308370328200041286a411010052002420037030020004200370308418f114107200041086a100320042002290300370300200020002903083703284100210b02400240200041286a411041d02d410041001000417f460d0020004210370294012000200041286a3602900120004190026a20004190016a10b601200028029002220a450d052000290294022103200041086a41086a2202420037030020004200370308418f114107200041086a1003200041286a41086a200229030037030020002000290308370328200041286a411010052003422088a7210b2003a7210c0c010b4100210c0b102e2103200041286a41086a220242003703002000420037032841a9164107200041286a1003200041086a41086a200229030037030020002000290328370308200041086a411041d02d410041001000417f460d072000420037039002200041086a411020004190026a41084100100041016a41084d0d0d200020002903900220037c3703e002200041286a41086a220242003703002000420037032841c6104107200041286a1003200041086a41086a200229030037030020002000290328370308200041086a411041d02d410041001000417f460d062000420037039002200041086a411020004190026a41084100100041016a41084d0d0c2009422088a72111200a200b41286c22026a210f02402007450d0020002903900221034100200a6b20026b21042007210d200f210203402002200a460d01200241586a22102903004200510d01200241606a2003103d200441286a210420102102200d417f6a220d0d000b0b20004190026a104720002802980221042000280290022102200028029402210d200041f8016a200f360200200041fc016a41003a000020004180026a20073602002000200d3602e401200020023602e001200020023602e80120002002200441286c6a3602ec01200020113602f0012000200a3602f40120004184026a200041e0026a360200200041003a00880220004190026a200041e0016a10b90102400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000290390024200510d00417f4100200041ec016a280200200041e0016a41086a2802006b41286d2202200041f0016a2802006b2204200420024b1b220241016a220420042002491b2204ad42287e2203422088a70d1b2003a72202417f4c0d1a4108211202402002450d00200210012212450d160b201220004190026a41086a2202290300370300201241206a200241206a290300370300201241186a200241186a290300370300201241106a200241106a290300370300201241086a200241086a290300370300200020123602482000200436024c410121132000410136025020004190016a41286a200041e0016a41286a28020036020020004190016a41206a200041e0016a41206a29030037030020004190016a41186a200041e0016a41186a29030037030020004190016a41106a2214200041e0016a41106a29030037030020004190016a41086a200041e0016a41086a290300370300200020002903e0013703900120004190026a20004190016a10b90102402000290390024201520d0020004190026a41086a21022000419c016a2115412821104101210d0340200041e8006a41206a220f200241206a290300370300200041e8006a41186a2211200241186a290300370300200041e8006a41106a2216200241106a290300370300200041e8006a41086a2217200241086a290300370300200020022903003703680240200d2004470d00200041c8006a2004417f4100201528020020004190016a41086a2802006b41286d221820142802006b2219201920184b1b221841016a221920192018491b1049200028024821120b0240201220106a22042000290368370300200441206a200f290300370300200441186a2011290300370300200441106a2016290300370300200441086a2017290300370300200041c8006a41086a200d41016a220f36020020004190026a20004190016a10b9012000290390024201520d00201041286a2110200028024c2104200f210d0c010b0b200d41016a21130b024020004198016a220428020022022000419c016a280200220d460d0020042002200d20026b41586a41286e41286c6a41286a3602000b0240200028029401450d0020002802900110020b200028024c211a201341144b0d01201341014d0d022013417f6a210f2012201341286c6a41586a211103402013200f2202417f6a220f490d2102402013200f6b220d4102490d002012200241286c6a221041206a22042903002012200f41286c6a220241206a221629030022035a0d0020004190026a41186a2217200241186a221829030037030020004190026a41106a2219200241106a221429030037030020004190026a41086a2215200241086a221b290300370300200020022903003703900220022010290300370300201b201041086a2903003703002014201041106a2903003703002018201041186a290300370300201620042903003703000240200d4103490d00410221042011210203402004200d4f0d290240200241c8006a221029030020035a0d002004417f6a200d4f0d29200241206a2010290300370300200241186a200241c0006a290300370300200241106a200241386a290300370300200241086a200241306a2903003703002002200241286a221029030037030020102102200441016a2204200d490d010c020b0b200221100b2010200029039002370300201041186a2017290300370300201041106a2019290300370300201041086a2015290300370300201020033703200b201141586a2111200f0d000c030b0b0240200041e8016a22042802002202200041ec016a280200220d460d0020042002200d20026b41586a41286e41286c6a41286a3602000b024020002802e401450d0020002802e00110020b4100211a41082112410021130c010b2013410176221cad42287e2203422088a70d192003a72202417f4c0d184108211d02402002450d0020021001221d450d130b4100210420004100360298012000420437039001201241586a211e201241a87f6a211f4104210d20004190016a41086a21202013212103402021211641002121410121100240024002402016417f6a2202450d0002400240024002400240024002402012200241286c6a41206a29030020122016417e6a221041286c6a41206a29030022035a0d00410021112010450d02201f201641286c6a2102034020032002290300220e5a0d02200241586a2102200e21032010417f6a22100d000c030b0b02402010450d00201f201641286c6a210241022110034020032002290300220e540d04200241586a2102200e21032016201041016a2210470d000b41002121201621102004200028029401470d090c080b41022110410021212004200028029401470d080c070b201021110b024020162011490d00201620134b0d140240201620116b22104101762217450d00201e201641286c6a21022012201141286c6a210f034020004190026a41206a2218200f41206a221929030037030020004190026a41186a2214200f41186a221529030037030020004190026a41106a221b200f41106a222129030037030020004190026a41086a2222200f41086a22232903003703002000200f29030037039002200241086a22242903002103200241106a2225290300210e200241186a22262903002127200229030021282019200241206a2229290300370300201520273703002021200e37030020232003370300200f202837030020292018290300370300202620142903003703002025201b290300370300202420222903003703002002200029039002370300200241586a2102200f41286a210f2017417f6a22170d000b0b2011450d030c020b201120161055000b201620106b2211450d010b201041094d0d010b201121212004200028029401470d030c020b201620134b0d0d2012201141286c6a2117034020162011417f6a2221490d0f0240201620216b22104102490d002012201141286c6a221141206a220f2903002012202141286c6a220241206a221829030022035a0d0020004190026a41186a2219200241186a221429030037030020004190026a41106a2215200241106a221b29030037030020004190026a41086a2222200241086a22232903003703002000200229030037039002200220112903003703002023201141086a290300370300201b201141106a2903003703002014201141186a2903003703002018200f290300370300024020104103490d004102210f201721020340200f20104f0d090240200241c8006a221129030020035a0d00200f417f6a20104f0d0b200241206a2011290300370300200241186a200241c0006a290300370300200241106a200241386a290300370300200241086a200241306a2903003703002002200241286a221129030037030020112102200f41016a220f2010490d010c020b0b200221110b2011200029039002370300201141186a2019290300370300201141106a2015290300370300201141086a2022290300370300201120033703200b2021450d01201741586a2117202121112010410a490d000b0b2004200028029401470d010b20004190016a107a20202802002104200028029001210d0b200d20044103746a22022010360204200220213602002020200441016a2204360200024020044102490d00200028029001210d03400240024002400240200d2004417f6a4103746a2202280200450d00200d20044103746a221141746a280200220f200228020422104d0d00200441024d0d05200d2004417d6a22144103746a28020422022010200f6a4d0d01200441034d0d05201141646a2802002002200f6a4d0d010c050b20044103490d0120022802042110200d2004417d6a22144103746a28020421020b20022010490d010b2004417e6a21140b2004201441016a22154d0d06200420144d0d07200d201441037422226a2202280204222320022802006a2202200d201541037422246a2204280200221b490d08200220134b0d092012201b41286c6a22182004280204221941286c22046a210f200241286c210d024002400240024002402002201b6b221120196b220220194f0d00201d200f200241286c2204101e221120046a211020194101480d0120024101480d01201e200d6a210d200f21020340200d200241586a2216201041586a2217201041786a290300200241786a29030054220f1b2204290300370300200d41206a200441206a290300370300200d41186a200441186a290300370300200d41106a200441106a290300370300200d41086a200441086a29030037030020102017200f1b2110201820162002200f1b22024f0d04200d41586a210d2011210420112010490d000c050b0b201d20182004101e220220046a211020194101480d01201120194c0d012012200d6a2116200221042018210203402002200f2004200f41206a290300200441206a2903005422111b220d290300370300200241206a200d41206a290300370300200241186a200d41186a290300370300200241106a200d41106a290300370300200241086a200d41086a2903003703002004200441286a20111b2104200241286a2102200f41286a200f20111b220f20164f0d04201020044b0d000c040b0b200f21020c010b201821020b201d21040b20022004201020046b220d200d4128706b101e1a2020280200220220144d0d0a200028029001220d20226a2204202320196a3602042004201b360200200220154d0d0b200d20246a2204200441086a200220156b41037441786a10391a20202002417f6a2204360200200441014b0d000b0b20210d000b0240200028029401450d0020002802900110020b201c450d00201d10020b2000201a360294022000201236029002200020133602980220004190026a104a0240201a450d00201210020b200041286a41086a2202420037030020004200370328418d104107200041286a1003200041086a41086a2002290300370300200020002903283703084100211102400240200041086a411041d02d410041001000417f460d0020004210370294012000200041086a3602900120004190026a20004190016a103a2000280290022217450d0f20004198026a2802002111200028029402211e0c010b410121174100211e0b200041a8026a4200370300200041a0026a420037030020004198026a420037030020004200370390022011ad2203421b88a70d0b2003420586a72202417f4c0d0c024002402002450d002002100122020d010c120b410121020b200020113602940120002002360290012000410036029801200041c8006a41186a220d20004190026a41186a290300370300200041c8006a41106a220f20004190026a41106a290300370300200041c8006a41086a221620004190026a41086a290300370300200020002903900237034820004190016a41002011108601200028029001221020002802980122244105746a210202400240024020114102490d0041012104034020022000290348370000200241186a200d290300370000200241106a200f290300370000200241086a2016290300370000200241206a2102200441016a22042011490d000b202420046a417f6a21240c010b2011450d010b20022000290348370000200241186a200041c8006a41186a290300370000200241106a200041c8006a41106a290300370000200241086a200041c8006a41086a290300370000202441016a21240b2009a7211f20004190016a41086a22232024360200200a200b41286c6a2118200028029401212941002113410021164100212620070d0f0c0e0b41ccc100200f2010103c000b41dcc100200f417f6a2010103c000b41acc10020152004103c000b41acc10020142004103c000b201b20021055000b200220131029000b41bcc10020142002103c000b41b4c300103b000b20162011417f6a22214f0d010b202120161055000b201620131029000b1066000b1067000b41c1214133102d000b419201212a0c060b4106212a0c050b41d900212a0c040b41d900212a0c030b41d900212a0c020b4128212a0c010b4126212a0b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240202a0e9601080d94010e95010f101112131415161718191a1b1c1d1e292a2b2c88012f3031323334353638393a3b3c3d3e404155565758595b5c5d5e5f8e0160616263646566676c757677787e7f8001810182018301840185018601797a7c7d6d6e6f707172733f748d0168696a6b5a7b87014243900144454748494a4b4c4d4e4f515253549101920150468f019301372d2e1f2021890122238a0124258b0126278c01280001020405060703090a0b0c0c0b2018200a460d9f01418b01212a0c8a020b201841586a2202290300210320004190026a41186a2204201841786a221929030037030020004190026a41106a220d201841706a221429030037030020004190026a41086a220f201841686a22152903003703002000201841606a22182903003703900220004190016a41186a221d201929030037030020004190016a41106a22252014290300370300202320152903003703002000201829030037039001200041c8006a41186a22182004290300370300200041c8006a41106a2219200d290300370300200041c8006a41086a2214200f290300370300200020002903900237034820034200510d9f01418c01212a0c89020b200041e0016a41186a22152018290300370300200041e0016a41106a221b2019290300370300200041e0016a41086a22212014290300370300200020002903483703e0010c87020b2007417f6a210720152018290300370300201b201929030037030020212014290300370300200020002903483703e0014100211620222102418d01212a0c87020b200041e8006a41186a22122015290300370300200041e8006a41106a2220201b290300370300200041e8006a41086a22222021290300370300200020002903e00137036820042012290300370300200d2020290300370300200f202229030037030020002000290368370390022007450d9301418e01212a0c86020b201641ff01710d9901418f01212a0c85020b200a2002460d9b01419001212a0c84020b200241586a222229030021032004200241786a2216290300370300200d200241706a2212290300370300200f200241686a22202903003703002000200241606a220229030037039002201d201629030037030020252012290300370300202320202903003703002000200229030037039001201820042903003703002019200d2903003703002014200f290300370300200020002903900237034820034200520d9c010c9b010b200041286a41186a2004290300370300200041286a41106a200d290300370300200041286a41086a200f29030037030020002000290390023703280c8e010b201341ff01710d9101419301212a0c81020b2018200a460d9101419401212a0c80020b201841586a22022903002103200041e0016a41186a2204201841786a220d290300370300200041e0016a41106a220f201841706a2216290300370300200041e0016a41086a2219201841686a22142903003703002000201841606a22182903003703e00120004190016a41186a200d29030037030020004190016a41106a201629030037030020232014290300370300200020182903003703900120004190026a41186a220d200429030037030020004190026a41106a2204200f29030037030020004190026a41086a220f2019290300370300200020002903e001370390022003500d9101419501212a0cff010b200041286a41186a200d290300370300200041286a41106a2004290300370300200041286a41086a200f290300370300200020002903900237032841002113410021164101212a0cfe010b20004190026a41186a2204200041286a41186a29030037030020004190026a41106a220d200041286a41106a29030037030020004190026a41086a220f200041286a41086a2903003703002000200029032837039002200041e0016a20004190026a10b50120002802e0014101470d8b014103212a0cfd010b200041e0016a41086a280200211820004190016a41186a2219200429030037030020004190016a41106a2214200d2903003703002023200f290300370300200020002903900237039001200041086a41186a22152019290300370300200041086a41106a22192014290300370300200041086a41086a22142023290300370300200020002903900137030820042015290300370300200d2019290300370300200f20142903003703002000200029030837039002202420184d0d8b014105212a0cfc010b201020184105746a2218200029039002370000201841186a2004290300370000201841106a200d290300370000201841086a200f290300370000202641016a212641002107200221184100450d86014106212a0cfb010b4100450d8d014107212a0cfa010b200c450d93014108212a0cf9010b200a10024109212a0cf8010b20244105742221410575221b201141057441057522022002201b4b1b2218450d9201410a212a0cf7010b20172102201021044100210d410b212a0cf6010b20102017460d9201410c212a0cf5010b2002200441201006450d9201410d212a0cf4010b41071001220f450d9201410e212a0cf3010b2000200f36029002200042073702940220004190026a41004107102720004190026a41086a220f200f280200221141076a221936020020112000280290026a221641002800bf1036000020004190016a41086a22112019360200201641046a41002f00c3103b0000201641066a41002d00c5103a0000200020002903900237039001412010012216450d9201410f212a0cf2010b2000201636029002200042203702940220004190026a410041201027200f200f280200221941206a22163602002019200028029002220f6a20024120101e1a200028029402211420004190016a2011280200201610272000280290012219201128020022156a200f2016101e1a2011201520166a22163602002014450d92014110212a0cf1010b200f10024111212a0cf0010b200028029401210f200041286a41086a221142003703002000420037032820192016200041286a1003200041086a41086a201129030037030020002000290328370308200041086a41101005200f450d91014112212a0cef010b201910024113212a0cee010b200241206a2102200441206a2104200d41016a220d2018490d89014114212a0ced010b201020216a21022024210d201b4104490d8f0141fc00212a0cec010b20004190026a41206a2118200041d0026a2119200041f0026a211420004190036a2115200041a8026a210f200041a0026a211120004198026a21162024210d41fd00212a0ceb010b200f420037030020114200370300201642003703002000420037039002201820022204460de10141fe00212a0cea010b200441606a20004190026a412010060de101418001212a0ce9010b200f42003703002011420037030020164200370300200042003703900220192004460de101418101212a0ce8010b200441406a20004190026a412010060de101418301212a0ce7010b200f42003703002011420037030020164200370300200042003703900220142004460de101418401212a0ce6010b200441a07f6a20004190026a412010060de101418601212a0ce5010b200f420037030020114200370300201642003703002000420037039002200441807f6a210220152004460de101418701212a0ce4010b200220004190026a412010060de101418901212a0ce3010b200d417c6a210d200220106b41057541034b0d86014115212a0ce2010b20102002460d86014116212a0ce1010b20004190026a41206a2104200041a8026a210f200041a0026a211120004198026a21164117212a0ce0010b200f42003703002011420037030020164200370300200042003703900220042002460d86014118212a0cdf010b200241606a20004190026a412010060d860141fa00212a0cde010b200d417f6a210d2010200241606a2202470d830141fb00212a0cdd010b4100450d8f01411a212a0cdc010b200d41016a22022024202420024b1b2124411b212a0cdb010b20002029360294012000201036029001200020243602980120004190026a20004190016a10a20120002802980221042000280290022102200041286a41086a220d420037030020004200370328418d104107200041286a1003200041086a41086a200d29030037030020002000290328370308200041086a4110200220041004200028029402450d8e01411c212a0cda010b20021002411d212a0cd9010b2029450d8d01411e212a0cd8010b20101002411f212a0cd7010b2000202636029002200041286a41086a220242003703002000420037032841cd104107200041286a1003200041086a41086a2204200229030037030020002000290328370308200041086a411020004190026a41041004200242003703002000420037032841b70f4107200041286a10032004200229030037030020002000290328370308200041086a411041d02d410041001000417f460d8c014120212a0cd6010b2000410036029002200041086a411020004190026a41044100100041016a41044d0d8c014121212a0cd5010b20002802900241016a21020c8c010b410121024122212a0cd3010b2000200236029002200041286a41086a220242003703002000420037032841b70f4107200041286a1003200041086a41086a200229030037030020002000290328370308200041086a411020004190026a41041004201e450d8b014123212a0cd2010b201710024124212a0cd1010b201f450d8a014125212a0cd0010b200810024126212a0ccf010b2006450d89014127212a0cce010b200510024128212a0ccd010b20004190026a412c6a212520004190026a410472212620004190026a41206a210d20004190016a412c6a2122200041e0016a41086a2123200041e0016a4104722120200041e0016a410c6a21290c88010b20004190026a41286a200041e0016a41286a290300370300200d200041e0016a41206a29030037030020004190026a41186a200041e0016a41186a29030037030020004190026a41106a200041e0016a41106a29030037030020042023290300370300200020002903e0013703900220004190026a410210ba014129212a0ccb010b200041e0026a10bb0120002802e002210241062112200041e0026a41086a2210280200220f450d9001412a212a0cca010b20022903002103200041c8006a41186a2211200241206a290000370300200041c8006a41106a2216200241186a290000370300200041c8006a41086a2217200241106a290000370300200020022900083703484106211220032001520d900141e100212a0cc9010b200f417f6a2218ad42287e2203422088a70db50141e200212a0cc8010b2003a72204417f4c0db50141e400212a0cc7010b2004450db50141e500212a0cc6010b2004100122190daf010cae010b4108211941e600212a0cc4010b20004190026a41086a220441003602002000201836029402200020193602900220004190026a4100200f41286c41586a41286e220f108201200420042802002218200f6a360200200028029002201841286c6a200241286a200f41286c101e1a2023200428020036020020002000290390023703e001200041e0016a10bc0120002802e401450db30141e700212a0cc3010b20002802e001100241e800212a0cc2010b200041e8006a41186a22142011290300370300200041e8006a41106a22152016290300370300200041e8006a41086a221b20172903003703002000200029034837036841071001220f450dac0141e900212a0cc1010b2000200f36029002200042073702940220004190026a41004107102720042004280200220f41076a2218360200200f2000280290026a220f41002800eb2236000020232018360200200f41046a41002f00ef223b0000200f41066a41002d00f1223a000020002000290390023703e00141201001220f450dac0141ea00212a0cc0010b2000200f36029002200042203702940220004190026a41004120102720042004280200221841206a220f360200201820002802900222196a22182000290368370000201841086a201b290300370000201841106a2015290300370000201841186a20142903003700002000280294022115200041e0016a2023280200200f102720002802e0012218202328020022146a2019200f101e1a20232014200f6a22143602002015450db00141eb00212a0cbf010b2019100241ec00212a0cbe010b20002802e401211d200041086a41086a220f42003703002000420037030820182014200041086a1003200041286a41086a2219200f29030037030020002000290308370328200041286a411041d02d410041001000417f460daf0141ed00212a0cbd010b2000421037020c2000200041286a36020820004190026a200041086a10bd0120002802900222124106460daf0141ee00212a0cbc010b200041e0016a41286a202641286a280200360200200041e0016a41206a202641206a290200370300200041e0016a41186a202641186a290200370300200041e0016a41106a202641106a2902003703002023202641086a290200370300200020262902003703e001200f42003703002000420037030820182014200041086a10032019200f29030037030020002000290308370328200041286a411010050caf010b4106211241ef00212a0cba010b20004190026a41286a220f200041e0016a41286a2219280200360200200d200041e0016a41206a221429030037030020004190026a41186a2215200041e0016a41186a221b29030037030020004190026a41106a2221200041e0016a41106a222429030037030020042023290300370300200020002903e00137039002201d450dae0141f000212a0cb9010b2018100241f100212a0cb8010b20124106460dad0141f200212a0cb7010b2019200f2802003602002014200d290300370300201b2015290300370300202420212903003703002023200429030037030020002000290390023703e001200f2019280200360200200d20142903003703002015201b290300370300202120242903003703002004202329030037030020252000290348370200202541086a2017290300370200202541106a2016290300370200202541186a2011290300370200200020002903e0013703900220004190016a20004190026a41cc00101e1a412b212a0cb6010b20002802e402450d7d412c212a0cb5010b20021002412d212a0cb4010b20124106460d7c412e212a0cb3010b2020200029029001370200202041086a20004190016a41086a290200370200202041106a20004190016a41106a290200370200202041186a20004190016a41186a290200370200202041206a20004190016a41206a290200370200202041286a20004190016a41286a280200360200200020123602e001200041e8006a41186a2215202241186a290000370300200041e8006a41106a221b202241106a290000370300200041e8006a41086a2221202241086a29000037030020002022290000370368200041e0026a104720002802e00221242010280200221d41286c2217450d7c412f212a0cb2010b4100211441002119202421020c7c0b4102211120180d82010c81010b200d200229000037000020004190026a41186a201529030037030020004190026a41106a201b29030037030020004190026a41086a2021290300370300200d41086a200241086a290000370000200d41106a200241106a290000370000200d41186a200241186a2900003700002000200029036837039002410910012204450d7c4131212a0caf010b200020043602482000420937024c200041c8006a410041091027200041c8006a41086a22102010280200220441096a220f360200200420002802486a221141002900f922370000200041286a41086a2204200f360200201141086a41002d0081233a000020002000290348370328200041c8006a20004190026a10be01200028024c211820002802482111200041286a20042802002010280200220f102720002802282210200428020022166a2011200f101e1a20042016200f6a22163602002018450d7c4132212a0cae010b201110024133212a0cad010b200028022c2118200041086a41086a220f42003703002000420037030820102016200041086a10032004200f29030037030020002000290308370328200041286a411041d02d410041001000417f460d7b4134212a0cac010b200041003a0048200041286a4110200041c8006a41014100100041016a41014d0d7b4136212a0cab010b20002d00482111200f42003703002000420037030820102016200041086a10032004200f29030037030020002000290308370328200041286a411010052018450d7d4137212a0caa010b201010024138212a0ca9010b201141ff01714102460d7c4139212a0ca8010b201420114101716a211420192011417f734101716a2119413a212a0ca7010b200241286a2102201741586a22170d72413b212a0ca6010b201920146a210220002802e402450d7a413c212a0ca5010b20241002413d212a0ca4010b201d20026b210220124103470d7b41da00212a0ca3010b20002d00e40141ff01714102470d7b41db00212a0ca2010b20190d7e41dc00212a0ca1010b20020d7c41dd00212a0ca0010b202328020010460c790b2014200220196a4d0d7941d000212a0c9e010b410910012204450d810141d100212a0c9d010b2000200436029002200042093702940220004190026a41004109102720004190026a41086a22042004280200221041096a220f36020020102000280290026a2211410029009823370000200041c8006a41086a2210200f360200201141086a41002d00a0233a0000200020002903900237034841201001220f450d810141d200212a0c9c010b2000200f36029002200042203702940220004190026a41004120102720042004280200221141206a220f360200201120002802900222166a22112000290368370000201141086a2021290300370000201141106a201b290300370000201141186a20152903003700002000280294022117200041c8006a2010280200200f102720002802482211201028020022186a2016200f101e1a20102018200f6a220f3602002017450d810141d300212a0c9b010b2016100241d400212a0c9a010b200028024c2110200041286a41086a22164200370300200042003703282011200f200041286a1003200041086a41086a201629030037030020002000290328370308200041086a411010052010450d800141d500212a0c99010b2011100241d600212a0c98010b20022019720d7f41d800212a0c97010b20004190026a41286a200041e0016a41286a290300370300200d200041e0016a41206a29030037030020004190026a41186a200041e0016a41186a29030037030020004190026a41106a200041e0016a41106a29030037030020042023290300370300200020002903e0013703900220004190026a410110ba010c530b201241077122024103460d7341c000212a0c95010b20020d5241c100212a0c94010b20002802e4012202450d5441c200212a0c93010b20024101470d7141cc00212a0c92010b2029280200450d5341cd00212a0c91010b202328020010020c530b4100211941002114410041006a210220002802e4020d660c650b20002d00e4014101470d4d41cf00212a0c8e010b202310bf010c4d0b20232802002110200041e0016a41106a2802002202450d6c41c400212a0c8c010b200241186c21042010210241c500212a0c8b010b200241046a280200450d6c41c600212a0c8a010b2002280200100241c700212a0c89010b200241106a280200450d6b41c800212a0c88010b2002410c6a280200100241c900212a0c87010b200241186a2102200441686a22040d6741ca00212a0c86010b2029280200450d4941cb00212a0c85010b201010020c490b200041f0026a24000f0b200d417f6a210d41010d340c330b200d417f6a210d41010d310c300b200d417e6a210d41010d2e0c2d0b200d417d6a210d41010d2b0c2a0b200d417c6a210d41010d280c270b101c000b41c1214133102d000b1064000b1065000b4187254139102d000b41c1214133102d000b41c1214133102d000b41f316411c102d000b41b43820182024103c000b419201212a0c740b4101212a0c730b4100212a0c720b4102212a0c710b4104212a0c700b4107212a0c6f0b4107212a0c6e0b4107212a0c6d0b418a01212a0c6c0b4107212a0c6b0b4107212a0c6a0b4107212a0c690b4107212a0c680b4107212a0c670b419101212a0c660b4109212a0c650b4114212a0c640b410b212a0c630b4113212a0c620b4113212a0c610b41d900212a0c600b41d900212a0c5f0b4111212a0c5e0b4113212a0c5d0b4115212a0c5c0b41fd00212a0c5b0b41fb00212a0c5a0b4117212a0c590b41fa00212a0c580b4119212a0c570b411b212a0c560b411a212a0c550b411b212a0c540b411a212a0c530b411b212a0c520b411a212a0c510b411b212a0c500b411a212a0c4f0b411b212a0c4e0b411a212a0c4d0b411b212a0c4c0b411d212a0c4b0b411f212a0c4a0b41f900212a0c490b41f800212a0c480b4122212a0c470b4124212a0c460b4126212a0c450b4128212a0c440b4129212a0c430b4129212a0c420b4129212a0c410b4129212a0c400b4129212a0c3f0b4129212a0c3e0b4129212a0c3d0b4129212a0c3c0b4129212a0c3b0b4129212a0c3a0b412b212a0c390b412b212a0c380b412d212a0c370b41e000212a0c360b41df00212a0c350b4130212a0c340b4130212a0c330b41d900212a0c320b4133212a0c310b41de00212a0c300b4135212a0c2f0b4138212a0c2e0b4137212a0c2d0b4138212a0c2c0b413a212a0c2b0b413d212a0c2a0b413d212a0c290b413c212a0c280b413e212a0c270b413e212a0c260b413f212a0c250b413f212a0c240b413f212a0c230b413f212a0c220b41ce00212a0c210b41c300212a0c200b41ca00212a0c1f0b41c500212a0c1e0b41c700212a0c1d0b41c900212a0c1c0b41d900212a0c1b0b41d900212a0c1a0b41d400212a0c190b41d600212a0c180b41d700212a0c170b41d900212a0c160b41e600212a0c150b41d900212a0c140b41d900212a0c130b41f700212a0c120b41e300212a0c110b41f600212a0c100b41e800212a0c0f0b41ec00212a0c0e0b41f500212a0c0d0b41f400212a0c0c0b41ef00212a0c0b0b41f100212a0c0a0b41f300212a0c090b418001212a0c080b41ff00212a0c070b418301212a0c060b418201212a0c050b418601212a0c040b418501212a0c030b418901212a0c020b418801212a0c010b418d01212a0c000b0b41c1214133102d000b1057000b1056000b41f4214122102d000b41f4214122102d000b41be164135102d000b41c1214133102d000b200f20131055000b41c1214133102d000b41c1214133102d000b41c1214133102d000b41dcc1002004417f6a200d103c000b41ccc1002004200d103c000ba50c03047f017e177f23004180026b22012400200141b0016a41086a22024200370300200142003703b0014191264107200141b0016a1003200141086a2002290300370300200120012903b0013703000240024002400240024002402001411041d02d410041001000417f460d002001200136021020014110360214200141003602b0012001410020014110200141b0016a41044100100022022002417f461b2202410420024104491b2203360218200241034d0d0320012802b0012204ad42d8007e2205422088a70d052005a72202417f4c0d042002450d012002100122060d02101c000b200041003602082000420837020020014180026a24000f0b410821060b20012004360224200120063602202001410036022802402004450d0020014180016a41086a210720014180016a4104722108200121094100210a4110210b4100210c0340200141003602b001200141106a41086a220d41002009200b200141b0016a41042003100022022002417f461b2202410420024104491b20036a3602000240024002400240200241034d0d0020012802b001210e200141b0016a200141106a10bd0120012802b0014106460d0020014180016a41286a200141b0016a41286a220f29030037030020014180016a41206a200141b0016a41206a221029030037030020014180016a41186a2211200141b0016a41186a221229030037030020014180016a41106a2213200141b0016a41106a22142903003703002007200141b0016a41086a2215290300370300200120012903b00137038001200141e0016a41186a22164200370300200141e0016a41106a22174200370300200141e0016a41086a22184200370300200142003703e001200d200d28020022024100200128021022092001280214220b200141e0016a41202002100022022002417f461b2202412020024120491b6a220336020002402002411f4d0d00200141306a41186a22022016290300370300200141306a41106a220d2017290300370300200141306a41086a22162018290300370300200120012903e001370330200141d0006a41086a2217200841086a290200370300200141d0006a41106a2218200841106a290200370300200141d0006a41186a2219200841186a290200370300200141d0006a41206a221a200841206a290200370300200141d0006a41286a221b200841286a28020036020020012008290200370350200128028001221c4106460d01200c41016a210c200f201b2802003602002010201a290300370300201220192903003703002014201829030037030020152017290300370300200720162903003703002013200d29030037030020112002290300370300200120012903503703b0012001200129033037038001200a2001280224470d04200141206a1074200141206a41086a280200210a200128022021060c040b0240024020012802800122024103460d0020020d022001280284012202450d0220024101470d012001418c016a280200450d0220014188016a280200100220012802202103200a0d030c040b20012d0084014101470d012007104b20012802202103200a0d020c030b20014188016a2802002103024020014180016a41106a2802002202450d00200241186c21082003210203400240200241046a280200450d00200228020010020b0240200241106a280200450d002002410c6a28020010020b200241186a2102200841686a22080d000b0b2001418c016a280200450d00200310020b20012802202103200a450d010b200a41d8006c210820032102034020021038200241d8006a2102200841a87f6a22080d000b0b2001280224450d03200310020c030b2006200a41d8006c6a2202201c3602002002411c6a2012290300370200200241146a20142903003702002002410c6a2015290300370200200220012903b001370204200241246a20102903003702002002412c6a200f2802003602002002200e36023020022001290380013702342002413c6a2007290300370200200241c4006a2013290300370200200241cc006a2011290300370200200141206a41086a200a41016a220a360200200c2004490d000b200128022021060b2006450d00200020012902243702042000200636020020014180026a24000f0b41c1214133102d000b1059000b1058000b8d0402057f017e230041c0006b220224000240024002400240410810012203450d002002200336023020024208370234200241306a4100410810272002280230200228023822036a42e4cab5d3c3ac99b83a3700002002200341086a360238200241086a200228023836020020022002290330370300410410012203450d002002200336023020024204370234200241306a41004104102720022802302203200228023822046a20013600002002200441046a220136023820022802342105200220022802082001102720022802002204200228020822066a20032001101e1a2002200620016a220136020802402005450d00200310020b20022802042103200241306a41086a220542003703002002420037033020042001200241306a1003200241086a20052903003703002002200229033037030002402002411041d02d410041001000417f460d002002200236021020024110360214200242003703302002410020024110200241306a41084100100022012001417f461b2201410820014108491b360218200141074d0d0220022903302107200241306a200241106a103a20022802302201450d022002200229023437032020002001360208200020073703002000200229032037020c200041146a200241286a2802003602002003450d040c030b2000410036020820030d020c030b101c000b41c1214133102d000b200410020b200241c0006a24000bda0101027f0240024020002802002201450d0020014103470d0120002d00044101470d01200041086a22012802001038200128020010020f0b20002802042201450d00024020014101470d002000410c6a280200450d01200041086a28020010020f0b0240200041106a2802002202450d00200041086a2802002101200241186c210203400240200141046a280200450d00200128020010020b0240200141106a280200450d002001410c6a28020010020b200141186a2101200241686a22020d000b0b2000410c6a280200450d00200041086a28020010020f0b0b0a00200020012002100b0bc80403067f017e097f230041d0006b220224002002410036023020012001280208220341002001280200220420012802042205200241306a41042003100022032003417f461b2203410420034104491b6a220636020802400240024002400240200341034d0d0020022802302207ad2208421b88a70d042008420586a72203417f4c0d032003450d012003100122090d02101c000b20004100360200200241d0006a24000f0b410121090b20022007360204200220093602002002410036020802402007450d00200241306a41186a210a200241306a41106a210b410021034100210c0340200a4200370300200b4200370300200241306a41086a220d420037030020024200370330200141086a410020042005200241306a412020061000220e200e417f461b220e4120200e4120491b20066a220636020002400240200e411f4d0d00200c41016a210c200241106a41186a220f200a290300370300200241106a41106a2210200b290300370300200241106a41086a2211200d2903003703002002200229033037031020032002280204470d012002107c200241086a2802002103200228020021090c010b2000410036020002402002280204450d00200910020b200241d0006a24000f0b200920034105746a220e2002290310370000200e41186a200f290300370000200e41106a2010290300370000200e41086a2011290300370000200241086a200341016a2203360200200c2007490d000b0b20002002290300370200200041086a200241086a280200360200200241d0006a24000f0b1067000b1066000b2c02017f017e230041106b2201240020002902102102200120002902083703002001200237030820011054000b070020001054000bab0303017f017e047f230041306b220224002000104321030240410810012204450d002002200436022020024208370224200241206a4100410810272002280220200228022822046a42f3e885d3a3ac98b63a3700002002200441086a360228200241106a41086a200228022836020020022002290320370310412010012204450d00200320017c21012002200436022020024220370224200241206a41004120102720022802202205200228022822066a22042000290000370000200441086a200041086a290000370000200441106a200041106a290000370000200441186a200041186a2900003700002002200641206a220036022820022802242106200241106a20022802182000102720022802102204200228021822076a20052000101e1a2002200720006a220036021802402006450d00200510020b2002280214210520022001370308200241206a41086a220642003703002002420037032020042000200241206a1003200241106a41086a200629030037030020022002290320370310200241106a4110200241086a4108100402402005450d00200410020b200241306a24000f0b101c000bcb0501097f230041306b22012400200041086a28020021022001410036022820014201370320200141206a4100410410272001280220200128022822036a20023600002001200341046a360228200141086a220420012802283602002001200129032037030002400240024002402002450d0020002802002100200241d8006c21050340200141106a41086a2203410036020020014201370310200041306a2802002102200141106a41004104102720032003280200220641046a2207360200200620012802106a2002360000200141206a200010d80120012802202108200141106a2007200141206a41086a22062802002202102720032002200328020022076a2209360200200720012802106a20082002101e1a02402001280224450d00200810020b200141106a20094120102720032003280200220741206a22023602002007200128021022086a220341086a2000413c6a290000370000200341106a200041c4006a290000370000200341186a200041cc006a2900003700002003200041346a2900003700002002417f4c0d03024002402002450d002002100122030d010c060b410121030b200641003602002001200236022420012003360220200141206a41002002102720062006280200220720026a22033602002007200128022022066a20082002101e1a2001280224210202402001280214450d00200810020b200120042802002003102720012802002207200428020022086a20062003101e1a2004200820036a220336020002402002450d00200610020b200041d8006a2100200541a87f6a22050d000c020b0b20012802082103200128020021070b20012802042100200141206a41086a22024200370300200142003703204191264107200141206a1003200141106a41086a200229030037030020012001290320370310200141106a411020072003100402402000450d00200710020b200141306a24000f0b1019000b101c000be50c03037f017e047f230041a0016b22032400200341086a220442003703002003420037030041852741072003100320034180016a41086a200429030037030020032003290300370380010240024020034180016a411041d02d410041001000417f460d00200341003602400240024020034180016a4110200341c0006a41044100100041016a41044d0d00024020032802402205450d0020032005417f6a104020032802084106460d00200341c0006a41086a2204200341086a290300370300200341c0006a41386a200341386a290300370300200341c0006a41306a200341306a290300370300200341c0006a41286a200341286a290300370300200341c0006a41206a200341206a290300370300200341c0006a41186a200341186a290300370300200341c0006a41106a200341106a290300370300200320032903002206370340024002400240200428020022044103460d0020040d02200341cc006a2802002204450d0220044101470d01200341d4006a280200450d02200341d0006a280200100220062000580d030c070b200341cc006a2d00004101470d01200341d0006a102220062000580d020c060b200341c0006a41106a28020021070240200341c0006a41186a2802002204450d00200441186c21082007210403400240200441046a280200450d00200428020010020b0240200441106a280200450d002004410c6a28020010020b200441186a2104200841686a22080d000b0b200341d4006a280200450d00200710020b20062000560d040b2003200541016a360240200341086a220442003703002003420037030041852741072003100320034180016a41086a22082004290300370300200320032903003703800120034180016a4110200341c0006a41041004200341c0006a41106a200141086a290300370300200341c0006a41186a200141106a290300370300200341c0006a41206a200141186a290300370300200341c0006a41286a200141206a290300370300200341f0006a200141286a29030037030020032000370340200320023a007820032001290300370348410810012201450d01200320013602002003420837020420034100410810272003280200200328020822016a42e4cab5d383cedcb73a3700002003200141086a360208200820032802083602002003200329030037038001410410012201450d01200341c0006a41086a21022003200136020020034204370204200341004104102720032802002204200328020822016a20053600002003200141046a22013602082003280204210820034180016a20032802880120011027200328028001220520032802880122076a20042001101e1a2003200720016a22073602880102402008450d00200410020b200328028401210841002104200341003602980120034201370390012003290340210020034190016a41004108102720032802900120032802980122016a20003700002003200141086a2209360298012003200210d8012003280200210220034190016a20092003280208220110272003200120032802980122096a220a3602980120092003280290016a20022001101e1a02402003280204450d00200210020b02400240200341f8006a2d000022014103714102460d0020014101470d01410121040c010b410221040b20034190016a200a4101102720034190016a41086a22012001280200220241016a2209360200200220032802900122016a20043a0000200341086a2204420037030020034200370300200520072003100320034180016a41086a2004290300370300200320032903003703800120034180016a41102001200910040240200328029401450d00200110020b02402008450d00200510020b024002400240200328024822014103460d0020010d02200341cc006a2802002201450d0220014101470d01200341d4006a280200450d02200341d0006a2802001002200341a0016a24000f0b200341cc006a2d00004101470d01200341d0006a1022200341a0016a24000f0b0240200341c0006a41186a2802002204450d00200341c0006a41106a2802002101200441186c210403400240200141046a280200450d00200128020010020b0240200141106a280200450d002001410c6a28020010020b200141186a2101200441686a22040d000b0b200341d4006a280200450d00200341d0006a28020010020b200341a0016a24000f0b41c1214133102d000b101c000b41f4214122102d000b4184c000103b000b810a03057f017e067f230041c0016b220224000240024002400240410810012203450d002002200336029001200242083702940120024190016a41004108102720022802900120022802980122036a42e4cab5d383cedcb73a3700002002200341086a36029801200241e0006a41086a2002280298013602002002200229039001370360410410012203450d002002200336029001200242043702940120024190016a410041041027200228029001220320022802980122046a20013600002002200441046a2201360298012002280294012105200241e0006a20022802682001102720022802602204200228026822066a20032001101e1a2002200620016a220136026802402005450d00200310020b2002280264210520024190016a41086a2203420037030020024200370390012004200120024190016a1003200241086a41086a20032903003703002002200229039001370308024002400240200241086a411041d02d410041001000417f460d002002200241086a3602182002411036021c200242003703900120024100200241086a411020024190016a41084100100022012001417f461b2201410820014108491b360220200141074d0d06200229039001210720024190016a200241186a10bd012002280290014106460d06200241e0006a41286a20024190016a41286a290300370300200241e0006a41206a20024190016a41206a290300370300200241e0006a41186a20024190016a41186a290300370300200241e0006a41106a20024190016a41106a290300370300200241e0006a41086a20024190016a41086a2903003703002002200229039001370360200241003a0030200241186a41086a2201200128020022012002280218200228021c200241306a41012001100041016a220141014b6a360200024020014102490d0020022d0030220141034f0d00200241386a2206200241ec006a290200370300200241c0006a2208200241e0006a41146a290200370300200241c8006a2209200241e0006a411c6a290200370300200241d0006a220a200241e0006a41246a290200370300200241d8006a220b200241e0006a412c6a2802003602002002200229026437033020022802602103200241286a41066a220c200241e0006a41066a2d00003a0000200241286a41046a220d200241e0006a41046a2f00003b01002002200228006036022820034106460d0720002003360208200020073703002000200229033037020c20002002280228360039200041386a20013a0000200041146a20062903003702002000411c6a2008290300370200200041246a20092903003702002000412c6a200a290300370200200041346a200b2802003602002000413d6a200d2f01003b00002000413f6a200c2d00003a000020050d020c030b200228026022010d0420022802642201450d0620014101460d05200241e8006a28020021030240200241e0006a41106a2802002201450d00200141186c21002003210103400240200141046a280200450d00200128020010020b0240200141106a280200450d002001410c6a28020010020b200141186a2101200041686a22000d000b0b200241ec006a280200450d06200310020c060b200041063602082005450d010b200410020b200241c0016a24000f0b101c000b20014103470d0120022d00644101470d01200241e8006a104b41c1214133102d000b200241ec006a280200450d00200241e8006a280200100241c1214133102d000b41c1214133102d000b080041fc31103b000b960201057f230041206b220224000240410810012203450d002002200336021020024208370214200241106a4100410810272002280210200228021822036a42e4cab5d3e38e9db93a3700002002200341086a360218200241086a200228021836020020022002290310370300410410012203450d002002200336021020024204370214200241106a41004104102720022802102203200228021822046a20013600002002200441046a220136021820022802142105200220022802082001102720022802002204200228020822066a20032001101e1a2002200620016a220136020802402005450d00200310020b2002280204210320002004200110da0102402003450d00200410020b200241206a24000f0b101c000bc70302057f017e230041206b220124000240410810012202450d002001200236021020014208370214200141106a4100410810272001280210200128021822026a42f3e885d3a3ac98b63a3700002001200241086a360218200141086a200128021836020020012001290310370300412010012202450d002001200236021020014220370214200141106a41004120102720012802102203200128021822046a22022000290000370000200241086a200041086a290000370000200241106a200041106a290000370000200241186a200041186a2900003700002001200441206a220036021820012802142104200120012802082000102720012802002202200128020822056a20032000101e1a2001200520006a220036020802402004450d00200310020b2001280204210342002106200141106a41086a220442003703002001420037031020022000200141106a1003200141086a200429030037030020012001290310370300024002402001411041d02d410041001000417f460d002001420037031020014110200141106a41084100100041016a41084d0d01200129031021060b02402003450d00200210020b200141206a240020060f0b41c1214133102d000b101c000bc70302057f017e230041206b220124000240410810012202450d002001200236021020014208370214200141106a4100410810272001280210200128021822026a42f3e885d3c3cdd8b73a3700002001200241086a360218200141086a200128021836020020012001290310370300412010012202450d002001200236021020014220370214200141106a41004120102720012802102203200128021822046a22022000290000370000200241086a200041086a290000370000200241106a200041106a290000370000200241186a200041186a2900003700002001200441206a220036021820012802142104200120012802082000102720012802002202200128020822056a20032000101e1a2001200520006a220036020802402004450d00200310020b2001280204210342002106200141106a41086a220442003703002001420037031020022000200141106a1003200141086a200429030037030020012001290310370300024002402001411041d02d410041001000417f460d002001420037031020014110200141106a41084100100041016a41084d0d01200129031021060b02402003450d00200210020b200141206a240020060f0b41c1214133102d000b101c000bb80201047f230041206b2202240020024100360208200242013703002001280200210320024100410410272002280200200228020822046a20033600002002200441046a2203360208200220034120102720022802002204200228020822056a22032001290004370000200341086a2001410c6a290000370000200341106a200141146a290000370000200341186a2001411c6a2900003700002002200541206a220136020802402001417f4c0d00024002402001450d002001100122030d01101c000b410121030b200220013602142002200336021020024100360218200241106a41002001102720022002280218220320016a360218200320022802106a20042001101e1a200041086a20022802183602002000200229031037020002402002280204450d00200410020b200241206a24000f0b1019000bc808010d7f230041d0006b220124000240410810012202450d00200120023602082001420837020c200141086a4100410810272001280208200128021022026a42e4cab5d383cedcb73a3700002001200241086a360210200141c0006a41086a200128021036020020012001290308370340410410012202450d00200120023602082001420437020c200141086a41004104102720012802082203200128021022026a20003600002001200241046a2202360210200128020c2104200141c0006a20012802482002102720012802402205200128024822066a20032002101e1a2001200620026a220236024802402004450d00200310020b20012802442103200141c0006a41086a220442003703002001420037034020052002200141c0006a1003200141306a41086a200429030037030020012001290340370330200141306a4110100502402003450d00200510020b410810012202450d00200120023602082001420837020c200141086a4100410810272001280208200128021022026a42e4cab5d3e38e9db93a3700002001200241086a360210200141c0006a41086a200128021036020020012001290308370340410410012202450d00200120023602082001420437020c200141086a41004104102720012802082203200128021022026a20003600002001200241046a2202360210200128020c2104200141c0006a20012802482002102720012802402205200128024822066a20032002101e1a2001200620026a220236024802402004450d00200310020b20012802442103200141c0006a41086a220442003703002001420037034020052002200141c0006a1003200141306a41086a200429030037030020012001290340370330200141306a4110100502402003450d00200510020b200141086a20001042200128020c210720012802082108024020012802102202450d0020024105742109200141086a410472210420082102034020042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a29000037000020012000360208410810012203450d022001200336024020014208370244200141c0006a410041081027200141c0006a41086a22032003280200220541086a360200200520012802406a42e4cab5d3e3ee9bba3a370000200141306a41086a2205200328020036020020012001290340370330200141c0006a200141086a10452001280244210a2001280240210b200141306a20052802002003280200220610272001280230220c2005280200220d6a200b2006101e1a2005200d20066a22063602000240200a450d00200b10020b2001280234210b2003420037030020014200370340200c2006200141c0006a10032005200329030037030020012001290340370330200141306a411010050240200b450d00200c10020b200241206a2102200941606a22090d000b0b02402007450d00200810020b200141d0006a24000f0b101c000b810604047f017e097f037e230041e0006b22012400200141c0006a41086a220242003703002001420037034041c7114107200141c0006a1003200141086a2002290300370300200120012903403703000240024002400240024002402001411041d02d410041001000417f460d0020014100360240410020014110200141c0006a41044100100022022002417f461b220341034d0d0320012802402204ad42287e2205422088a70d042005a72202417f4c0d052002450d012002100122060d02101c000b2000410036020820004208370200200141e0006a24000f0b410821060b200120043602142001200636021020014100360218024002402004450d002003410420034104491b2107200141c0006a41186a2108200141c0006a41086a2109410021034100210a034020084200370300200141c0006a41106a220b42003703002009420037030020014200370340410020014110200141c0006a41202007100022022002417f461b2202411f4d0d02200141206a41186a220c2008290300370300200141206a41106a220d200b290300370300200141206a41086a220e20092903003703002001200129034037032020014200370340410020014110200141c0006a41082002412020024120491b20076a2207100022022002417f461b220241074d0d02200a41016a210a2002410820024108491b2102200129034021052008200c290300370300200b200d2903003703002009200e29030037030020012001290320370340024020032001280214470d00200141106a1078200141106a41086a2802002103200128021021060b200220076a21072006200341286c6a220220012903403703002009290300210f200b29030021102008290300211120022005370320200241186a2011370300200241106a2010370300200241086a200f370300200141106a41086a200341016a2203360200200a2004490d000b200128021021060b2006450d012000200129021437020420002006360200200141e0006a24000f0b2001280214450d00200610020b41c1214133102d000b1056000b1057000bf81505037f017e087f017e047f230041f0006b22002400200041086a41086a220142003703002000420037030841c81d4107200041086a1003200041d0006a41086a200129030037030020002000290308370350024002400240024002400240200041d0006a411041d02d410041001000417f460d00200042003703080240024002400240200041d0006a4110200041086a41084100100041016a41084d0d002000200029030842017c370340200041086a41086a220142003703002000420037030841c81d4107200041086a1003200041d0006a41086a2202200129030037030020002000290308370350200041d0006a4110200041c0006a41081004200142003703002000420037030841cf1d4107200041086a100320022001290300370300200020002903083703500240200041d0006a411041d02d410041001000417f460d0020004200370308200041d0006a4110200041086a41084100100041016a41084d0d02200020002903082203370330200041086a41086a220142003703002000420037030841c11d4107200041086a1003200041d0006a41086a200129030037030020002000290308370350200041d0006a411041d02d410041001000417f460d0920004200370308200041d0006a4110200041086a41084100100041016a41084d0d0320032000290308510d0020002003370340200041086a41086a220142003703002000420037030841c11d4107200041086a1003200041d0006a41086a2202200129030037030020002000290308370350200041d0006a4110200041c0006a410810042000102e370340200142003703002000420037030841ba1d4107200041086a10032002200129030037030020002000290308370350200041d0006a4110200041c0006a410810040b200041086a41086a220142003703002000420037030841d61d4108200041086a1003200041d0006a41086a2001290300370300200020002903083703504100210102400240200041d0006a411041d02d410041001000417f460d00200042103702442000200041d0006a360240200041086a200041c0006a103a20002802082204450d0b200041106a2802002101200028020c21050c010b41012104410021050b2000410036024820004208370340200041c0006a20014105742206410575108501200028024821022000280240210702402006450d002007200241286c6a21012002200641606a4105766a2108200421020340200041086a41186a2209200241186a290000370300200041086a41106a220a200241106a290000370300200041086a41086a220b200241086a29000037030020002002290000370308200041086a10432103200041086a1044210c200041d0006a41186a220d2009290300370300200041d0006a41106a2209200a290300370300200041d0006a41086a220a200b290300370300200020002903083703502001200c20037c370300200141206a200d290300370300200141186a2009290300370300200141106a200a290300370300200141086a2000290350370300200141286a2101200241206a2102200641606a22060d000b200841016a21020b02402005450d00200410020b200041c0006a41086a20023602002000280244210820072002410041202002676b10c401200041086a41086a220142003703002000420037030841de1d4107200041086a1003200041d0006a41086a200129030037030020002000290308370350200041d0006a411041d02d410041001000417f460d0520004100360208200041d0006a4110200041086a41044100100041016a41044d0d032000280208210b2000410036024820004201370340200041c0006a4100200241286c220941286d2201200b2001200b491b1086012000280248210a2000280240210e0240200b450d00200e200a4105746a2102200041086a41086a21062007210103402009450d01200041086a41206a200141206a290300370300200041086a41186a200141186a290300370300200041086a41106a200141106a2903003703002006200141086a290300370300200041d0006a41086a220d200641086a290000370300200041d0006a41106a2204200641106a290000370300200041d0006a41186a2205200641186a2900003703002000200129030037030820002006290000370350200241186a2005290300370000200241106a2004290300370000200241086a200d29030037000020022000290350370000200941586a2109200a41016a210a200241206a2102200141286a2101200b417f6a220b0d000b0b02402008450d00200710020b200041c8006a200a360200200aad2203421b88a70d062003420586a72201417f4c0d072000280244210f024002402001450d002001100122010d01101c000b410121010b2000200a36020c2000200136020820004100360210200041086a4100200a108601200020002802102201200a6a360210200028020820014105746a200e200a4105742202101e1a200041306a41086a200028021036020020002000290308370330200041c0006a200041306a10a2012000280248210620002802402101200041086a41086a220942003703002000420037030841e4084107200041086a1003200041d0006a41086a200929030037030020002000290308370350200041d0006a411020012006100402402000280244450d00200110020b02402000280234450d00200028023010020b410021062000410036024820004201370340200041c0006a4100200241057510860120002802482101200028024021100240200a4105742209450d00200041086a41186a220a200e41186a290000370300200041086a41106a220b200e41106a290000370300200041086a41086a220d200e41086a2900003703002000200e290000370308200141016a2104200e41206a2102200941606a2109201020014105746a210102400340200041d0006a41186a2205200a290300370300200041d0006a41106a2207200b290300370300200041d0006a41086a2208200d29030037030020002000290308370350200141186a2005290300370000200141106a2007290300370000200141086a2008290300370000200120002903503700002009450d01200a200241186a290000370300200b200241106a290000370300200d200241086a29000037030020002002290000370308200441016a2104200241206a2102200941606a2109200141206a21010c000b0b200421010b200041c0006a41086a20013602002000280244210d02402001450d002001410574210241002106200041086a41086a210a201021010340200041086a2006103220002802082209200a2802002001412010040240200028020c450d00200910020b200141206a2101200641016a2106200241606a22020d000b0b200041086a10302000280208220120002802101031210b0240200028020c450d00200110020b0240200b20064d0d00200041106a210a200621010340200041086a103020002802082202200a280200103121090240200028020c450d00200210020b200141016a21020240200920014d0d00200041086a2001103220002802082201200a2802001005200028020c450d00200110020b20022101200b2002470d000b0b200041086a103020002802102102200028020821012000200636025020012002200041d0006a410410040240200028020c450d00200110020b0240200d450d00201010020b0240200f450d00200e10020b200041f0006a24000f0b41c1214133102d000b41c1214133102d000b41c1214133102d000b41c1214133102d000b41f4214122102d000b41f4214122102d000b1066000b1067000b41f4214122102d000b41c1214133102d000bba0103027f017e017f024002400240200041046a280200220320016b20024f0d00200120026a220220014922010d01200341017422044100200220011b2201200420014b1b2204ad42287e2205a722014100480d012005422088a74100470d01024002402003450d0020002802002106200110012202450d04200220062001200341286c2203200320014b1b101e1a200610020c010b200110012202450d030b20002002360200200041046a20043602000b0f0b1041000b101c000bf40403067f017e027f230041306b22012400200041086a28020021022001410036022820014201370320200141206a4100410410272001280220200128022822036a20023600002001200341046a360228200141086a220420012802283602002001200129032037030002400240024002402002450d0020002802002200200241286c6a21050340200141106a41086a2203410036020020014201370310200141106a41004120102720032003280200220241206a2206360200200220012802106a220241186a200041186a290000370000200241106a200041106a290000370000200241086a200041086a29000037000020022000290000370000200041206a2903002107200141106a20064108102720032003280200220641086a22023602002006200128021022086a20073700002002417f4c0d03024002402002450d002002100122030d010c060b410121030b200141206a41086a220641003602002001200236022420012003360220200141206a41002002102720062006280200220920026a22033602002009200128022022066a20082002101e1a2001280224210202402001280214450d00200810020b200120042802002003102720012802002209200428020022086a20062003101e1a2004200820036a220336020002402002450d00200610020b200041286a22002005470d000c020b0b20012802082103200128020021090b20012802042102200141206a41086a220042003703002001420037032041c7114107200141206a1003200141106a41086a200029030037030020012001290320370310200141106a411020092003100402402002450d00200910020b200141306a24000f0b1019000b101c000be60101037f0240024002402000280200220128020022024103460d0020020d0220012802042202450d0220024101470d012001410c6a280200450d02200141086a2802001002200028020010020f0b20012d00044101470d01200141086a104b200028020010020f0b0240200141106a2802002203450d00200141086a2802002102200341186c210303400240200241046a280200450d00200228020010020b0240200241106a280200450d002002410c6a28020010020b200241186a2102200341686a22030d000b0b2001410c6a280200450d00200141086a28020010020b200028020010020bd60403047f017e087f230041c0006b2203240020024103742104410021050240024002400240024002402002450d0020044103752206ad4202862207a722084100480d042007422088a74100470d04200810012209450d05200120046a220a2001460d010c020b4104210941002106200120046a220a2001470d010b4101210c410021040c010b20024103742108200a41786a210b410021022009210403402004200120026a41046a280200360200200441046a21042008200241086a2202470d000b200b20016b41037641016a21054101210c410021044100210803402001280200210d0240024002402004200822026b200141046a280200220b4f0d002002200b6a22082002490d052004410174220e20082008200e491b220e4100480d052004450d01200e1001220f450d06200f200c200e20042004200e4b1b101e210f200c1002200e2104200f210c0c020b2002200b6a21080c010b200e2104200e1001220c450d040b200c20026a200d200b101e1a200141086a2201200a470d000b0b200341206a41186a22014200370300200341206a41106a22024200370300200341206a41086a2208420037030020034200370320200c20092005200341206a1007200341186a2001290300370300200341106a2002290300370300200341086a20082903003703002003200329032037030002402004450d00200c10020b02402006450d00200910020b20002003290300370000200041186a200341186a290300370000200041106a200341106a290300370000200041086a200341086a290300370000200341c0006a24000f0b1041000b101c000b14002006200710082008ad10092009ad100900000b0b0041e70a4122100800000b7901047f0240024002400240200041046a2802002201450d002001418080808004710d03200028020021022001410174220310012204450d022004200220032001200120034b1b101e1a200210020c010b410410012204450d01410421030b20002004360200200041046a20033602000f0b101c000b1050000b05001041000ba60101047f200141086a28020021024104210302400240410410012204450d002004200236000020012802002105024002402002450d00200241046a22032002490d0320034108200341084b1b22034100480d03200310012201450d02200120042003410420034104491b101e1a200410020c010b200421010b200141046a20052002101e1a20002003360204200020013602002000200241046a3602080f0b101c000b1041000b0600200010010b0600200010020b2500200020002000200020002000200028020020002802042000280208200028020c104d000b080041a4321054000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b05001041000b830101057f410421010240024002400240200041046a2802002202450d00200241d0006c2201417f4c0d0320002802002103200110012204450d02200420032001200241286c2205200520014b1b101e1a20031002200241017421010c010b41a00110012204450d010b20002004360200200041046a20013602000f0b101c000b1069000b05001041000b850101057f410421010240024002400240200041046a2802002202450d0020024180808010710d03200028020021012002410674220310012204450d0220042001200320024105742205200520034b1b101e1a20011002200241017421010c010b41800110012204450d010b20002004360200200041046a20013602000f0b101c000b106b000b05001041000b840101057f410421010240024002400240200041046a2802002202450d0020024180066c2201417f4c0d0320002802002103200110012204450d0220042003200120024180036c2205200520014b1b101e1a20031002200241017421010c010b41800c10012204450d010b20002004360200200041046a20013602000f0b101c000b106d000b05001041000b05001041000b830101057f410421010240024002400240200041046a2802002202450d00200241d0006c2201417f4c0d0320002802002103200110012204450d02200420032001200241286c2205200520014b1b101e1a20031002200241017421010c010b41a00110012204450d010b20002004360200200041046a20013602000f0b101c000b1070000b05001041000b850101057f410421010240024002400240200041046a2802002202450d00200241808080c000710d03200028020021012002410474220310012204450d0220042001200320024103742205200520034b1b101e1a20011002200241017421010c010b412010012204450d010b20002004360200200041046a20013602000f0b101c000b1072000b05001041000b05001041000b840101057f410421010240024002400240200041046a2802002202450d00200241b0016c2201417f4c0d0320002802002103200110012204450d02200420032001200241d8006c2205200520014b1b101e1a20031002200241017421010c010b41e00210012204450d010b20002004360200200041046a20013602000f0b101c000b1075000b05001041000b820101057f410421010240024002400240200041046a2802002202450d00200241306c2201417f4c0d0320002802002103200110012204450d02200420032001200241186c2205200520014b1b101e1a20031002200241017421010c010b41e00010012204450d010b20002004360200200041046a20013602000f0b101c000b1077000b05001041000b830101057f410421010240024002400240200041046a2802002202450d00200241d0006c2201417f4c0d0320002802002103200110012204450d02200420032001200241286c2205200520014b1b101e1a20031002200241017421010c010b41a00110012204450d010b20002004360200200041046a20013602000f0b101c000b1079000b05001041000b850101057f410421010240024002400240200041046a2802002202450d00200241808080c000710d03200028020021012002410474220310012204450d0220042001200320024103742205200520034b1b101e1a20011002200241017421010c010b412010012204450d010b20002004360200200041046a20013602000f0b101c000b107b000b05001041000b850101057f0240024002400240200041046a2802002201450d0020014180808010710d03200028020021022001410674220310012204450d0220042002200320014105742205200520034b1b101e1a20021002200141017421010c010b41800110012204450d01410421010b20002004360200200041046a20013602000f0b101c000b107d000b05001041000b7901047f0240024002400240200041046a2802002201450d002001418080808004710d03200028020021022001410174220310012204450d022004200220032001200120034b1b101e1a200210020c010b410410012204450d01410421030b20002004360200200041046a20033602000f0b101c000b107f000b05001041000b860101057f410421010240024002400240200041046a2802002202450d0020024180808020710d03200028020021012002410574220310012204450d0220042001200320024104742205200520034b1b101e1a20011002200241017421010c010b41c00010012204450d010b20002004360200200041046a20013602000f0b101c000b108101000b05001041000bba0103027f017e017f024002400240200041046a280200220320016b20024f0d00200120026a220220014922010d01200341017422044100200220011b2201200420014b1b2204ad42287e2205a722014100480d012005422088a74100470d01024002402003450d0020002802002106200110012202450d04200220062001200341286c2203200320014b1b101e1a200610020c010b200110012202450d030b20002002360200200041046a20043602000b0f0b1041000b101c000bba0103027f017e017f024002400240200041046a280200220320016b20024f0d00200120026a220220014922010d01200341017422044100200220011b2201200420014b1b2204ad42187e2205a722014100480d012005422088a74100470d01024002402003450d0020002802002106200110012202450d04200220062001200341186c2203200320014b1b101e1a200610020c010b200110012202450d030b20002002360200200041046a20043602000b0f0b1041000b101c000ba20103037f017e017f024002400240200041046a280200220220014f0d00200241017422032001200320014b1b2204ad420c7e2205a722014100480d012005422088a74100470d01024002402002450d0020002802002106200110012203450d042003200620012002410c6c2202200220014b1b101e1a200610020c010b200110012203450d030b20002003360200200041046a20043602000b0f0b1041000b101c000ba20103037f017e017f024002400240200041046a280200220220014f0d00200241017422032001200320014b1b2204ad42287e2205a722014100480d012005422088a74100470d01024002402002450d0020002802002106200110012203450d04200320062001200241286c2202200220014b1b101e1a200610020c010b200110012203450d030b20002003360200200041046a20043602000b0f0b1041000b101c000bba0103027f017e017f024002400240200041046a280200220320016b20024f0d00200120026a220220014922010d01200341017422044100200220011b2201200420014b1b2204ad4205862205a722014100480d012005422088a74100470d01024002402003450d0020002802002106200110012202450d0420022006200120034105742203200320014b1b101e1a200610020c010b200110012202450d030b20002002360200200041046a20043602000b0f0b1041000b101c000b0e0002402001450d00200010020b0bc00d010f7f230041e0066b220424000240200128020422052f01be032206410a4b0d00200441a8036a41206a2207200341206a290300370300200441a8036a41186a2208200341186a290300370300200441a8036a41106a2209200341106a290300370300200441a8036a41086a220a200341086a290300370300200420032903003703a8032005200128020c220b4105746a220341e0036a200341c0036a220c2006200b6b41057410391a200341d8036a200241186a290000370000200341d0036a200241106a290000370000200341c8036a200241086a290000370000200c20022900003700002005200b41286c6a220341286a2003200541be036a22052f0100200b6b41286c10391a200341206a2007290300370300200341186a2008290300370300200341106a2009290300370300200341086a200a290300370300200320042903a803370300200520052f010041016a3b0100200441b3036a200141086a280000360000200041003a000020002003360260200041106a200128020c360000200420012900003700ab03200020042900a803370001200041086a200441af036a290000370000200441e0066a24000f0b2001280208210d2001280200210e024041a0061001220b450d00200b200441a8036a41b803101e220b41003b01be03200b41003602b803200b41c0036a200441c8006a41e002101e210f200441286a41186a220c20054198056a290200370300200441286a41106a221020054190056a290200370300200441286a41086a221120054188056a290200370300200441a8036a41086a2206200541f8016a290300370300200441a8036a41106a220720054180026a290300370300200441a8036a41186a220820054188026a290300370300200441a8036a41206a220920054190026a290300370300200420054180056a290200370328200420052903f0013703a803200f200541a0056a200541be036a220a2f010041796a2212410574101e210f200b20054198026a201241286c101e210b200a41063b0100200b20123b01be03200441186a200c290300370300200441106a2010290300370300200441086a201129030037030020042004290328370300200441c8006a41206a2009290300370300200441c8006a41186a2008290300370300200441c8006a41106a2007290300370300200441c8006a41086a2006290300370300200420042903a803370348200441003602242004200b36022002400240200128020c220141064b0d002009200341206a2903003703002008200341186a2903003703002007200341106a2903003703002006200341086a290300370300200420032903003703a803200520014105746a220341e0036a200341c0036a220b200a2f010020016b41057410391a200341d8036a200241186a290000370000200341d0036a200241106a290000370000200341c8036a200241086a290000370000200b20022900003700002005200141286c6a220341286a2003200a2f010020016b41286c10391a200341206a2009290300370300200341186a2008290300370300200341106a2007290300370300200341086a2006290300370300200320042903a803370300200a200a2f010041016a3b01000c010b200c200241186a2900003703002010200241106a2900003703002011200241086a290000370300200420022900003703282009200341206a2903003703002008200341186a2903003703002007200341106a2903003703002006200341086a290300370300200420032903003703a803200f20014105746a41c07e6a200f200141796a22024105746a2203200b2f01be0320026b41057410391a200341186a200c290300370000200341106a2010290300370000200341086a201129030037000020032004290328370000200b200141286c6a220141907e6a200141e87d6a2203200b2f01be0320026b41286c10391a200141887e6a2009290300370300200141807e6a2008290300370300200141f87d6a2007290300370300200141f07d6a2006290300370300200320042903a803370300200b200b2f01be0341016a3b01be030b200041013a000020002004290300370001200041246a200e360000200041286a20053600002000412c6a200d360000200041306a2004290320370300200041386a2004290348370300200041096a200441086a290300370000200041116a200441106a290300370000200041196a200441186a290300370000200041d0006a200441c8006a41186a290300370300200041c8006a200441c8006a41106a290300370300200041c0006a200441c8006a41086a290300370300200041d8006a200441e8006a29030037030020002003360260200441e0066a24000f0b101c000ba108010a7f230041c0026b220424000240200128020422052f018e022206410a4b0d00200441286a41086a2207200241086a28020036020020042002290200370328200441386a41086a2208200341086a280200360200200420032902003703382005200128020c2202410c6c2203410c6a22096a200520036a220a200620026b410c6c10391a200a41086a2007280200360200200a200429032837020020054184016a220620096a200620036a22032005418e026a22052f010020026b410c6c10391a200341086a200828020036020020032004290338370200200520052f010041016a3b0100200128020c210520004100360200200041106a2005360200200020062005410c6c6a360230200020012902003702042000410c6a200141086a280200360200200441c0026a24000f0b2001280208210b2001280200210c024041900210012206450d002006200441386a418802101e220641003b018e022006410036028802200441386a41086a220a200541d0006a280200360200200441286a41086a2207200541d4016a280200360200200420052902483703382004200541cc016a2902003703282006200541d4006a2005418e026a22082f010041796a2209410c6c220d101e22064184016a200541d8016a200d101e210d200841063b0100200620093b018e02200441086a200a28020036020020042004290338370300200441106a41086a200728020036020020042004290328370310200441003602242004200636022002400240200128020c220941064b0d002007200241086a28020036020020042002290200370328200a200341086a2802003602002004200329020037033820052009410c6c2201410c6a22036a200520016a220220082f010020096b410c6c10391a200241086a20072802003602002002200429032837020020054184016a220220036a200220016a220120082f010020096b410c6c10391a200141086a200a28020036020020012004290338370200200820082f010041016a3b01000c010b2007200241086a28020036020020042002290200370328200a200341086a2802003602002004200329020037033820062009410c6c220141b87f6a22026a2006200141ac7f6a22036a220120062f018e02200941796a22086b410c6c10391a200141086a200728020036020020012004290328370200200d20026a200d20036a220120062f018e0220086b410c6c10391a200141086a200a28020036020020012004290338370200200620062f018e0241016a3b018e020b200041013602002000200c36020420002001360230200041086a20053602002000410c6a200b360200200041106a20042903003702002000411c6a2004290310370200200041286a2004290320370200200041186a200441086a280200360200200041246a200441106a41086a280200360200200441c0026a24000f0b101c000bf307010d7f23004180036b220624000240200128020422072f018e02410a4b0d00200641c8006a41086a200241086a28020036020020062002290200370348200641f8006a41086a200341086a280200360200200620032902003703782001200641c8006a200641f8006a2004108b0120004100360200200020012902003702042000410c6a200141086a29020037020020064180036a24000f0b2001280208210820012802002109024041c0021001220a450d004100210b200a200641f8006a418802101e220a41003b018e02200a410036028802200a200629024837029002200a4198026a200641c8006a41086a220c290200370200200a41a0026a200641d8006a290200370200200a41a8026a200641e0006a290200370200200a41b0026a200641e8006a290200370200200a41b8026a200641f0006a290200370200200c200741d0006a28020036020020062007290248370348200641f8006a41086a220d200741d4016a2802003602002006200741cc016a290200370378200a200741d4006a2007418e026a220e2f0100220f41796a2210410c6c2211101e22124184016a200741d8016a2011101e1a20124190026a220a200741ac026a200f417a6a220f410274101e1a200e41063b0100201220103b018e020240200f450d000340200a280200220e200b3b018c02200e201236028802200a41046a210a200b41016a220b200f490d000b0b200641386a41086a220b200c280200360200200641286a41086a220a200d2802003602002006200629034837033820062006290378370328200641086a200b28020036020020062006290338370300200641106a41086a200a28020036020020062006290328370310200620093602242006201236022002400240200128020c220b41064b0d002006200736027c2006200936027820062008360280012006200b36028401200641386a41086a200241086a28020036020020062002290200370338200641c8006a41086a200341086a28020036020020062003290200370348200641f8006a200641386a200641c8006a2004108b010c010b2006201236027c200620093602782006200b41796a360284012006200641206a36028001200641386a41086a200241086a28020036020020062002290200370338200641c8006a41086a200341086a28020036020020062003290200370348200641f8006a200641386a200641c8006a2004108b010b2000200936020420004101360200200041086a20073602002000410c6a2008360200200041106a20062903003702002000411c6a2006290310370200200041286a2006290320370200200041186a200641086a280200360200200041246a200641106a41086a28020036020020064180036a24000f0b101c000b890301077f230041206b22042400200041046a22052802002106200028020c2107200441086a2208200141086a28020036020020042001290200370300200441106a41086a2209200241086a2802003602002004200229020037031020062007410c6c2202410c6a220a6a200620026a220120062f018e0220076b410c6c10391a200141086a20082802003602002001200429030037020020064184016a2201200a6a200120026a220220062f018e0220076b410c6c10391a200241086a200928020036020020022004290310370200200620062f018e0241016a3b018e0220064190026a2206200028020c22074102746a41086a2006200741016a22074102746a220620052802002f018e0220076b41027410391a200620033602000240200028020c220041016a220620052802002f018e0222034b0d0020004102744194026a21000340200641016a22072006490d012005280200220220006a2802002201200236028802200120063b018c02200041046a210020072106200720034d0d000b0b200441206a24000bd40c02117f017e230041c0076b220624000240200128020422072f01be03410a4b0d00200641f8006a41186a200241186a290000370300200641f8006a41106a200241106a290000370300200641f8006a41086a200241086a2900003703002006200229000037037820064188046a41206a200341206a29030037030020064188046a41186a200341186a29030037030020064188046a41106a200341106a29030037030020064188046a41086a200341086a29030037030020062003290300370388042001200641f8006a20064188046a2004108d01200041003a0000200041046a20012902003702002000410c6a200141086a290200370200200641c0076a24000f0b2001280208210820012802002109024041d0061001220a450d004100210b200a20064188046a41b803101e220a41003b01be03200a41003602b803200a41c0036a200641f8006a419003101e210c200641286a41186a220d20074198056a290000370300200641286a41106a220e20074190056a290000370300200641286a41086a220f20074188056a290000370300200620074180056a29000037032820064188046a41206a221020074190026a29030037030020064188046a41186a221120074188026a29030037030020064188046a41106a221220074180026a29030037030020064188046a41086a2213200741f8016a290300370300200620072903f00137038804200c200741a0056a200741be036a22142f0100221541796a2216410574101e1a200a20074198026a201641286c101e220c41a0066a220a200741bc066a2015417a6a2215410274101e1a201441063b0100200c20163b01be0302402015450d000340200a2802002216200b3b01bc032016200c3602b803200a41046a210a200b41016a220b2015490d000b0b200641f8006a41206a220b2010290300370300200641f8006a41186a220a2011290300370300200641f8006a41106a22162012290300370300200641f8006a41086a22152013290300370300200641d8006a41086a2210200f290300370300200641d8006a41106a2211200e290300370300200641d8006a41186a2212200d290300370300200620062903880437037820062006290328370358200641086a41186a2012290300370300200641086a41106a2011290300370300200641086a41086a201029030037030020062006290358370308200641286a41206a200b290300370300200d200a290300370300200e2016290300370300200f201529030037030020062006290378370328200620093602542006200c36025002400240200128020c220b41064b0d002006200736025c20062009360258200620083602602006200b360264200641f8006a41186a200241186a290000370300200641f8006a41106a200241106a290000370300200641f8006a41086a200241086a2900003703002006200229000037037820064188046a41206a200341206a29030037030020064188046a41186a200341186a29030037030020064188046a41106a200341106a29030037030020064188046a41086a200341086a2903003703002006200329030037038804200641d8006a200641f8006a20064188046a2004108d010c010b2006200c36025c200620093602582006200b41796a3602642006200641d0006a360260200641f8006a41186a200241186a290000370300200641f8006a41106a200241106a290000370300200641f8006a41086a200241086a2900003703002006200229000037037820064188046a41206a200341206a29030037030020064188046a41186a200341186a29030037030020064188046a41106a200341106a29030037030020064188046a41086a200341086a2903003703002006200329030037038804200641d8006a200641f8006a20064188046a2004108d010b20002006290308370001200041246a2009360200200041286a20073602002000412c6a2008360200200041386a2006290328370300200041096a200641086a41086a290300370000200041116a200641086a41106a290300370000200041196a200641086a41186a290300370000200041c0006a200641286a41086a290300370300200041c8006a200641286a41106a290300370300200041d0006a200641286a41186a290300370300200041d8006a200641c8006a29030037030020062903502117200041013a0000200041306a2017370200200641c0076a24000f0b101c000bb804010b7f230041d0006b22042400200041046a22052802002106200028020c2107200441086a41186a2208200141186a290000370300200441086a41106a2209200141106a290000370300200441086a41086a220a200141086a29000037030020042001290000370308200441286a41206a2201200241206a290300370300200441286a41186a220b200241186a290300370300200441286a41106a220c200241106a290300370300200441286a41086a220d200241086a29030037030020042002290300370328200620074105746a220241e0036a200241c0036a220e20062f01be0320076b41057410391a200241d8036a2008290300370000200241d0036a2009290300370000200241c8036a200a290300370000200e20042903083700002006200741286c6a220241286a200220062f01be0320076b41286c10391a200241206a2001290300370300200241186a200b290300370300200241106a200c290300370300200241086a200d29030037030020022004290328370300200620062f01be0341016a3b01be03200641a0066a2206200028020c22024102746a41086a2006200241016a22024102746a220620052802002f01be0320026b41027410391a200620033602000240200028020c220241016a220620052802002f01be0322034b0d00200241027441a4066a21020340200641016a22012006490d012005280200220020026a280200220720003602b803200720063b01bc03200241046a210220012106200120034d0d000b0b200441d0006a24000b8614010e7f230041d0006b220424004100210502404101417f100d2206417f460d002004410036020820044204370300200441386a41ae0d4103102a200441106a41b10d410f102a200441cc006a2207200441106a41086a220528020036020020042004290310370244200441106a41106a2208200441386a41106a22092903003703002005200441386a41086a220a290300370300200420042903383703102004106a2004280204210b2004280200220c2004280208220d4105746a220e2004290310370200200e4100360218200e41086a2005290300370200200e41106a2008290300370200200e411c6a41013602002004200d41016a220d360208200441386a41ae0d4103102a200441106a41c00d410f102a2007200528020036020020042004290310370244200820092903003703002005200a290300370300200420042903383703100240200d200b470d002004106a200441086a280200210d2004280200210c2004280204210b0b200c200d4105746a220e2004290310370200200e4100360218200e41106a2008290300370200200e41086a2005290300370200200e411c6a4102360200200441086a200d41016a220e360200200441386a41ae0d4103102a200441106a41cf0d410c102a2007200528020036020020042004290310370244200820092903003703002005200a290300370300200420042903383703100240200e200b470d002004106a200441086a280200210e2004280204210b2004280200210c0b200c200e4105746a2208200429031037020020084100360218200841106a200441106a41106a220d290300370200200841086a200441106a41086a22052903003702002008411c6a4103360200200441086a2207200e41016a220e360200200441386a41ae0d4103102a200441106a41db0d410a102a200441cc006a2209200528020036020020042004290310370244200d200441386a41106a220a2903003703002005200441386a41086a220f290300370300200420042903383703100240200e200b470d002004106a2007280200210e2004280200210c2004280204210b0b200c200e4105746a2208200429031037020020084100360218200841106a200d290300370200200841086a20052903003702002008411c6a41043602002007200e41016a2208360200200441386a41ae0d4103102a200441106a41e50d4106102a2009200528020036020020042004290310370244200d200a2903003703002005200f2903003703002004200429033837031002402008200b470d002004106a200441086a28020021082004280200210c0b200c20084105746a2205200429031037020020054101360218200541106a200441106a41106a220b290300370200200541086a200441106a41086a2903003702002005411c6a2006360200200441086a200841016a2205360200200b200241086a290000370300200441106a41186a200241106a290000370300200441306a200241186a2900003703002004200336021020042006360214200420022900003703184104210702400240410410012210450d00201020053600000240024002402005450d00200c20054105746a2111200441c0006a210341042107410421080340200441386a200c105120042802382105410121064100210b024020032802002202450d0020024100480d042002210b200210012206450d050b200620052002101e210a0240200428023c450d00200510020b200441386a200c410c6a220f105120042802382109024002400240200b20026b2003280200220d490d002002200d6a2105200b2106200a220e20026a2009200d101e1a200428023c0d010c020b2002200d6a22052002490d05200b4101742206200520052006491b22064100480d0520061001210e0240200b450d00200e450d07200e200a2006200b200b20064b1b101e210b200a1002200b20026a2009200d101e1a200428023c0d010c020b200e450d06200e20026a2009200d101e1a200428023c450d010b200910020b2003410036020020044201370338200c41186a2802002102200441386a104f2004280238220d2003280200220b6a21090240024002400240024002400240024020024101470d00200941023a00002003200b41016a2202360200200c411c6a280200210c200428023c220920026b41034b0d01200241046a220b2002490d0b2009410174220a200b200b200a491b220a4100480d0b200a1001210b2009450d02200b450d0c200b200d200a20092009200a4b1b101e1a200d10020c030b200941013a00002003200b41016a2202360200200c411c6a280200210c200428023c220920026b41034b0d00200241046a220b2002490d0a2009410174220a200b200b200a491b220a4100480d0a200a1001210b2009450d03200b450d0b200b200d200a20092009200a4b1b101e1a200d10020c040b200d210b0c050b200b450d090b2004200a36023c0c020b200b450d070b2004200a36023c0b2004200b3602380b200b20026a200c3600002003200241046a220c360200200428023c210a0240024002400240200620056b200c4f0d002005200c6a22022005490d072006410174220d20022002200d491b22094100480d0720091001210d2006450d01200d450d08200d200e20092006200620094b1b101e2106200e1002200620056a200b200c101e1a200a0d020c030b2005200c6a210220062109200e220d20056a200b200c101e1a200a0d010c020b200d450d06200d20056a200b200c101e1a200a450d010b200b10020b0240024002400240200720086b20024f0d00200820026a22052008490d0720074101742206200520052006491b22064100480d072007450d0120061001220b450d08200b201020062007200720064b1b101e210b2010100220062107200b221020086a200d2002101e1a20090d020c030b200820026a2105201020086a200d2002101e1a20090d010c020b20062107200610012210450d06201020086a200d2002101e1a2009450d010b200d10020b20052108200f41146a220c2011470d000c020b0b410421050b41052000200120102005200441106a100e210202402007450d00201010020b02402002417f460d00410121050240200241eb0d4104200441106a100f2202450d002002417d470d04410021050b200428020021030240200441086a2802002202450d00200241057421062003210203400240200241046a280200450d00200228020010020b0240200241106a280200450d002002410c6a28020010020b200241206a2102200641606a22060d000b0b2004280204450d0420031002200441d0006a240020050f0b200428020021060240200441086a2802002202450d00200241057421052006210203400240200241046a280200450d00200228020010020b0240200241106a280200450d002002410c6a28020010020b200241206a2102200541606a22050d000b0b02402004280204450d00200610020b200441d0006a240041000f0b1041000b101c000b41fc3a103b000b200441d0006a240020050bbe0701047f23004190016b220424000240024002400240024002400240024002402003450d0020022802000d0120034101460d0220022802100d0320034103490d0420022802200d0520022802042103200241146a2802002105200241246a2802002106200441186a4200370300200441106a4200370300200441086a42003703002004420037030002400240024002402001280204220720032004412010102202417e460d0020020d0a200441206a41186a200141206a290000370300200441206a41106a200141186a290000370300200441206a41086a200141106a290000370300200420012900083703202005450d01200441c0006a41186a4200370300200441c0006a41106a4200370300200441c0006a41086a42003703002004420037034020072006200441c0006a412010102202417e460d0320020d0c20012802002101412010012202450d0b2004200236028001200442203702840120044180016a41004120102720042802800120042802880122036a22022004290300370000200441e0006a41086a200341206a2203360200200241086a200441086a290300370000200241106a200441106a290300370000200241186a200441186a29030037000020042004290380013703602004200336028801412010012202450d0b2004200236028001200442203702840120044180016a41004120102720042802800120042802880122036a22022004290340370000200441f0006a41086a200341206a2203360200200241086a200441c0006a41086a290300370000200241106a200441c0006a41106a290300370000200241186a200441c0006a41186a290300370000200420042903800137037020042003360288012001200441206a200441e0006a200441f0006a1094010c020b2000410536020020044190016a24000f0b20012802002101412010012202450d092004200236024020044220370244200441c0006a4100412010272004280240200428024822036a2202200429030037000020044180016a41086a200341206a2203360200200241086a200441086a290300370000200241106a200441106a290300370000200241186a200441186a290300370000200420042903403703800120042003360248200441003602402001200441206a20044180016a200441c0006a1094010b2000410436020020044190016a24000f0b2000410536020020044190016a24000f0b41bc3441004100103c000b41ec3f103b000b41cc3441014101103c000b41ec3f103b000b41dc3441022003103c000b41ec3f103b000b41cc31103b000b101c000b41cc31103b000bc50301027f230041d0006b2204240002400240024002400240024002402003450d0020022802000d0120034101460d0220022802100d0320022802042103200241146a2802002102200441186a4200370300200441106a4200370300200441086a420037030020044200370300024002400240024002402001280204220520032004412010102203417e460d0020030d09200441206a41186a200141206a290000370300200441206a41106a200141186a290000370300200441206a41086a200141106a29000037030020042001290008370320200441c0006a2001280200200441206a2004412010950120042802402201450d0120042802442103200520022001200441c0006a41086a28020010112202417e460d0320020d0a2003450d02200110020c020b20004105360200200441d0006a24000f0b2005200241bd0e412010112202417e460d0220020d090b20004104360200200441d0006a24000f0b2000410536020002402003450d00200110020b200441d0006a24000f0b20004105360200200441d0006a24000f0b419c3441004100103c000b41ec3f103b000b41ac3441014101103c000b41ec3f103b000b41cc31103b000b41e431103b000b41e431103b000b861a05037f017e047f047e027f230041a0076b22042400024002400240024002400240024002400240024002400240024002402003450d0020022802000d0120034101460d0220022802100d0320034103490d0420022802200d0520022802042105200241146a2802002106200241246a3502002107410021022004410036020820044201370300024002402006450d0020044100200610272004280200200441086a220828020022096a210a024020064101460d00410021020340200a20026a41003a0000200241026a2103200241016a220b210220032006490d000b2009200b6a2109200a200b6a210a0b200a41003a00002008200941016a2202360200200428020021030c010b410121030b024002400240200128020420052003200210102206417e460d0020060d09200441e8036a2002412020024120491b22066a41004100412020066b2006411f4b1b10171a200441e8036a20032006101e1a2002411f4d0d0b200441106a41186a200441e8036a41186a290000370300200441106a41106a200441e8036a41106a290000370300200441106a41086a200441e8036a41086a290000370300200420042900e803370310200441306a41186a200141206a290000370300200441306a41106a200141186a290000370300200441306a41086a200141106a29000037030020042001290008370330200128020022022802002206417f460d0a2002200641016a360000200241046a220a200441306a1096012206450d012006280200450d01200641086a290300210c0c020b200041053602002004280204450d0f0c0e0b2002280210200441306a200241146a280200280214111400210c0b200220022802002206417f6a360000200c2007540d092006450d072002200636000002400240200a200441106a1096012206450d002006280200450d00200641086a290300210d0c010b2002280210200441106a200241146a280200280214111400210d0b20022002280200417f6a360000024002400240410810012206450d00200420063602e803200442083702ec03200441e8036a41004108102720042802e80320042802f00322066a42f3e885d3a3ec9bb73a3700002004200641086a3602f00320044188016a41086a20042802f003360200200420042903e80337038801412010012206450d00200420063602e803200442203702ec03200441e8036a41004120102720042802e803220a20042802f003220b6a22062004290330370000200641086a200441306a41086a290300370000200641106a200441306a41106a290300370000200641186a200441306a41186a2903003700002004200b41206a22063602f00320042802ec03210520044188016a20042802900120061027200428028801220b20042802900122096a200a2006101e1a2004200920066a22063602900102402005450d00200a10020b200428028c01210a4200210e200441e8036a41086a22054200370300200442003703e803200b2006200441e8036a100320044188016a41086a2005290300370300200420042903e80337038801024020044188016a411041d02d410041001000417f460d00200442003703e80320044188016a4110200441e8036a41084100100041016a41084d0d0220042903e803210e0b0240200a450d00200b10020b410810012206450d00200420063602e803200442083702ec03200441e8036a41004108102720042802e80320042802f00322066a42f3e885d3a3ec9bb73a3700002004200641086a3602f00320044188016a41086a20042802f003360200200420042903e80337038801412010012206450d00200420063602e803200442203702ec03200441e8036a41004120102720042802e803220a20042802f003220b6a22062004290310370000200641086a200441106a41086a290300370000200641106a200441106a41106a290300370000200641186a200441106a41186a2903003700002004200b41206a22063602f00320042802ec03210520044188016a20042802900120061027200428028801220b20042802900122096a200a2006101e1a2004200920066a22063602900102402005450d00200a10020b200428028c01210a4200210f200441e8036a41086a22054200370300200442003703e803200b2006200441e8036a100320044188016a41086a2005290300370300200420042903e80337038801024020044188016a411041d02d410041001000417f460d00200442003703e80320044188016a4110200441e8036a41084100100041016a41084d0d0320042903e803210f0b0240200a450d00200b10020b200e200f560d0d200d20077c220e200d580d0e41a00610012206450d002006200441e8036a41b803101e220641003b01be03200641003602b803200641c0036a20044188016a41e002101e1a200441d0006a41086a220a4200370300200441e4006a41c43d360200200420063602542004410036025020042002360260200441d0006a41047221020240200441306a200441106a41201006450d002004417f360250200441e8036a41186a2206200441306a41186a290300370300200441e8036a41106a2209200441306a41106a290300370300200441e8036a41086a200441306a41086a290300370300200420042903303703e803200420023602702004200a2802003602682004200428025436026c20044188016a200441e8006a200441e8036a1097014101210a20044188016a41106a280200210b20044188016a410c6a280200210820044188016a41086a2802002105200428028c01211002402004280288014101470d00200441e8006a41186a2006290300370300200441e8006a41106a2009290300370300200441e8006a41086a200441e8036a41086a290300370300200420042903e8033703684100210a0b41900210012206450d01200c20077d21072006200441e8036a418802101e220641003b018e02200641003602880202400240200a450d0020042006360288012004420037028c012005200b41286c6a2106200441e8036a20044188016a109801200441e8036a1099010c010b20044184046a200441f0006a2903003702002004418c046a200441f8006a29030037020020044194046a20044180016a290300370200200420053602ec03200420103602e803200420083602f0032004200b3602f4032004200441d0006a410c6a3602f803200420042903683702fc03200441a8016a420037030020044100360298012004420037038801200420063602a401200441e8036a20044188016a109a0121060b20064201370300200620073703082004417f360250200441e8036a41186a2206200441106a41186a290300370300200441e8036a41106a2209200441106a41106a290300370300200441e8036a41086a2208200441106a41086a290300370300200420042903103703e803200420023602702004200441d0006a41086a2802003602682004200428025436026c20044188016a200441e8006a200441e8036a1097014101210a20044188016a41106a280200210b20044188016a410c6a280200211020044188016a41086a2802002105200428028c01211102402004280288014101470d00200441e8006a41186a2006290300370300200441e8006a41106a2009290300370300200441e8006a41086a2008290300370300200420042903e8033703684100210a0b41900210012206450d012006200441e8036a418802101e220641003b018e02200641003602880202400240200a450d0020042006360288012004420037028c012005200b41286c6a2106200441e8036a20044188016a109801200441e8036a1099010c010b20044184046a200441f0006a2903003702002004418c046a200441f8006a29030037020020044194046a20044180016a290300370200200420053602ec03200420113602e803200420103602f0032004200b3602f4032004200441d0006a410c6a3602f803200420042903683702fc03200441a8016a420037030020044100360298012004420037038801200420063602a401200441e8036a20044188016a109a0121060b200642013703002006200e370308200441003602500b200441e8036a200441d0006a200441106a109b0102400240024020042802f0032206450d0020042802e803220a2006200441106a200441d0006a108e01450d010b200441d8006a290300210720042802542102024020042802ec03450d0020042802e80310020b2002450d0120012802002106200420073702ec03200420023602e8032006200441e8036a109c010c010b024020042802ec03450d00200a10020b20044188016a41086a200241086a2802003602002004200229020037038801200441e8036a20044188016a109d01200441e8036a109e010b2000410436020020042802040d0f0c100b101c000b41c1214133102d000b41c1214133102d000b41ec3341004100103c000b41ec3f103b000b41fc3341014101103c000b41ec3f103b000b418c3441022003103c000b41ec3f103b000b41cc31103b000b109f01000b41ec3f103b000b418c3c103b000b41a43c103b000b41bc3c103b000b200310020b200441a0076a24000b811a06047f017e047f017e037f057e230022042105200441c0086b4160712204240002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0120034101460d0220022802100d0320034103490d0420022802200d0520022802042106200241146a2802002107200241246a3502002108410021022004410036020820044201370300024002402007450d0020044100200710272004280200200441086a2209280200220a6a210b024020074101460d00410021020340200b20026a41003a0000200241026a2103200241016a220c210220032007490d000b200a200c6a210a200b200c6a210b0b200b41003a00002009200a41016a2202360200200428020021030c010b410121030b024002400240200128020420062003200210102207417e460d0020070d09200441106a41186a200141206a290000370300200441106a41106a200141186a290000370300200441186a200141106a2900003703002004200129000837031020012802002207280200220b417f460d0a2007200b41016a360000200741046a200441106a109601220b450d01200b280200450d01200b41086a290300210d0c020b200041053602002004280204450d140c130b2007280210200441106a200741146a280200280214111400210d0b20072007280200417f6a360000200d2008540d08200441c8046a41186a220b4200370300200441c8046a41106a220c4200370300200441c8046a41086a22014200370300200442003703c80420032002200441c8046a1012200441e8016a41186a2206200b290300370300200441e8016a41106a220a200c290300370300200441e8016a41086a22092001290300370300200420042903c8043703e801200b2006290300370300200c200a29030037030020012009290300370300200420042903e8013703c80441201001220e450d0d2004200e3602e801200442203702ec01200441e8016a41004120102720042802e80120042802f001220f6a220e20042903c80437000020044180086a41086a2210200f41206a220f360200200e41086a2001290300370000200e41106a200c290300370000200e41186a200b290300370000200420042903e801370380082004200f3602f00120044180086a20102802004120102720102010280200220e41206a220f360200200e20042802800822106a220e2004290310370000200e41086a200441106a41086a290300370000200e41106a200441106a41106a290300370000200e41186a200441106a41186a290300370000200b4200370300200c420037030020014200370300200442003703c8042010200f200441c8046a10122006200b290300370300200a200c29030037030020092001290300370300200420042903c8043703e801200441306a41186a2006290300370300200441306a41106a200a290300370300200441306a41086a2009290300370300200420042903e8013703300240200428028408450d00201010020b200441306a200441106a41201006450d1041a0061001220b450d0d200b200441c8046a41b803101e220b41003b01be03200b41003602b803200b41c0036a200441e8016a41e002101e1a2004200b36025020044200370254200441306a200441106a41201006450d09200441a0016a41186a200441306a41186a290300370300200441a0016a41106a200441306a41106a290300370300200441a0016a41086a200441306a41086a290300370300200420042903303703a0012002417f4c0d0a024002402002450d0020021001220b0d010c0f0b4101210b0b200420023602cc042004200b3602c804200441003602d004200441c8046a410020021027200420042802d004220b20026a3602d004200b20042802c8046a20032002101e1a200441e8016a41086a220c20042802d004360200200420042903c8043703e80141900210012202450d0d200441d0006a41086a210b2002200441c8046a418802101e220241003b018e022002410036028802200420083703c801200442013703c001200420023602dc01200420042903e8013703d0012004200c2802003602d801200441c8046a41186a2202200441a0016a41186a290300370300200441c8046a41106a220c200441a0016a41106a290300370300200441c8046a41086a200441a0016a41086a290300370300200420042903a0013703c804200420042802543602b008200420042802503602b4082004200441d0006a3602b808200441e8016a200441b0086a200441c8046a109701200441a0086a41086a200441f4016a290200370300200420042902ec013703a008024020042802e8014101470d0020044180086a41186a2201200229030037030020044180086a41106a2202200c29030037030020044180086a41086a220c200441c8046a41086a2206290300370300200420042903c80437038008200441b0086a41086a200441a0086a41086a220a290300370300200420042903a0083703b0082006200a290300370300200441e4046a200c290300370200200441ec046a2002290300370200200441f4046a20012903003702002004200b3602d804200420042903a0083703c80420042004290380083702dc0420044188026a4200370300200441e8016a41186a20042903d801370300200420042903d0013703f801200420042903c8013703f001200420042903c0013703e801200441c8046a200441e8016a109a011a2004420237036041010d0d0c0c0b200441c8046a41086a200441a0086a41086a290300370300200420042903a0083703c80420042802cc0420042802d40441286c6a22022900102112200220042903d00137001020022900082113200220042903c80137000820022900002114200220042903c0013700002002290020211120024200370020200241186a22022900002115200220042903d8013700002004200b3602d8042004201237037020042013370368200420143703602004201537037820144202520d0b0c0c0b41bc3341004100103c000b41ec3f103b000b41cc3341014101103c000b41ec3f103b000b41dc3341022003103c000b41ec3f103b000b41cc31103b000b109f01000b41943d103b000b41ac3d103b000b1019000b024020042802702202450d002004280274450d00200210020b200420113702ec012004200428027c3602e801200441c8046a200441e8016a109801200441c8046a1099010b200441a0016a41186a220c200441106a41186a290300370300200441a0016a41106a2201200441106a41106a290300370300200441a0016a41086a2206200441106a41086a290300370300200420042903103703a00141900210012202450d002002200441c8046a418802101e220241003b018e0220024100360288022004200d20087d3703c801200442013703c001200441003602d001200420023602dc01200441c8046a41186a200c290300370300200441c8046a41106a2001290300370300200441c8046a41086a2006290300370300200420042903a0013703c804200420042802543602b008200420042802503602b4082004200441d0006a3602b808200441e8016a200441b0086a200441c8046a109701200441a0086a41086a200441f4016a290200370300200420042902ec013703a0080240024020042802e8014101470d0020044180086a41186a2202200441c8046a41186a29030037030020044180086a41106a220c200441c8046a41106a29030037030020044180086a41086a2201200441c8046a41086a2206290300370300200420042903c80437038008200441b0086a41086a200441a0086a41086a220a290300370300200420042903a0083703b0082006200a290300370300200441e4046a2001290300370200200441ec046a200c290300370200200441f4046a20022903003702002004200b3602d804200420042903a0083703c80420042004290380083702dc0420044188026a4200370300200441e8016a41186a20042903d801370300200420042903d0013703f801200420042903c8013703f001200420042903c0013703e801200441c8046a200441e8016a109a011a200442023703800141010d010c030b200441c8046a41086a200441a0086a41086a290300370300200420042903a0083703c80420042802cc0420042802d40441286c6a22022900102111200220042903d00137001020022900082114200220042903c8013700082002290000210d200220042903c0013700002002290020210820024200370020200241186a22022900002112200220042903d8013700002004200b3602d804200420113703900120042014370388012004200d370380012004201237039801200d4202520d020b20042802502202450d030c020b101c000b02402004280290012202450d00200428029401450d00200210020b200420083702ec012004200428029c013602e801200441c8046a200441e8016a109801200441c8046a10990120042802502202450d010b200420042902543702cc04200420023602c8042007200441c8046a109c010b200041043602002004280204450d010b200310020b200524000bd41003027f017e077f230041c0006b22042400024020010d0041d02d2100410021010b20044100360200024002400240024002400240200141034d0d002004200028000022053602002005ad2206421c88a70d012006420486a72207417f4c0d02024002402007450d002007100122080d010c070b410821080b20042005360204200420083602002004410036020802400240024002402005450d002001417c6a2101200041046a2107200441086a2109410021004100210a0340200441003a0030200441306a20072001410047220b101e1a2001450d0320042d0030417f6a220c41034b0d032001200b6b21012007200b6a210702400240024002400240024002400240200c0e0403010400030b20044200370330200441306a20072001410820014108491b220b101e1a200141074d0d0a2007200b6a2107200429033021064103210c0c010b20044200370330200441306a20072001410820014108491b220b101e1a200141074d0d092007200b6a2107200429033021064101210c0b200a41016a210a20002004280204470d040c030b20044100360230200441306a20072001410420014104491b220b101e1a200141034d0d072007200b6a21072004280230210d4100210c0c010b20044100360230200441306a20072001410420014104491b220b101e1a200141034d0d062007200b6a21072004280230210d4102210c0b200a41016a210a20002004280204470d010b200410800120092802002100200428020021080b2001200b6b2101200820004104746a220b200d360204200b200c360200200b41086a20063703002009200041016a2200360200200a2005490d000b20042802042107200428020022080d010c030b41002100410021072008450d020b20042002200820002003110700200441003602182004420137031020042802002101200441106a107e2004280210200428021822006a210a024020014105470d00200a41013a0000200441186a2201200041016a2200360200200441106a20004100102720012802002101200428021021000c070b200a41003a0000200441106a41086a200041016a22003602002004410036022820044201370320200441206a104f2004280220220b2004280228220a6a210c0240024020014104470d00200c41003a0000200441206a41086a200a41016a220a3602000c010b200c41013a0000200441206a41086a200a41016a36020020044100360238200442013703300240024002400240024002400240024002400240024002400240024002400240024002400240200141037122014101460d00024020014102460d0020014103470d02200441086a2903002106200441306a104f20042802302205200441306a41086a220b280200220c6a41043a0000200b200c41016a22013602002004280234220d20016b41074b0d03200141086a220a2001490d1a200d4101742209200a200a2009491b22094100480d1a20091001210a200d450d07200a450d1c200a20052009200d200d20094b1b101e1a200510020c080b20042802042102200441306a104f20042802302205200441386a220b280200220c6a41033a0000200b200c41016a22013602002004280234220d20016b41034b0d03200141046a220a2001490d19200d4101742209200a200a2009491b22094100480d1920091001210a200d450d09200a450d1b200a20052009200d200d20094b1b101e1a200510020c0a0b200441086a2903002106200441306a104f20042802302205200441306a41086a220b280200220c6a41023a0000200b200c41016a22013602002004280234220d20016b41074b0d03200141086a220a2001490d18200d4101742209200a200a2009491b22094100480d1820091001210a200d450d0b200a450d1a200a20052009200d200d20094b1b101e1a200510020c0c0b20042802042102200441306a104f20042802302205200441386a220b280200220c6a41013a0000200b200c41016a22013602002004280234220d20016b41034b0d03200141046a220a2001490d17200d4101742209200a200a2009491b22094100480d1720091001210a200d450d0d200a450d19200a20052009200d200d20094b1b101e1a200510020c0e0b2005210a0c050b2005210a0c070b2005210a0c090b2005210a0c0b0b200a450d140b200420093602342004200a3602300b200b200c41096a360200200a20016a20063700000c090b200a450d110b200420093602342004200a3602300b200b200c41056a360200200a20016a20023600000c060b200a450d0e0b200420093602342004200a3602300b200b200c41096a360200200a20016a20063700000c030b200a450d0b0b200420093602342004200a3602300b200b200c41056a360200200a20016a20023600000b200428023421092004280230210c02400240024002402004280224220d200441206a41086a28020022016b200441306a41086a280200220a4f0d002001200a6a220b2001490d0a200d4101742205200b200b2005491b22054100480d0a200d450d012004280220210220051001220b450d0c200b20022005200d200d20054b1b101e1a200210020c020b2004280220210b0c020b20051001220b450d0a0b200420053602242004200b3602200b200441286a220d2001200a6a360200200b20016a200c200a101e1a02402009450d00200c10020b200d280200210a2004280220210b0b2004280224210c200441106a2000200a1027200441186a22012001280200220d200a6a2201360200200d200428021022006a200b200a101e1a200c450d06200b10020c060b2004280204450d00200428020010020b41af1b41f000102d000b200420002001101e1a41af1b41f000102d000b105a000b105b000b1041000b2000ad4220862001ad84210602402007450d00200810020b200441c0006a240020060f0b101c000ba30501097f230041e0026b220424000240024020002802000d002000417f360000200441306a41186a2205200141186a290000370300200441306a41106a2206200141106a290000370300200441306a41086a2207200141086a290000370300200420012900003703302004200041046a3602182004200041086a28020036021020042000280204360214200441b8026a200441106a200441306a10970141012108200441b8026a41106a2802002109200441c4026a280200210a200441b8026a41086a280200210b20042802bc02210c024020042802b8024101470d00200441106a41186a2005290300370300200441106a41106a2006290300370300200441106a41086a200729030037030020042004290330370310410021080b41900210012201450d012001200441306a418802101e220141003b018e022001410036028802024002402008450d00200420013602b802200442003702bc02200b200941286c6a2101200441306a200441b8026a109801200441306a1099010c010b200441cc006a200441186a290300370200200441d4006a200441206a290300370200200441dc006a200441286a2903003702002004200b3602342004200c3602302004200a3602382004200936023c20042000410c6a36024020042004290310370244200441d8026a4200370300200441003602c802200442003703b802200420013602d402200441306a200441b8026a109a0121010b200441b8026a41086a200241086a280200360200200420022902003703b802200441306a41086a200341086a2802003602002004200329020037033020042001411c6a200441b8026a200441306a10d20102402004280200450d0020042802042201450d00200441086a280200450d00200110020b20004100360000200441e0026a24000f0b10c301000b101c000be60602097f017e230041206b22052400024002400240024020012802002206417f460d002001200641016a360000200141046a20021096012206450d02200628022021072006411c6a28020022082f018e022209450d01410f210a0c030b109f01000b4101210a0c010b4116210a0b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200a0e170a090c0d160e0f1314151012110708000102030406050b0b0b20082009410c6c6a210b41002109200821064110210a0c280b20032006280200200641086a280200220c2004200c2004491b1006220d450d174111210a0c270b200d411e76417f73410271417f6a220c450d254112210a0c260b200c4101470d194113210a0c250b200941016a21092006410c6a2206200b470d170c160b4100417f4101200c20044b1b200c2004461b220c0d214114210a0c230b200541013a000c20052d000c4101710d11410d210a0c220b2007450d1e410e210a0c210b2007417f6a2107200820094102746a4190026a28020022082f018e0222090d0e4101210a0c200b200541003a000c20052d000c410171450d140c150b2008418e026a2f010021090c0f0b20002001280210200220032004200141146a28020028020c1113000c190b20082009410c6c6a22064184016a2802002204450d134103210a0c1c0b2006418c016a2802002206417f4c0d134105210a0c1b0b2006450d134106210a0c1a0b2006100122090d13410a210a0c190b101c000b410021090c120b410121094107210a0c160b200520063602142005200936021020054100360218200541106a41002006102720052005280218220c20066a360218200c200528021022096a20042006101e1a2005290214210e4108210a0c150b2000200e370204200020093602004109210a0c140b20012001280200417f6a360000200541206a24000f0b1019000b410f210a0c110b4102210a0c100b4115210a0c0f0b4101210a0c0e0b4100210a0c0d0b4110210a0c0c0b4101210a0c0b0b410d210a0c0a0b4102210a0c090b410c210a0c080b4104210a0c070b410b210a0c060b4107210a0c050b4108210a0c040b4109210a0c030b4116210a0c020b4112210a0c010b4114210a0c000b0bbe0301087f230041106b220224002000280204210302400240200028020022042f01be0322050d00410a21060c010b410421060b037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020060e0c050a0800010203040709060b0b0b2003417f6a2103200420054102746a41a0066a28020022042f01be032205450d0b410421060c150b20054105742107200441c0036a210041002105410521060c140b20012000412010062208450d0b410621060c130b4100210920084100480d11410721060c120b200041206a2100200541016a2105200741606a22070d0c410021060c110b200441be036a2f01002105200241003a000c20022d000c410171450d090c0a0b41002109410821060c0f0b200220093a000c20022d000c4101710d0a410221060c0e0b20030d0b0c0a0b200241013a000c20022d000c410171450d03410121060c0c0b200241106a24002004200541286c6a0f0b200241106a240041000f0b410a21060c090b410221060c080b410921060c070b410221060c060b410121060c050b410521060c040b410121060c030b410b21060c020b410321060c010b410821060c000b0bad04010c7f230041106b220324002001280208210420012802002105200141086a2106200141046a210702400240200128020422082f01be0322090d00410a210a0c010b4104210a0b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200a0e0c050a0800010203040709060b0b0b20012005417f6a2205360200200620043602002007200820094102746a41a0066a280200220836020020082f01be032209450d0b4104210a0c150b2009410574210b200841c0036a210c410021094105210a0c140b2002200c41201006220d450d0b4106210a0c130b4100210e200d4100480d114107210a0c120b200c41206a210c200941016a2109200b41606a220b0d0c4100210a0c110b200841be036a2f01002109200341003a000c20032d000c410171450d090c0a0b4100210e4108210a0c0f0b2003200e3a000c20032d000c4101710d0a4102210a0c0e0b20050d0b0c0a0b200341013a000c20032d000c410171450d034101210a0c0c0b2000200536020420004100360200200041086a20083602002000410c6a2004360200200041106a2009360200200341106a24000f0b20004201370200200041086a20083602002000410c6a2004360200200041106a2009360200200341106a24000f0b410a210a0c090b4102210a0c080b4109210a0c070b4102210a0c060b4101210a0c050b4105210a0c040b4101210a0c030b410b210a0c020b4103210a0c010b4108210a0c000b0bb20301097f23002102200141046a280200210320012802082104200241306b220241186a2205200128020022063602002002411c6a2207410036020020022003360214200220034100472208360210024002402003450d002003417f6a2101200241106a41047221092006210a03402005200a28029002220a3602002007410036020020022001360214200220014100473602102001417f6a2201417f470d000c020b0b200241106a41047221090b200241086a200941086a28020036020020022009290200370300200241106a41086a220a20063602002002411c6a22054100360200200220033602142002200836021002402003450d002003417f6a21010340200a200620062f018e024102746a4190026a28020022063602002005410036020020022001360214200220014100473602102001417f6a2201417f470d000b0b200241106a41086a28020022012f018e0221062002411c6a280200210a200228021421052000410036020c20002005360210200041146a2001360200200041186a200a3602002000411c6a200636020020002004360220200041086a200241086a280200360200200020022903003702000bf00202067f027e230041206b22012400200141086a200010ca01024020012802082202450d00200141186a2103200141146a2104034020032802002105200428020021060240200128020c450d00200210020b02402006450d002005450d00200610020b200141086a200010ca01200128020822020d000b0b2000280208210320002802002102024002400240024020002802042206280288022205450d00200632018c0221072001200536020c2001200241016a2202360208200120074220862003ad842207370310200610022005450d020c010b2003ad210741002105200610024100450d010b024002402005280288022206450d00200532018c0221082001200636020c2001200241016a36020820012008422086200742ffffffff0f83843703102005100220060d010c020b41002106200510024100450d010b2006210503402006280288022206450d02200510022006210520060d000b0b200141206a24000f0b20051002200141206a24000bcc0b01117f230041c0076b2202240020002802102203200328020041016a360200200241d8006a41086a200041086a29020037030020022000290200370358200241206a41186a22032000412c6a290000370300200241206a41106a2204200041246a290000370300200241206a41086a22052000411c6a29000037030020022000290014370320200241f8006a41206a200141206a290300370300200241f8006a41186a200141186a290300370300200241f8006a41106a200141106a290300370300200241f8006a41086a200141086a2903003703002002200129030037037820024188046a200241d8006a200241206a200241f8006a108801024002400240024002400240024020022d008804450d00200241086a20024191046a290000370300200241106a20024199046a290000370300200241186a200241a1046a2900003703002005200241c8046a2903003703002004200241d0046a2903003703002003200241d8046a290300370300200241206a41206a200241e0046a29030037030020022002290089043703002002200241c0046a290300370320200241bc046a2802002106200241b8046a280200210420022802e804210720024188046a412c6a280200210320024188046a41246a2802002100200241b0046a28020022012802b8032205450d0120012f01bc0321082002200536027c2002200041016a2209360278200220033602800120022008360284014100450d020c030b20024188046a41106a280200210020024188046a41086a2802002101200241c0076a24002001200041286c6a0f0b2002200136027c2002200036027820022003360280012003210941010d010b200241c0046a210020024188046a4101722101200241d4006a210a200241bc046a210b200241b8046a210c200241b4046a210d200241b0046a210e200241ac046a210f0340200241c8006a41086a2003360200200a20083602002002200536024c20022009360248200241d8006a41186a200241186a2203290300370300200241d8006a41106a200241106a2205290300370300200241d8006a41086a200241086a220829030037030020022002290300370358200241f8006a41206a200241206a41206a2209290300370300200241f8006a41186a200241206a41186a2210290300370300200241f8006a41106a200241206a41106a2211290300370300200241f8006a41086a200241206a41086a22122903003703002002200229032037037820024188046a200241c8006a200241d8006a200241f8006a20042006108c0120022d008804450d0302402008200141086a2900003703002005200141106a2900003703002003200141186a2900003703002012200041086a2903003703002011200041106a2903003703002010200041186a2903003703002009200041206a2903003703002002200129000037030020022000290300370320200c2802002104200d2802002103200e28020022082802b8032205450d00200b2802002106200f28020041016a210920082f01bc0321080c010b0b41d00610012200450d030c010b2009210341d00610012200450d020b200020024188046a41b803101e220041003b01be03200041003602b803200041c0036a200241f8006a419003101e2101200020032802003602a006200320003602002003200328020441016a36020420002802a006220341003b01bc03200320003602b803200120002f01be0322034105746a22012002290300370000200141186a200241186a290300370000200141106a200241106a290300370000200141086a200241086a2903003700002000200341286c6a220141106a200241206a41106a290300370300200141086a200241206a41086a29030037030020012002290320370300200141206a200241206a41206a290300370300200141186a200241206a41186a290300370300200041a0066a200341016a22014102746a2004360200200020002f01be0341016a3b01be03200420013b01bc03200420003602b8030b200241c0076a240020070f0b101c000bf10101047f230041106b220324000240024020012802002204417f460d002001200441016a3600000240024002400240200141046a20021096012204450d0020042802102205450d0020042802182202417f4c0d052002450d012002100122040d02101c000b200020012802102002200141146a2802002802101106000c020b410121040b200320023602042003200436020020034100360208200341002002102720032003280208220420026a3602082004200328020022066a20052002101e1a20002003290204370204200020063602000b20012001280200417f6a360000200341106a24000f0b109f01000b1019000b890b07027f017e107f017e047f017e027f230041f0026b22022400024020002802000d002000417f36000020024180016a41086a2203200141086a2802003602002002200129020037038001200220024180016a109d01200241286a41206a200241206a280200360200200241286a41186a200241186a290300370300200241286a41106a200241106a290300370300200241286a41086a200241086a2903003703002002200229030037032820024180016a200241286a10c801024020022903a00122044202510d002000410c6a2105200041046a2106200241f8016a411c6a210720024180016a41146a2108200241bc016a2109200241a0026a410c6a210a20024180016a41286a210b200241b0016a210c200241b4016a210d200241b8016a210e20024180016a41206a210f0340200241e0006a41186a220120024180016a41186a2210290300370300200241e0006a41106a221120024180016a41106a2212290300370300200241e0006a41086a22132003290300370300200241d0006a41086a2214200941086a280200360200200220022903800137036020022009290200370350200b2903002115200c2802002116200d2802002117200e2802002118200241c8016a41086a22192014280200360200200220022903503703c8012010200129030037030020122011290300370300200320132903003703002002200229036037038001200241b8026a41086a220120063602002002200041086a2802003602b802200220062802003602bc02200241f8016a200241b8026a20024180016a1097010240024020022802f8014101470d00200241d8016a41086a22012003290300370300200241d8016a41106a22112012290300370300200241d8016a41186a2213201029030037030020022002290380013703d80120022902fc01211a2003200241f8016a410c6a29020037030020122005360200200820022903d801370200200841086a2001290300370200200841106a2011290300370200200841186a20132903003702002002201a37038001200241f8016a41086a2015370300200241f8016a41106a2016360200200241f8016a41146a2017360200200241f8016a41186a2018360200200720022903c801370200200741086a2019280200360200200220043703f80120024180016a200241f8016a109a011a0c010b200241f8016a41086a2214280200200241f8016a41106a221b28020041286c6a211102402004500d0020112004370300201120153703080b024002402016450d00201141106a211302402011280210221c450d00201341046a280200450d00201c10020b201320173602042013201636020020112018360218410121130c010b410021130b20032019280200360200200220022903c80137038001200241f8016a20024180016a109801200f200241f8016a41206a2802003602002010200241f8016a41186a2903003703002012201b29030037030020032014290300370300200220022903f80137038001200241b8026a20024180016a10ca01024020022802b802450d002011411c6a21100340200241a0026a41106a200241b8026a41106a290300370300200241a0026a41086a22122001290300370300200220022903b8023703a002200241e0026a41086a2012280200360200200220022903a0023703e0022001200a41086a2802003602002002200a2902003703b802200241d0026a2010200241e0026a200241b8026a10d201024020022802d002450d0020022802d4022212450d00200241d0026a41086a280200450d00201210020b200241b8026a20024180016a10ca0120022802b8020d000b0b20024180016a1099012013201645720d002017450d00201610020b20024180016a200241286a10c801200f29030022044202520d000b0b200241286a109e0120004100360000200241f0026a24000f0b10c301000bb20301097f23002102200141046a280200210320012802082104200241306b220241186a2205200128020022063602002002411c6a2207410036020020022003360214200220034100472208360210024002402003450d002003417f6a2101200241106a41047221092006210a03402005200a2802a006220a3602002007410036020020022001360214200220014100473602102001417f6a2201417f470d000c020b0b200241106a41047221090b200241086a200941086a28020036020020022009290200370300200241106a41086a220a20063602002002411c6a22054100360200200220033602142002200836021002402003450d002003417f6a21010340200a200620062f01be034102746a41a0066a28020022063602002005410036020020022001360214200220014100473602102001417f6a2201417f470d000b0b200241106a41086a28020022012f01be0321062002411c6a280200210a200228021421052000410036020c20002005360210200041146a2001360200200041186a200a3602002000411c6a200636020020002004360220200041086a200241086a280200360200200020022903003702000bc70302077f027e23004190016b220124002001200010c801024020012903204202510d00200141c8006a4104722102200141386a2103200141346a2104200141306a2105200141206a21060340200141c8006a41086a200341086a29030037030020012003290300370348024020052802002207450d002004280200450d00200710020b20014180016a41086a200241086a2802003602002001200229020037038001200141d8006a20014180016a109801200141d8006a1099012001200010c80120062903004202520d000b0b20002802082105200028020021070240024002400240200028020422022802b8032203450d0020023201bc032108200120033602042001200741016a2207360200200120084220862005ad842208370308200210022003450d020c010b2005ad210841002103200210024100450d010b0240024020032802b8032202450d0020033201bc032109200120023602042001200741016a36020020012009422086200842ffffffff0f83843703082003100220020d010c020b41002102200310024100450d010b20022103034020022802b8032202450d02200310022002210320020d000b0b20014190016a24000f0b2003100220014190016a24000b080041ec3a1054000b950301067f230041106b22022400200241003a000b2002410b6a20012802002203200128020422044100472205101e1a2001200420056b22063602042001200320056a22053602000240024002400240024002402004450d0020022d000b2204450d0120044101470d022002410036020c2002410c6a20052006410420064104491b2204101e1a200141046a200620046b3602002001200520046a360200200641034d0d03200041046a200228020c360200200041023a0000200241106a24000f0b200041033a0000200241106a24000f0b200110212203450d0320022003360204200141046a22062802002104200241003a000b2002410b6a2001280200220720044100472205101e1a2006200420056b3602002001200720056a3602002004450d0220022d000b220141034f0d02200020013a0001200041013a0000200041046a2003360200200241106a24000f0b200041033a0000200241106a24000f0b200041033a0000200241106a24000f0b200041033a0000200241046a1022200241106a24000f0b200041033a0000200241106a24000bc905020f7f037e23004180016b22022400200241e0006a10302002280260220320022802681031210402402002280264450d00200310020b200241003602082002420137030020024100200410860120022802082105024002402004450d00200228020020054105746a2103200241306a41086a2106200241106a41186a2107200241106a41106a2108410021090340200241306a200910320240024002402002280230220a2006280200220b41d02d410041001000417f470d002007420037030020084200370300200241106a41086a420037030020024200370310200941016a210920022802340d010c020b200241e0006a41186a220c4200370300200241e0006a41106a220d4200370300200241e0006a41086a220e420037030020024200370360200a200b200241e0006a412041001000220b417f460d04200b411f4d0d04200241c0006a41186a220b200c290300370300200241c0006a41106a220f200d290300370300200241c0006a41086a2210200e29030037030020022002290360370340200c200b290300370300200d200f290300370300200e201029030037030020022002290340370360200b200c2903002211370300200f200d29030022123703002010200e2903002213370300200241106a41086a2013370300200820123703002007201137030020022002290360221137034020022011370310200941016a21092002280234450d010b200a10020b20032002290310370000200341186a2007290300370000200341106a2008290300370000200341086a200241106a41086a290300370000200341206a210320092004490d000b200520096a21050b200241086a2005360200200241c0006a41086a200536020020022002290300370340200241e0006a200241c0006a10a2012002350268422086200235026084211102402002280244450d00200228024010020b20024180016a240020110f0b41eb1a4133102d000bee0201077f230041206b22022400200141086a28020021032002410036021820024201370310200241106a4100410410272002280210200228021822046a20033600002002200441046a360218200241086a2205200228021836020020022002290310370300024002402003450d0020012802002101200341057421060340412010012203450d022002200336021020024220370214200241106a410041201027200241106a41086a22032003280200220441206a22033602002004200228021022076a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002002280214210420022005280200200310272002280200200528020022086a20072003101e1a2005200820036a36020002402004450d00200710020b200141206a2101200641606a22060d000b0b20002002290300370200200041086a2005280200360200200241206a24000f0b101c000bf80101017f23004180026b22022400024002402001450d00200220003602080c010b200241d02d360208410021010b2002200136020c20024188016a200241086a101d0240200228029001450d00200241106a20024188016a41f800101e1a20024188016a200241106a41f800101e1a20024188016a2002419c016a200241dc016a10a401024020024198016a2802002200450d0020022802900121012000410c6c210003400240200141046a280200450d00200128020010020b2001410c6a2101200041746a22000d000b0b024020024194016a280200450d0020024190016a28020010020b20024180026a240042010f0b4184351054000ba11903017f017e237f230041900d6b220324002003200029030022043703f00c200341106a41086a220042003703002003420037031041d12d4107200341106a1003200341086a220520002903003703002003200329031037030020034110200341f00c6a41081004200042003703002003420037031041d82d4107200341106a10032005200029030037030020032003290310370300200341102001412010040240024002400240410710012200450d002003200036021020034207370214200341106a4100410710272003280210200328021822056a220041002800c72d360000200341f00c6a41086a200541076a2205360200200041046a41002f00cb2d3b0000200041066a41002d00cd2d3a0000200320032903103703f00c20032005360218410810012200450d002003200036021020034208370214200341106a41004108102720032802102205200328021822006a2004427f7c3700002003200041086a220036021820032802142106200341f00c6a20032802f80c2000102720032802f00c220720032802f80c22086a20052000101e1a2003200820006a22003602f80c02402006450d00200510020b20032802f40c2105200341106a41086a220642003703002003420037031020072000200341106a1003200341086a2006290300370300200320032903103703002003411020014120100402402005450d00200710020b200341106a41086a220042003703002003420037031041df2d4107200341106a1003200341086a220120002903003703002003200329031037030020034110200241201004200042003703002003420037031041d12d4107200341106a100320012000290300370300200320032903103703002003411041d02d410041001000417f460d01200342003703100240024020034110200341106a41084100100041016a41084d0d0020032903104200510d04200341106a41086a220042003703002003420037031041d12d4107200341106a1003200341086a2000290300370300200320032903103703002003411041d02d410041001000417f460d052003420037031020034110200341106a41084100100041016a41084d0d012003290310210441002108200341106a410041e00c10171a2004427f7c2104410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f4100212041002121410021224100212341002124410021254100212641002102410021270340200341f00c6a42002004427f7c2004501b220410a801200341106a202722004103704105746a220141186a200341f00c6a41186a290200370000200141106a200341f00c6a41106a290200370000200141086a200341f00c6a41086a290200370000200120032902f00c370000200041016a21274100210141002107024003402000200041036e2205417d6c6a4102470d01200341106a20016a220041df006a2d000022022000411f6a2d000022067120022006722000413f6a2d000071722108200041de006a2d000022022000411e6a2d000022067120022006722000413e6a2d000071722109200041dd006a2d000022022000411d6a2d000022067120022006722000413d6a2d00007172210a200041dc006a2d000022022000411c6a2d000022067120022006722000413c6a2d00007172210b200041db006a2d000022022000411b6a2d000022067120022006722000413b6a2d00007172210c200041da006a2d000022022000411a6a2d000022067120022006722000413a6a2d00007172210d200041d9006a2d00002202200041196a2d00002206712002200672200041396a2d00007172210e200041d8006a2d00002202200041186a2d00002206712002200672200041386a2d00007172210f200041d7006a2d00002202200041176a2d00002206712002200672200041376a2d000071722110200041d6006a2d00002202200041166a2d00002206712002200672200041366a2d000071722111200041d5006a2d00002202200041156a2d00002206712002200672200041356a2d000071722112200041d4006a2d00002202200041146a2d00002206712002200672200041346a2d000071722113200041d3006a2d00002202200041136a2d00002206712002200672200041336a2d000071722114200041d2006a2d00002202200041126a2d00002206712002200672200041326a2d000071722115200041d1006a2d00002202200041116a2d00002206712002200672200041316a2d000071722116200041d0006a2d00002202200041106a2d00002206712002200672200041306a2d000071722117200041cf006a2d000022022000410f6a2d000022067120022006722000412f6a2d000071722118200041ce006a2d000022022000410e6a2d000022067120022006722000412e6a2d000071722119200041cd006a2d000022022000410d6a2d000022067120022006722000412d6a2d00007172211a200041cc006a2d000022022000410c6a2d000022067120022006722000412c6a2d00007172211b200041cb006a2d000022022000410b6a2d000022067120022006722000412b6a2d00007172211c200041ca006a2d000022022000410a6a2d000022067120022006722000412a6a2d00007172211d200041c9006a2d00002202200041096a2d00002206712002200672200041296a2d00007172211e200041c8006a2d00002202200041086a2d00002206712002200672200041286a2d00007172211f200041c7006a2d00002202200041076a2d00002206712002200672200041276a2d000071722120200041c6006a2d00002202200041066a2d00002206712002200672200041266a2d000071722121200041c5006a2d00002202200041056a2d00002206712002200672200041256a2d000071722122200041c4006a2d00002202200041046a2d00002206712002200672200041246a2d000071722123200041c3006a2d00002202200041036a2d00002206712002200672200041236a2d000071722124200041c2006a2d00002202200041026a2d00002206712002200672200041226a2d000071722125200041c1006a2d00002202200041016a2d00002206712002200672200041216a2d000071722126200041c0006a2d0000220220002d00002206712002200672200041206a2d000071722102200141800c460d01200341106a20012005410574200541036e41e0006c6b6a6a220041e1006a20263a0000200041e0006a20023a0000200041e2006a20253a0000200041e3006a20243a0000200041e4006a20233a0000200041e5006a20223a0000200041e6006a20213a0000200041e7006a20203a0000200041e8006a201f3a0000200041e9006a201e3a0000200041ea006a201d3a0000200041eb006a201c3a0000200041ec006a201b3a0000200041ed006a201a3a0000200041ee006a20193a0000200041ef006a20183a0000200041f0006a20173a0000200041f1006a20163a0000200041f2006a20153a0000200041f4006a20133a0000200041f3006a20143a0000200041f5006a20123a0000200041f6006a20113a0000200041f7006a20103a0000200041f8006a200f3a0000200041f9006a200e3a0000200041fa006a200d3a0000200041fb006a200c3a0000200041fc006a200b3a0000200041fd006a200a3a0000200041fe006a20093a0000200041ff006a20083a0000200141e0006a210120052100200741016a22074111490d000b0b202741d100470d000b200320263a00f10c200320023a00f00c200320253a00f20c200320243a00f30c200320233a00f40c200320223a00f50c200320213a00f60c200320203a00f70c2003201f3a00f80c2003201e3a00f90c2003201d3a00fa0c2003201c3a00fb0c2003201b3a00fc0c2003201a3a00fd0c200320193a00fe0c200320183a00ff0c200320173a00800d200320163a00810d200320153a00820d200320133a00840d200320143a00830d200320123a00850d200320113a00860d200320103a00870d2003200f3a00880d2003200e3a00890d2003200d3a008a0d2003200c3a008b0d2003200b3a008c0d2003200a3a008d0d200320093a008e0d200320083a008f0d200341106a41086a220042003703002003420037031041e62d4107200341106a1003200341086a220120002903003703002003200329031037030020034110200341f00c6a41201004200341003602f00c200042003703002003420037031041ed2d4107200341106a1003200120002903003703002003200329031037030020034110200341f00c6a41041004200341900d6a24000f0b41c1214133102d000b41c1214133102d000b101c000b41f4214122102d000b4184c200103b000b41f4214122102d000ba80601057f230041d0096b22022400024002402001450d00200220003602080c010b200241d02d360208410021010b2002200136020c200241a0066a200241086a10200240024020022d00a8064107460d00200241106a200241a0066a418003101e1a20024190036a200241106a418003101e1a20024190066a20024190036a1026200241a0066a41086a22014200370300200242003703a00641ed2d4107200241a0066a1003200241b0096a41086a2001290300370300200220022903a0063703b009200241b0096a411041d02d410041001000417f460d01200241003602a00602400240200241b0096a4110200241a0066a41044100100041016a41044d0d0020022802a0062103200241a0096a41086a20024190066a41086a28020036020020022002290390063703a009410710012201450d01200220013602a006200242073702a406200241a0066a41004107102720022802a00620022802a80622006a220141002800e02e360000200241b0096a41086a200041076a2200360200200141046a41002f00e42e3b0000200141066a41002d00e62e3a0000200220022903a0063703b009200220003602a806410410012201450d01200220013602a006200242043702a406200241a0066a41004104102720022802a006220020022802a80622016a20033600002002200141046a22013602a80620022802a4062104200241b0096a20022802b8092001102720022802b009220320022802b80922056a20002001101e1a2002200520016a22053602b80902402004450d00200010020b20022802b4092100200241c0096a200241a0096a105120022802c809210420022802c0092101200241a0066a41086a22064200370300200242003703a00620032005200241a0066a1003200241b0096a41086a2006290300370300200220022903a0063703b009200241b0096a4110200120041004024020022802c409450d00200110020b02402000450d00200310020b024020022802a409450d0020022802a00910020b200241a0066a20024190036a418003101e1a200241a0066a10a601200241d0096a240042010f0b41c1214133102d000b101c000b4184351054000b41f4214122102d000bec0e04037f017e037f017e230041a0086b2201240020014180036a2000418003101e1a200141386a4200370300200141306a4200370300200141286a4200370300200141206a4200370300200141186a4200370300200141106a4200370300200141086a42003703002001420037030002400240024002400240200141c0056a200141c0001006450d00200141a0056a21000c010b20014188066a41186a420037030020014188066a41106a420037030020014188066a41086a42003703002001420037038806200141a0056a220020014188066a41201006450d010b2001410036029006200142013703880620014188066a41004120102720012802880620012802900622026a22032000290000370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a2900003700002001200241206a220036029006200129038003210420014188066a20004108102720012802880620012802900622006a20043700002001200041086a220236029006200120014180036a41086a10282001280200210320014188066a20022001280208220010272001200020012802900622056a220636029006200520012802880622026a20032000101e1a02402001280204450d00200310020b200128028c06210020022006200141c0056a200141a0056a1015210302402000450d00200210020b200120014180036a418003101e1a20030d010c020b200120014180036a418003101e1a0c010b41bc3a103b000b20014180036a2001418003101e1a200141186a4200370300200141106a4200370300200141086a420037030020014200370300024002400240024002400240024002400240200141a0056a2200200141201006450d00200010c001200129038003520d06200010c0012104410710012203450d04200120033602002001420737020420014100410710272001280200200128020822026a220341002800d92e36000020014188066a41086a200241076a2202360200200341046a41002f00dd2e3b0000200341066a41002d00df2e3a0000200120012903003703880620012002360208412010012203450d04200442017c21042001200336020020014220370204200141004120102720012802002202200128020822056a22032000290000370000200341086a200041086a290000370000200341106a200041106a290000370000200341186a200041186a2900003700002001200541206a22033602082001280204210620014188066a20012802900620031027200128028806220520012802900622076a20022003101e1a2001200720036a22073602900602402006450d00200210020b200128028c0621022001200437038006200141086a2203420037030020014200370300200520072001100320014188066a41086a22062003290300370300200120012903003703880620014188066a411020014180066a4108100402402002450d00200510020b200010432104200342003703002001420037030041bf2041072001100320062003290300370300200120012903003703880620014188066a411041d02d410041001000417f460d072001420037030020014188066a4110200141084100100041016a41084d0d02200420012903002208540d08410810012203450d04200120033602002001420837020420014100410810272001280200200128020822036a42f3e885d3a3ac98b63a3700002001200341086a36020820014188066a41086a20012802083602002001200129030037038806412010012203450d04200420087d21042001200336020020014220370204200141004120102720012802002202200128020822056a22032000290000370000200341086a200041086a290000370000200341106a200041106a290000370000200341186a200041186a2900003700002001200541206a22003602082001280204210320014188066a20012802900620001027200128028806220520012802900622066a20022000101e1a2001200620006a22003602900602402003450d00200210020b200128028c0621022001200437038006200141086a2203420037030020014200370300200520002001100320014188066a41086a2003290300370300200120012903003703880620014188066a411020014180066a4108100420014188066a2103200121002002450d01200510020c010b2001210020014188066a21030b200120014180036a41c002101e22014188066a200141086a419802101e1a20014188066a200141a0026a10c101200041086a220242003700002000420037000041ed2d410720001003200341086a2002290000370000200320002900003700002003411041d02d410041001000417f460d032001410036020020034110200141044100100041016a41044d0d012001200128020041016a36028006200041086a220242003700002000420037000041ed2d410720001003200341086a2002290000370000200320002900003700002003411020014180066a41041004200141a0086a24000f0b41c1214133102d000b41c1214133102d000b101c000b41f4214122102d000b41d43a103b000b41f4214122102d000b41fc3c103b000bc51505047f017e027f017e027f23004190096b22022400024002402001450d00200220003602000c010b200241d02d360200410021010b20022001360204200241f0056a2002101d20024180066a280200210320022802fc05210420022802f805210520022903f0052106200241f8016a20024184066a41e400101e1a024002400240024002400240024002402005450d00200241f0006a200241f8016a41e400101e1a200241f8046a200241f0006a41e400101e1a200241003602f005200241f0056a2002280200220720022802042201410420014104491b2200101e1a2002200120006b3602042002200720006a3602000240200141034d0d0020022802f0052208ad4280037e2209422088a70d082009a72201417f4c0d07024002402001450d002001100122070d01101c000b410821070b2002200836020c20022007360208410021012002410036021002402008450d00200241f0056a41086a210a410021000340200241f0056a2002102002400240200a2d00004107460d00200041016a2100200241f8016a200241f0056a418003101e1a2001200228020c470d01200241086a106c200241086a41086a2802002101200228020821070c010b02402001450d0020014180036c2100200741186a210103400240200141706a2d00002208411d74411d75417f4a0d000240024020084105460d0020084104470d01200141786a2d00004101470d022001417c6a220828020010382008280200100220014180036a2101200041807d6a22000d030c040b200141786a2d00004101470d012001280200450d012001417c6a280200100220014180036a2101200041807d6a22000d020c030b200141746a2d00004101470d00200141786a220828020010382008280200100220014180036a2101200041807d6a22000d010c020b20014180036a2101200041807d6a22000d000b0b200228020c450d03200710020c030b200720014180036c6a200241f8016a418003101e1a200241086a41086a200141016a220136020020002008490d000b0b2007450d00200229020c2109200241f0056a200241f8046a41e400101e1a2005450d01200241086a200241f0056a41e400101e1a200241fc006a200436020020024180016a2003360200200220053602782002200637037020024184016a200241086a41e400101e2101200241ec016a2009370200200220073602e801200241f0006a2001200241c4016a220310a40120022903702206500d06200241f0056a2006427f7c10a801200241f0056a2001412010060d06200241e8016a2802002100200241f0016a28020021012002410036028005200242043703f804200241f8046a20014180036c22084180036d108401200228028005210720022802f8042105024002402001450d0020052007410c6c6a21010340200241f0056a2000102620022802f005450d0220004180036a2100200241f8016a41086a220a200241f0056a41086a280200360200200220022903f0053703f801200141086a200a280200360200200120022903f801370200200741016a21072001410c6a2101200841807d6a22080d000b0b200241003602f0050b20024180056a200736020020022802fc042108200241f8016a200520052007410c6c6a10a901200241f0056a20022802f8012201200228028002104c024020022802fc01450d00200110020b02402007450d002007410c6c21002005210103400240200141046a280200450d00200128020010020b2001410c6a2101200041746a22000d000b0b02402008450d00200510020b02402003200241f0056a41201006450d0041d90a410e1008200341201013200241f0056a412010130b200241c4016a200241f0056a412010060d05200241ec016a2802002104200241f0006a41f8006a2802002105200241f0016a280200210a200241f8046a200241f0006a41f800101e1a2005200a4180036c6a210720052101200a450d03200241f0056a41096a2108200521010340200141086a2d0000210020012903002106200241f8016a200141096a41f702101e1a20004107460d03200241f0056a41086a20003a0000200220063703f0052008200241f8016a41f702101e1a200241f0056a10a60120014180036a22012007470d000c050b0b02402003450d002003410c6c21012005210203400240200241046a280200450d00200228020010020b2002410c6a2102200141746a22010d000b0b2004450d00200510020b4184351054000b20014180036a21010b20012007460d002005200a4180036c6a210803402001220041086a2d000022074107460d0120004180036a210102402007411d74411d75417f4a0d00200041146a2800002103200041106a280000210a02400240200741077122074105460d0020074104470d01200a41ff01714101470d02200310382003100220082001470d030c040b200a41ff01714101470d01200041186a280000450d012003100220082001470d020c030b2000410c6a2d000041ff01714101470d00200a1038200a100220082001470d010c020b20082001470d000b0b02402004450d00200510020b1034200241f0056a41086a22014200370300200242003703f00541e72e4107200241f0056a1003200241f8016a41086a2001290300370300200220022903f0053703f8014100210b02400240024002400240200241f8016a411041d02d410041001000417f460d00200242103702f4082002200241f8016a3602f008200241f0056a200241f0086a101620022802f0052204450d02200241f8056a280200210820022802f405210b0c010b41042104410021080b4100210a02400240024002400240024020024188056a2802002008470d000240024002402008450d0020024180056a280200210141002107200421000340200141086a280200220a200041086a280200470d0202402001280200220520002802002203460d0020052003200a10060d040b2001410c6a21012000410c6a2100200741016a22072008490d000b4101210a20080d040c060b4101210a200b0d060c070b20042008410c6c6a21074100210a0c030b4100210a0b2008450d020b20042008410c6c6a21070b2004210103402001410c6a21000240200141046a280200450d00200128020010020b2000210120072000470d000b0b200b450d010b200410020b200a450d01200241f0056a10aa0120022802f8052107024020024180066a2802002201450d002001410c6c21002007210103400240200141046a280200450d00200128020010020b2001410c6a2101200041746a22000d000b0b0240200241fc056a280200450d00200710020b200241f8016a41186a22014200370300200241f8016a41106a22004200370300200241f8016a41086a22074200370300200242003703f801200241f8016a1014200241f0086a41186a2001290300370300200241f0086a41106a2000290300370300200241f0086a41086a2007290300370300200220022903f8013703f0080240200241ac056a2201200241f0086a41201006450d0041d90a410e1008200141201013200241f0086a412010130b2001200241f0086a412010060d02024020024188056a2802002200450d0020024180056a28020021012000410c6c210003400240200141046a280200450d00200128020010020b2001410c6a2101200041746a22000d000b0b024020024184056a280200450d0020024180056a28020010020b20024190096a240042010f0b41c1214133102d000b418c3a103b000b41a43a103b000b41f439103b000b41dc39103b000b105d000b105c000b8b0401067f230041306b22022400024002400240410710012203450d002002200336021020024207370214200241106a4100410710272002280210200228021822046a220341002800c72d360000200241086a200441076a2204360200200341046a41002f00cb2d3b0000200341066a41002d00cd2d3a00002002200229031037030020022004360218410810012203450d002002200336021020024208370214200241106a41004108102720022802102204200228021822036a20013700002002200341086a220336021820022802142105200220022802082003102720022802002206200228020822076a20042003101e1a2002200720036a220736020802402005450d00200410020b20022802042104200241106a41086a220342003703002002420037031020062007200241106a1003200241086a2003290300370300200220022903103703002002411041d02d410041001000417f460d02200241286a4200370300200241106a41106a4200370300200342003703002002420037031020024110200241106a4120410010002203417f460d012003411f4d0d0120002002290310370000200041186a200241106a41186a290300370000200041106a200241106a41106a290300370000200041086a200241106a41086a29030037000002402004450d00200610020b200241306a24000f0b101c000b41c1214133102d000b41f4214122102d000bc50103037f017e027f4100210302400240024002400240200220016b2204450d002004410c6d2205ad4203862206a722044100480d032006422088a74100470d03200410012207450d0420012002470d010c020b410421074100210520012002460d010b4100210320072104034020012802002108200441046a200141086a28020036020020042008360200200441086a2104200341016a21032001410c6a22012002470d000b0b2000200536020420002007360200200020033602080f0b1041000b101c000be40703037f027e057f23004180016b22012400200141e0006a41086a220242003703002001420037036041e62d4107200141e0006a1003200141c0006a41086a2203200229030037030020012001290360370340200141c0006a41101005200242003703002001420037036041ed2d4107200141e0006a10032003200229030037030020012001290360370340200141c0006a41101005200342003703002001420037034041d12d4107200141c0006a100320022003290300370300200120012903403703600240024002400240200141e0006a411041d02d410041001000417f460d0020014200370340200141e0006a4110200141c0006a41084100100041016a41084d0d0220012903402104200141c0006a41086a220242003703002001420037034041d12d4107200141c0006a1003200141e0006a41086a200229030037030020012001290340370360200141e0006a411010054201a7450d010c030b4200a70d020b41f4214122102d000b41c1214133102d000b200141d82d10d901200141c0006a41086a220242003703002001420037034041e72e4107200141c0006a1003200141e0006a41086a20022903003703002001200129034037036041002102024002400240200141e0006a411041d02d410041001000417f460d00200142103702242001200141e0006a360220200141c0006a200141206a101620012802402203450d0220012902442105200141c0006a41086a220242003703002001420037034041e72e4107200141c0006a1003200141e0006a41086a200229030037030020012001290340370360200141e0006a411010052005422088a721022005a721060c010b41042103410021060b200141206a41df2d10d901200141e0006a41186a22074200370300200141e0006a41106a22084200370300200141e0006a41086a2209420037030020014200370360200141e0006a1014200141c0006a41186a220a2007290300370300200141c0006a41106a22072008290300370300200141c0006a41086a2208200929030037030020012001290360370340200020043703002000412c6a200141186a290300370000200041246a200141106a2903003700002000411c6a200141086a29030037000020002001290300370014200020012903403700342000413c6a2008290300370000200041c4006a2007290300370000200041cc006a200a290300370000200020033602082000410c6a2006360200200041106a2002360200200041ec006a200141206a41186a290300370000200041e4006a200141206a41106a290300370000200041dc006a200141206a41086a2903003700002000200129032037005420014180016a24000f0b41c1214133102d000bda10040d7f017e017f017e230041d0016b220224001034200241b0016a41086a22034200370300200242003703b00141ed2d4107200241b0016a1003200241a0016a41086a2003290300370300200220022903b0013703a0010240200241a0016a411041d02d410041001000417f460d00200241003602080240200241a0016a4110200241086a41044100100041016a41044d0d0020022802082104200241003602c801200242043703c001200241c0016a200410840120022802c801210520022802c00121060240024002400240024002402004450d0020062005410c6c6a2107410021080340410710012203450d02200220033602082002420737020c200241086a410041071027200241086a41086a22032003280200220941076a220a360200200920022802086a220b41002800e02e36000020024180016a41086a2209200a360200200b41046a41002f00e42e3b0000200b41066a41002d00e62e3a0000200220022903083703800141041001220b450d022002200b3602082002420437020c200241086a41004104102720032003280200220a41046a220b360200200a2002280208220c6a2008360000200228020c210d20024180016a2009280200200b1027200228028001220a2009280200220e6a200c200b101e1a2009200e200b6a220e3602000240200d450d00200c10020b200228028401210d200241a0016a41086a220b4200370300200242003703a001200a200e200241a0016a10032003200b290300370300200220022903a001370308200241086a411041d02d410041001000417f460d0420024100360280014100200241086a411020024180016a41044100100022032003417f461b220c41034d0d062002280280012203417f4c0d03024002402003450d00200310012209450d0420094100200310171a0c010b410121090b20034100200241086a411020092003200c4104200c4104491b1000220c200c417f461b4b0d052009450d06200841016a21082003ad220f422086200f84210f200b4200370300200242003703a001200a200e200241a0016a1003200241b0016a41086a200b290300370300200220022903a0013703b001200241b0016a411010050240200d450d00200a10020b20072009360200200741046a200f3702002007410c6a210720082004490d000b200520086a21050b200241c8016a200536020020022802c4012108200241086a200620062005410c6c6a10a90120024180016a200228020822032002280210104c0240200228020c450d00200310020b02402005450d002005410c6c21092006210303400240200341046a280200450d00200328020010020b2003410c6a2103200941746a22090d000b0b02402008450d00200610020b200241086a41186a20024180016a41186a290300370300200241086a41106a220920024180016a41106a290300370300200241086a41086a20024180016a41086a22072903003703002002200229038001370308200241b0016a41086a22044200370300200242003703b00141df2d4107200241b0016a1003200241a0016a41086a22082004290300370300200220022903b0013703a001200241a0016a4110200241086a41201004200241086a10aa01200241003602c801200242013703c001200241c0016a41004120102720022802c00120022802c801220b6a2203200229021c370000200341086a200241246a290200370000200341106a2002412c6a290200370000200341186a200241346a2902003700002002200b41206a22033602c8012002290308210f200241c0016a20034108102720022802c00120022802c80122036a200f3700002002200341086a22033602c801200241c0016a20034120102720022802c00120022802c801220b6a2203200229023c370000200341086a200241c4006a290200370000200341106a200241cc006a290200370000200341186a200241d4006a2902003700002002200b41206a22033602c801200241c0016a20034120102720022802c00120022802c801220b6a2203200229025c370000200341086a200241e4006a290200370000200341106a200241ec006a290200370000200341186a200241f4006a2902003700002002200b41206a22103602c801200928020021052002410036028801200242013703800120024180016a41004104102720022802800120022802880122036a20053600002002200341046a36028801200820022802880136020020022002290380013703a00120022802102106024002402005450d002005410c6c210c2006210b0340200241b0016a200b105120042802002203417f4c0d0420022802b001210a024002402003450d002003100122090d010c050b410121090b200741003602002002200336028401200220093602800120024180016a41002003102720072007280200220d20036a2209360200200d200228028001220e6a200a2003101e1a2002280284012103024020022802b401450d00200a10020b200241a0016a20082802002009102720022802a001220d2008280200220a6a200e2009101e1a2008200a20096a220936020002402003450d00200e10020b200b410c6a210b200c41746a220c0d000c020b0b20022802a801210920022802a001210d0b20022802a4012103200241c0016a201020091027200220022802c801220820096a22073602c801200820022802c001220b6a200d2009101e1a02402003450d00200d10020b2007ad422086210f200bad211102402005450d002005410c6c21092006210303400240200341046a280200450d00200328020010020b2003410c6a2103200941746a22090d000b0b200f201184210f0240200241146a280200450d00200610020b200241d0016a2400200f0f0b101c000b1019000b41f4214122102d000b200910020b41c1214133102d000b41c1214133102d000b41f4214122102d000b810101047f230041106b220224002002102f2002280208210302402002280204450d00200228020010020b0240410410012204450d002002200436020020024204370204200241004104102720022802002204200228020822056a20033600002002200541046a2203360208200241106a24002003ad4220862004ad840f0b101c000b4802017f017e230041206b220224002002102f200241106a200210a2012002350218422086200235021084210302402002280204450d00200228020010020b200241206a240020030ba56d09047f027e047f017e0b7f017e027f017e0c7f230041a0016b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a220341044b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e050004020301000b200041106a2802002104200241186a41086a2000410c6a2802003602002002200041046a290200370318200241e8006a41086a220342003703002002420037036841b00f4107200241e8006a1003200241d8006a41086a2205200329030037030020022002290368370358200241d8006a4110200241f8006a410041001000417f470d38200342003703002002420037036841b70f4107200241e8006a10032005200329030037030020022002290368370358200241d8006a411041d02d410041001000417f460d0420024100360278200241d8006a4110200241f8006a41044100100041016a41044d0d4320022802782004470d050c590b200041246a2802002104200041286a290300210c200241c0006a200041196a290000370300200241286a41106a200041116a290000370300200241286a41086a200041096a29000037030020022000290001370328200241e8006a41086a220342003703002002420037036841b70f4107200241e8006a1003200241d8006a41086a200329030037030020022002290368370358410021030240200241d8006a411041d02d410041001000417f460d0020024100360278200241d8006a4110200241f8006a41044100100041016a41044d0d42200228027821030b20032004470d36200241e8006a41086a220342003703002002420037036841b00f4107200241e8006a1003200241d8006a41086a200329030037030020022002290368370358200241d8006a411041d02d410041001000417f460d352002200241d8006a3602682002411036026c2002420037037820024100200241d8006a4110200241f8006a41084100100022032003417f461b22034108200341084922041b220336027020040d3e20024100360278200241f0006a4100200241d8006a4110200241f8006a41042003100022042004417f461b22044104200441044922041b20036a36020020040d3e200241f8006a200241e8006a103a2002280278220d450d3e200241f8006a41086a280200210e200228027c210f200241e8006a41086a22034200370300200242003703684181114107200241e8006a1003200241d8006a41086a200329030037030020022002290368370358200241d8006a411041d02d410041001000417f460d34200241003602784100200241d8006a4110200241f8006a41044100100022032003417f461b220441034d0d4a20022802782209ad2206421d88a70d332006420386a72203417f4c0d322003450d052003100122100d060c5a0b200041046a2802002103200241e8006a41086a220442003703002002420037036841b00f4107200241e8006a1003200241d8006a41086a200429030037030020022002290368370358200241d8006a4110200241f8006a410041001000417f470d30200110af01450d2f200241e8006a41086a220442003703002002420037036841c50f4107200241e8006a1003200241d8006a41086a200429030037030020022002290368370358200241d8006a411041d02d410041001000417f460d392002421037022c2002200241d8006a360228200241f8006a200241286a103a20022802782204450d2e20024180016a280200220520034d0d39200228027c21080240200420034105746a22092001460d0020092001412010060d1c0b2002200836027c20022004360278200220053602800120012003200241f8006a10b001200241e8006a41086a220342003703002002420037036841be0f4107200241e8006a1003200241d8006a41086a200329030037030020022002290368370358200241d8006a411041d02d410041001000417f460d2d20024200370378200241d8006a4110200241f8006a41084100100041016a41084d0d472002290378210620012001104422072006200720072006561b22067d10b101200110432107410810012203450d59200220033602782002420837027c200241f8006a410041081027200228027820022802800122036a42f3e885d3a3ac98b63a3700002002200341086a36028001200241286a41086a20022802800136020020022002290378370328412010012203450d59200720067c2106200220033602782002422037027c200241f8006a4100412010272002280278220420022802800122056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a220336028001200228027c2108200241286a20022802302003102720022802282205200228023022016a20042003101e1a2002200120036a220336023002402008450d00200410020b200228022c210820022006370378200241e8006a41086a220442003703002002420037036820052003200241e8006a1003200241d8006a41086a200429030037030020022002290368370358200241d8006a4110200241f8006a41081004410121042008450d58200510020c580b200041046a2802002103410710012204450d58200220043602782002420737027c200241f8006a410041071027200228027820022802800122056a220441002800bf10360000200241286a41086a200541076a2205360200200441046a41002f00c3103b0000200441066a41002d00c5103a0000200220022903783703282002200536028001412010012204450d58200220043602782002422037027c200241f8006a4100412010272002280278220520022802800122086a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002002200841206a220436028001200228027c2109200241286a200228023020041027200228022822082002280230220a6a20052004101e1a2002200a20046a220436023002402009450d00200510020b200228022c2105200241e8006a41086a220942003703002002420037036820082004200241e8006a1003200241d8006a41086a200929030037030020022002290368370358200241d8006a4110200241f8006a410041001000210402402005450d00200810020b2004417f470d2b200241e8006a41086a220442003703002002420037036841c6104107200241e8006a1003200241d8006a41086a200429030037030020022002290368370358200241d8006a411041d02d410041001000417f460d2a20024200370378200241d8006a4110200241f8006a41084100100041016a41084d0d452001200229037810b201450d29200241e8006a41086a220442003703002002420037036841cd104107200241e8006a1003200241d8006a41086a200429030037030020022002290368370358410021050240200241d8006a411041d02d410041001000417f460d0020024100360278200241d8006a4110200241f8006a41044100100041016a41044d0d3f200228027821050b200241e8006a41086a2204420037030020024200370368418d104107200241e8006a1003200241d8006a41086a20042903003703002002200229036837035841002109200241d8006a411041d02d410041001000417f460d052002421037022c2002200241d8006a360228200241f8006a200241286a103a20022802782208450d1920024180016a2802002104200228027c210920052003470d4e0c4d0b2000412c6a2802002103200041286a2802002111200041246a2802002112200241c0006a200041196a290000370300200241286a41106a200041116a290000370300200241286a41086a200041096a29000037030020022000290001370328200241e8006a41086a220442003703002002420037036841b00f4107200241e8006a1003200241d8006a41086a200429030037030020022002290368370358200241d8006a4110200241f8006a410041001000417f470d27200241086a200110b30120022802084101470d262002200241286a10b3012002280200450d252002280204210e200241e8006a41086a220442003703002002420037036841b70f4107200241e8006a1003200241d8006a41086a200429030037030020022002290368370358410021040240200241d8006a411041d02d410041001000417f460d0020024100360278200241d8006a4110200241f8006a41044100100041016a41044d0d3d200228027821040b20042003470d24200241e8006a41086a22044200370300200242003703684186104107200241e8006a1003200241d8006a41086a200429030037030020022002290368370358200241d8006a411041d02d410041001000417f460d2320024100360278200241d8006a4110200241f8006a41044100100041016a41044d0d41200e200320022802786b4f0d22200241e8006a41086a220342003703002002420037036841c50f4107200241e8006a1003200241d8006a41086a200329030037030020022002290368370358200241d8006a411041d02d410041001000417f460d3a2002421037026c2002200241d8006a360268200241f8006a200241e8006a103a20022802782213450d2120024180016a280200221420124d0d3a200228027c21150240201320124105746a22032001460d0020032001412010060d3b0b201420114d0d360240201320114105746a2203200241286a460d002003200241286a412010060d370b200241c8006a200241286a10b4012002280250210320022802482105200241e8006a41086a2204420037030020024200370368418d104107200241e8006a1003200241d8006a41086a20042903003703002002200229036837035841002116200241d8006a411041d02d410041001000417f460d052002421037026c2002200241d8006a360268200241f8006a200241e8006a103a20022802782217450d17200228027c211620024180016a28020041057441057522042003200320044b1b22080d060c070b41002004460d540b41dc351054000b410821100b2002200936027c20022010360278200241003602800102402009450d002004410420044104491b210441002103410021050340200242003703684100200241d8006a4110200241e8006a41082004100022082008417f461b220841074d0d442008410820084108491b2108200541016a21052002290368210602402003200228027c470d00200241f8006a1071200241f8006a41086a2802002103200228027821100b200820046a2104201020034103746a2006370300200241f8006a41086a200341016a220336020020052009490d000b200228027821100b2010450d43200229027c2118200241e8006a41086a220342003703002002420037036841c50f4107200241e8006a1003200241d8006a41086a20032903003703002002200229036837035841002119200241d8006a411041d02d410041001000417f460d042002421037026c2002200241d8006a360268200241f8006a200241e8006a103a2002280278221a450d1220024180016a280200210b200228027c21190c050b410121084100210420052003460d470c480b4101211741002003200341004b1b2208450d010b4100210420024190016a210920024188016a210a20024180016a210b2017210303400240200520046a2d0000450d0020094200370300200a4200370300200b420037030020024200370378200241f8006a2003460d002003200241f8006a41201006450d00200241f8006a200310b50120022802784101470d3b200228027c200e4d0d050b200341206a2103200441016a22042008490d000b0b410021032016450d430c420b4101211a4100210b0b200241e8006a41086a22034200370300200242003703684188114107200241e8006a1003200241d8006a41086a200329030037030020022002290368370358200241d8006a411041d02d410041001000417f460d1620024200370378200241d8006a4110200241f8006a41084100100041016a41084d0d392002290378210620011043200110447c2006200bad7e221b540d15200241e8006a41086a2203420037030020024200370368418f114107200241e8006a1003200241d8006a41086a200329030037030020022002290368370358200241d8006a411041d02d410041001000417f460d142002421037026c2002200241d8006a360268200241f8006a200241e8006a10b60120022802782217450d1320024180016a280200221c450d122017290300200c5a0d11200228027c211d200241f8006a104720022802782209200228028001221141286c22056a210a41002103200921040240024002400240200541286d4104490d0020092105410021030340200241286a20052204460d0220032004200241286a4120100622054100476a21032005450d02200441286a2205200241286a460d0220032005200241286a4120100622084100476a21032008450d02200541286a2205200241286a460d0220032005200241286a4120100622084100476a21032008450d02200541286a2205200241286a460d0220032005200241286a4120100622084100476a21032008450d02200a200541286a22056b41286d41034b0d000b200441a0016a21040b02402004200a460d002009201141286c6a21080340200241286a2004460d0220032004200241286a4120100622054100476a21032005450d022008200441286a2204470d000b0b41000d010c020b4101450d010b2003200e4f0d0c0b0240200228027c450d00200910020b200241f8006a200241286a10b50120022802784101470d10024002402018421d88a74103752203200b4105744105752204200420034b1b2208450d0020024180016a2802002109200228027c210a4200210741002104201a210320102105034020052903002106200241106a200310b301200441016a21040240024020022802104101470d002002280214200a490d00200241f8006a200310b4010240200241f8006a41086a28020020094d0d002002280278220e20096a2d0000210b0240200228027c450d00200e10020b200b41ff01710d020c010b200228027c450d00200228027810020b420021060b200341206a2103200541086a2105200620077c210720042008490d000c020b0b420021070b2017201c41286c22056a21042017210302400240200541286d4104490d00200241206a2105200241786a2108200241506a2109200241a87f6a210a20172103034020052003460d02200341086a200241286a41201006450d0220082003460d02200341306a200241286a41201006450d0220092003460d02200341d8006a200241286a41201006450d02200a2003460d0220034180016a200241286a41201006450d022004200341a0016a22036b41286d41034b0d000b0b024020032004460d002017201c41286c6a2105200241206a2104034020042003460d02200341086a200241286a41201006450d022005200341286a2203470d000b0b2007200c520d00200241f8006a41186a2203200241286a41186a290300370300200241f8006a41106a2204200241286a41106a290300370300200241f8006a41086a2205200241286a41086a290300370300200220022903283703782017200c370300201741206a2003290300370300201741186a2004290300370300201741106a200529030037030020172002290378370308201c41144b0d02201c41014d0d03201c417f6a21092017201c41286c6a41586a210e0340201c20092203417f6a2209490d2d0240201c20096b22084102490d002017200341286c6a22052903002017200941286c6a220b29030022065a0d00200b2005290300370300200b2903082107200b41086a200541086a290300370300200241f8006a41186a2211200b41206a2203290300370300200241f8006a41106a2212200b41186a2204290300370300200241f8006a41086a2213200b41106a22012903003703002001200541106a2903003703002004200541186a2903003703002003200541206a2903003703002002200737037841012101024020084103490d0041012104200e21030340200441016a220120084f0d340240200341286a220529030020065a0d00200420084f0d34200341206a200341c8006a290300370300200341186a200341c0006a290300370300200341106a200341386a290300370300200341086a200341306a29030037030020032005290300370300200441026a210a2001210420052103200a2008490d010c020b0b20042101200321050b20052006370300200b200141286c6a22032002290378370308200341206a2011290300370300200341186a2012290300370300200341106a20132903003703000b200e41586a210e20090d000c040b0b200110432106410810012203450d4d200220033602782002420837027c200241f8006a410041081027200228027820022802800122036a42f3e885d3a3ac98b63a3700002002200341086a36028001200241e8006a41086a20022802800136020020022002290378370368412010012203450d4d2006201b20062006201b561b220c7d2107200220033602782002422037027c200241f8006a4100412010272002280278220420022802800122056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a220336028001200228027c2108200241e8006a20022802702003102720022802682205200228027022096a20042003101e1a2002200920036a220336027002402008450d00200410020b200228026c210420022007370378200241e8006a41086a220842003703002002420037036820052003200241e8006a1003200241d8006a41086a200829030037030020022002290368370358200241d8006a4110200241f8006a4108100402402004450d00200510020b0240201b2006580d002001200110442206201b200c7d2207200620062007561b7d10b1010b0240201d450d00201710020b02402019450d00201a10020b2018a7450d3f0c3e0b4101210320160d3f0c400b201c410176221ead42287e2206422088a70d082006a72203417f4c0d074108211f02402003450d0020031001221f450d4c0b410021042002410036027020024204370368201741586a2120201741887f6a212141042105200241e8006a41086a2115201c211603402016210e410021164101210802400240024002400240024002400240200e417f6a2203450d0002400240024002400240024002402017200341286c6a2903002017200e417e6a220841286c6a29030022065a0d00410021092008450d022021200e41286c6a210303402006200329030022075a0d02200341586a2103200721062008417f6a22080d000c030b0b02402008450d002021200e41286c6a2103410221080340200620032903002207540d04200341586a210320072106200e200841016a2208470d000b41002116200e21082004200228026c470d0e0c0d0b41022108410021162004200228026c470d0d0c0c0b200821090b200e2009490d02200e201c4b0d090240200e20096b2208410176220a450d002020200e41286c6a21032017200941286c6a21010340200241f8006a41206a220b200141206a2211290300370300200241f8006a41186a2212200141186a2213290300370300200241f8006a41106a2214200141106a2216290300370300200241f8006a41086a2222200141086a222329030037030020022001290300370378200341086a22242903002106200341106a22252903002107200341186a2226290300211b2003290300210c2011200341206a22272903003703002013201b37030020162007370300202320063703002001200c3703002027200b29030037030020262012290300370300202520142903003703002024202229030037030020032002290378370300200341586a2103200141286a2101200a417f6a220a0d000b0b2009450d010c030b200e20086b22090d020b200921160c020b2009200e1055000b0240200841094b0d00200e201c4b0d042017200941286c6a21120340200e2009417f6a2216490d060240200e20166b22084102490d002017200941286c6a22092903002017201641286c6a221129030022065a0d002011200929030037030020112903082107201141086a200941086a290300370300200241f8006a41186a2213201141206a2203290300370300200241f8006a41106a2214201141186a2201290300370300200241f8006a41086a2222201141106a220a290300370300200a200941106a2903003703002001200941186a2903003703002003200941206a290300370300200220073703784101210a024020084103490d0041012101201221030340200141016a220a20084f0d060240200341286a220929030020065a0d00200120084f0d08200341206a200341c8006a290300370300200341186a200341c0006a290300370300200341106a200341386a290300370300200341086a200341306a29030037030020032009290300370300200141026a210b200a210120092103200b2008490d010c020b0b2001210a200321090b200920063703002011200a41286c6a22032002290378370308200341206a2013290300370300200341186a2014290300370300200341106a20222903003703000b2016450d02201241586a2112201621092008410a490d000c020b0b200921162004200228026c470d070c060b2004200228026c460d050c060b41ccc100200141016a2008103c000b41dcc10020012008103c000b200e2009417f6a22164f0d010b2016200e1055000b200e201c1029000b200241e8006a107a20152802002104200228026821050b200520044103746a22032008360204200320163602002015200441016a2204360200024020044102490d00200228026821050340024002400240024020052004417f6a4103746a2203280200450d00200520044103746a220941746a2802002201200328020422084d0d00200441024d0d0520052004417d6a22124103746a2802042203200820016a4d0d01200441034d0d05200941646a280200200320016a4d0d010c050b20044103490d012003280204210820052004417d6a22124103746a28020421030b20032008490d010b2004417e6a21120b2004201241016a22134d0d04200420124d0d052005201241037422226a2203280204222320032802006a22032005201341037422246a22042802002214490d062003201c4b0d072017201441286c6a220e2004280204221141286c22046a2108200341286c210502400240024002400240200320146b220920116b220320114f0d00201f2008200341286c2204101e220b20046a210120114101480d0120034101480d01202020056a21052008210303402005200341586a2208200141586a22092009290300200829030054220a1b2204290300370300200541206a200441206a290300370300200541186a200441186a290300370300200541106a200441106a290300370300200541086a200441086a29030037030020012009200a1b2101200e20082003200a1b22034f0d04200541586a2105200b2104200b2001490d000c050b0b201f200e2004101e220320046a210120114101480d01200920114c0d01201720056a210a20032104200e21030340200320082004200829030020042903005422091b2205290300370300200341206a200541206a290300370300200341186a200541186a290300370300200341106a200541106a290300370300200341086a200541086a2903003703002004200441286a20091b2104200341286a2103200841286a200820091b2208200a4f0d04200120044b0d000c040b0b200821030c010b200e21030b201f21040b20032004200120046b220520054128706b101e1a2015280200220320124d0d082002280268220520226a2204202320116a36020420042014360200200320134d0d09200520246a2204200441086a200320136b41037441786a10391a20152003417f6a2204360200200441014b0d000b0b20160d000b0240200228026c450d00200228026810020b201e450d00201f10020b2002201d36027c200220173602782002201c36028001200241f8006a10b7010240201d450d00201710020b02402019450d00201a10020b2018a70d3b0c3c0b41acc10020132004103c000b41acc10020122004103c000b201420031055000b2003201c1029000b41bcc10020122003103c000b41b4c300103b000b105f000b105e000b418439103b000b41c1214133102d000b41c1214133102d000b41c1214133102d000b41d437103b000b41ce114123102d000b41ec38103b000b41cc3641004100103c000b41c1214133102d000b4196114131102d000b41d438103b000b41f4214122102d000b41c1214133102d000b41b436103b000b41f4214122102d000b419c36103b000b41da0f412c102d000b418436103b000b41ec35103b000b418438103b000b41f4214122102d000b41ec37103b000b41f4214122102d000b41c1214133102d000b41a437103b000b418c37103b000b1063000b1062000b41f4214122102d000b41d410412d102d000b41c4381054000b41c435103b000b2009201c1055000b41f436103b000b41bc37103b000b41dcc10020042008103c000b41ccc100200441016a2008103c000b41dc36103b000b41c1214133102d000b41c1214133102d000b41c1214133102d000b41c1214133102d000b41c1214133102d000b419410412b102d000b41c1214133102d000b41ac35103b000b41c1214133102d000b41c1214133102d000b41c1214133102d000b200228027c450d00201010020b41c1214133102d000b201010020b200f450d09200d10020c090b201710020b0240200228024c450d00200510020b2002201536027c2002201336027820022014360280012001200241286a20031b2012201120031b200241f8006a10b001200241e8006a41086a220442003703002002420037036841be0f4107200241e8006a1003200241d8006a41086a2004290300370300200220022903683703580240200241d8006a411041d02d410041001000417f460d00200242003703780240200241d8006a4110200241f8006a41084100100041016a41084d0d002002290378210602402003450d0020012001104422072006200720072006561b7d10b1010c0a0b200241286a200241286a104422072006200720072006561b22067d10b101200110432107410810012203450d0d200220033602782002420837027c200241f8006a410041081027200228027820022802800122036a42f3e885d3a3ac98b63a3700002002200341086a36028001200241e8006a41086a20022802800136020020022002290378370368412010012203450d0d200720067c2106200220033602782002422037027c200241f8006a4100412010272002280278220420022802800122056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a220336028001200228027c2108200241e8006a20022802702003102720022802682205200228027022016a20042003101e1a2002200120036a220336027002402008450d00200410020b200228026c210420022006370378200241e8006a41086a220842003703002002420037036820052003200241e8006a1003200241d8006a41086a200829030037030020022002290368370358200241d8006a4110200241f8006a410810042004450d09200510020c090b41c1214133102d000b41f4214122102d000b20042003460d010b200420034d0d0120024190016a420037030020024188016a420037030020024180016a420037030020024200370378200820034105746a220a200241f8006a460d00200a200241f8006a412010060d010b2002200936024c20022008360248200220043602500240024020042003470d00200241f8006a41186a2204200141186a290000370300200241f8006a41106a220b200141106a290000370300200241f8006a41086a220e200141086a290000370300200220012900003703782003210a20032009460d010c040b200241f8006a41186a2209200141186a290000370300200241f8006a41106a220a200141106a290000370300200241f8006a41086a220b200141086a29000037030020022001290000370378200420034d0d02200820034105746a22042002290378370000200441186a2009290300370000200441106a200a290300370000200441086a200b2903003700000c040b200241c8006a107c200241c8006a41086a280200210a200228024821080c020b419c38103b000b41b43820032004103c000b200e2903002106200b29030021072004290300211b2008200a4105746a22042002290378370000200441186a201b370000200441106a2007370000200441086a2006370000200241c8006a41086a200a41016a3602000b200241286a41086a200241c8006a41086a28020036020020022002290348370328200241f8006a200241286a10a201200228028001210820022802782104200241e8006a41086a2209420037030020024200370368418d104107200241e8006a1003200241d8006a41086a200929030037030020022002290368370358200241d8006a41102004200810040240200228027c450d00200410020b0240200228022c450d00200228022810020b2002200541016a360278200241e8006a41086a220442003703002002420037036841cd104107200241e8006a1003200241d8006a41086a2205200429030037030020022002290368370358200241d8006a4110200241f8006a41041004200442003703002002420037036841b70f4107200241e8006a10032005200429030037030020022002290368370358410021050240200241d8006a411041d02d410041001000417f460d0020024100360278200241d8006a4110200241f8006a41044100100041016a41044d0d02200228027821050b410710012204450d04200220043602782002420737027c200241f8006a410041071027200228027820022802800122086a220441002800bf10360000200241286a41086a200841076a2208360200200441046a41002f00c3103b0000200441066a41002d00c5103a0000200220022903783703282002200836028001412010012204450d04200220043602782002422037027c200241f8006a4100412010272002280278220820022802800122096a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002002200941206a220436028001200228027c2109200241286a200228023020041027200228022822012002280230220a6a20082004101e1a2002200a20046a220a36023002402009450d00200810020b200228022c2108200241003602800120024201370378200241f8006a410041041027200228027820022802800122046a20053600002002200441046a220436028001200241f8006a2004410410272002280278220420022802800122056a20033600002002200541046a220336028001200241e8006a41086a22054200370300200242003703682001200a200241e8006a1003200241d8006a41086a200529030037030020022002290368370358200241d8006a41102004200310040240200228027c450d00200410020b2008450d00200110020b410121040c020b41c1214133102d000b0240200110af010d00200241e8006a41086a220342003703002002420037036841be0f4107200241e8006a1003200241d8006a41086a2003290300370300200220022903683703580240024002400240200241d8006a411041d02d410041001000417f460d00200242003703780240200241d8006a4110200241f8006a41084100100041016a41084d0d00200229037821062001104322072006540d02410810012203450d07200220033602782002420837027c200241f8006a410041081027200228027820022802800122036a42f3e885d3a3ac98b63a3700002002200341086a36028001200241286a41086a20022802800136020020022002290378370328412010012203450d07200720067d2107200220033602782002422037027c200241f8006a4100412010272002280278220520022802800122086a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200841206a220336028001200228027c2109200241286a200228023020031027200228022822082002280230220a6a20052003101e1a2002200a20036a220336023002402009450d00200510020b200228022c210520022007370378200241e8006a41086a220942003703002002420037036820082003200241e8006a1003200241d8006a41086a200929030037030020022002290368370358200241d8006a4110200241f8006a4108100402402005450d00200810020b20012001104420067c10b101200241e8006a41086a220342003703002002420037036841c50f4107200241e8006a1003200241d8006a41086a20032903003703002002200229036837035802400240200241d8006a411041d02d410041001000417f460d002002421037022c2002200241d8006a360228200241f8006a200241286a103a20022802782208450d052002200229027c220637022c20022008360228200241f8006a41186a200141186a290000370300200241f8006a41106a200141106a290000370300200241f8006a41086a200141086a29000037030020022001290000370378200241f8006a21032006422088a722052006a7460d010c060b2002410036023020024201370328200241f8006a41186a200141186a290000370300200241f8006a41106a200141106a290000370300200241f8006a41086a200141086a29000037030020022001290000370378200241f8006a21030b200241286a107c200241306a2802002105200228022821080c040b41c1214133102d000b41f4214122102d000b41ec3d103b000b41c1214133102d000b20032900002106200241286a41086a2209200541016a360200200820054105746a22052006370000200541186a200341186a290000370000200541106a200341106a290000370000200541086a200341086a290000370000200241c8006a41086a200928020036020020022002290328370348200241f8006a200241c8006a10a201200228028001210520022802782103200241e8006a41086a220842003703002002420037036841c50f4107200241e8006a1003200241d8006a41086a200829030037030020022002290368370358200241d8006a41102003200510040240200228027c450d00200310020b200228024c450d00200228024810020b200241f8006a41186a200141186a290000370300200241f8006a41106a200141106a290000370300200241f8006a41086a200141086a29000037030020022001290000370378200241c8006a41086a200241186a41086a28020036020020022002290318370348410710012203450d01200220033602282002420737022c200241286a4100410710272002280228200228023022056a220341002800cc0f360000200241e8006a41086a200541076a2205360200200341046a41002f00d00f3b0000200341066a41002d00d20f3a00002002200229032837036820022005360230412010012203450d01200220033602282002422037022c200241286a41004120102720022802282205200228023022086a22032002290378370000200341086a200241f8006a41086a290300370000200341106a200241f8006a41106a290300370000200341186a200241f8006a41186a2903003700002002200841206a2203360230200228022c2109200241e8006a200228027020031027200228026822082002280270220a6a20052003101e1a2002200a20036a220a36027002402009450d00200510020b200228026c2105200241286a200241c8006a10b8012002280230210920022802282103200241e8006a41086a220b4200370300200242003703682008200a200241e8006a1003200241d8006a41086a200b29030037030020022002290368370358200241d8006a41102003200910040240200228022c450d00200310020b02402005450d00200810020b0240200228024c450d00200228024810020b410710012203450d01200220033602782002420737027c200241f8006a410041071027200228027820022802800122056a220341002800d30f360000200241286a41086a200541076a2205360200200341046a41002f00d70f3b0000200341066a41002d00d90f3a0000200220022903783703282002200536028001412010012203450d01200220033602782002422037027c200241f8006a4100412010272002280278220520022802800122086a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200841206a220336028001200228027c2101200241286a20022802302003102720022802282208200228023022096a20052003101e1a2002200920036a220336023002402001450d00200510020b200228022c210520022004360278200241e8006a41086a220442003703002002420037036820082003200241e8006a1003200241d8006a41086a200429030037030020022002290368370358200241d8006a4110200241f8006a4104100402402005450d00200810020b410021040b0240024020002d000022034107714101460d0020034105460d0120034102460d0120034101470d01200041086a280200450d01200041046a2802001002200241a0016a24000f0b2004450d00200041086a280200450d00200041046a28020010020b200241a0016a24000f0b101c000ba90301057f230041206b220124000240410710012202450d002001200236021020014207370214200141106a4100410710272001280210200128021822036a220241002800d30f360000200141086a200341076a2203360200200241046a41002f00d70f3b0000200241066a41002d00d90f3a00002001200129031037030020012003360218412010012202450d002001200236021020014220370214200141106a41004120102720012802102203200128021822046a22022000290000370000200241086a200041086a290000370000200241106a200041106a290000370000200241186a200041186a2900003700002001200441206a220036021820012802142104200120012802082000102720012802002202200128020822056a20032000101e1a2001200520006a220036020802402004450d00200310020b20012802042103200141106a41086a220442003703002001420037031020022000200141106a1003200141086a20042903003703002001200129031037030020014110200141106a410041001000210002402003450d00200210020b200141206a24002000417f470f0b101c000bc70908057f017e017f027e017f017e017f017e230041d0006b220324000240200241086a2204280200220520014d0d002002280200220620014105746a220141186a2207290000210820062005417f6a22094105746a2205290000210a200541086a2206290000210b200541106a220c290000210d2007200541186a220e290000370000200141106a2207290000210f2007200d370000200141086a2207290000210d2007200b3700002001290000210b2001200a370000200341106a41186a2008370300200341106a41106a200f370300200341106a41086a2201200d370300200e2008370000200c200f3700002006200d3700002005200b3700002003200b37031020042009360200200341086a200936020020032002290200370300200341c0006a200310a2012003280248210220032802402105200142003703002003420037031041c50f4107200341106a1003200341306a41086a200129030037030020032003290310370330200341306a411020052002100402402003280244450d00200510020b02402003280204450d00200328020010020b0240410710012201450d002003200136021020034207370214200341106a4100410710272003280210200328021822056a220141002800cc0f360000200341306a41086a200541076a2205360200200141046a41002f00d00f3b0000200141066a41002d00d20f3a00002003200329031037033020032005360218412010012201450d002003200136021020034220370214200341106a41004120102720032802102205200328021822026a22012000290000370000200141086a200041086a290000370000200141106a200041106a290000370000200141186a200041186a2900003700002003200241206a220136021820032802142109200341306a20032802382001102720032802302202200328023822046a20052001101e1a2003200420016a220136023802402009450d00200510020b20032802342105200341106a41086a220942003703002003420037031020022001200341106a1003200341306a41086a200929030037030020032003290310370330200341306a4110100502402005450d00200210020b410710012201450d002003200136021020034207370214200341106a4100410710272003280210200328021822056a220141002800d30f360000200341306a41086a200541076a2205360200200141046a41002f00d70f3b0000200141066a41002d00d90f3a00002003200329031037033020032005360218412010012201450d002003200136021020034220370214200341106a41004120102720032802102205200328021822026a22012000290000370000200141086a200041086a290000370000200141106a200041106a290000370000200141186a200041186a2900003700002003200241206a220036021820032802142102200341306a20032802382000102720032802302201200328023822096a20052000101e1a2003200920006a220036023802402002450d00200510020b20032802342105200341106a41086a220242003703002003420037031020012000200341106a1003200341306a41086a200229030037030020032003290310370330200341306a4110100502402005450d00200110020b200341d0006a24000f0b101c000b419c3920012005103c000b9a0301057f230041306b220224000240410810012203450d002002200336022020024208370224200241206a4100410810272002280220200228022822036a42f3e885d3c3cdd8b73a3700002002200341086a360228200241106a41086a200228022836020020022002290320370310412010012203450d002002200336022020024220370224200241206a41004120102720022802202204200228022822056a22032000290000370000200341086a200041086a290000370000200341106a200041106a290000370000200341186a200041186a2900003700002002200541206a220036022820022802242105200241106a20022802182000102720022802102203200228021822066a20042000101e1a2002200620006a220036021802402005450d00200410020b2002280214210420022001370308200241206a41086a220542003703002002420037032020032000200241206a1003200241106a41086a200529030037030020022002290320370310200241106a4110200241086a4108100402402004450d00200310020b200241306a24000f0b101c000bfd0602067f017e230041306b220224000240410810012203450d00200220033602182002420837021c200241186a4100410810272002280218200228022022036a42f3e885d3a3ec9bb73a3700002002200341086a360220200241086a41086a200228022036020020022002290318370308412010012203450d00200220033602182002422037021c200241186a41004120102720022802182204200228022022056a22032000290000370000200341086a200041086a290000370000200341106a200041106a290000370000200341186a200041186a2900003700002002200541206a2203360220200228021c2106200241086a20022802102003102720022802082205200228021022076a20042003101e1a2002200720036a220336021002402006450d00200410020b200228020c210442002108200241186a41086a220642003703002002420037031820052003200241186a1003200241086a41086a20062903003703002002200229031837030802400240200241086a411041d02d410041001000417f460d0020024200370318200241086a4110200241186a41084100100041016a41084d0d01200229031821080b02402004450d00200510020b4100210302402008427f510d002008102e560d002000104322082001540d00410810012203450d02200220033602182002420837021c200241186a4100410810272002280218200228022022036a42f3e885d3a3ac98b63a3700002002200341086a360220200241086a41086a200228022036020020022002290318370308412010012203450d02200820017d2108200220033602182002422037021c200241186a41004120102720022802182204200228022022056a22032000290000370000200341086a200041086a290000370000200341106a200041106a290000370000200341186a200041186a2900003700002002200541206a2200360220200228021c2103200241086a20022802102000102720022802082205200228021022066a20042000101e1a2002200620006a220036021002402003450d00200410020b200228020c210420022008370328200241186a41086a220342003703002002420037031820052000200241186a1003200241086a41086a200329030037030020022002290318370308200241086a4110200241286a41081004410121032004450d00200510020b200241306a240020030f0b41c1214133102d000b101c000bf80301057f230041206b22022400024002400240410710012203450d002002200336021020024207370214200241106a4100410710272002280210200228021822046a220341002800d30f360000200241086a200441076a2204360200200341046a41002f00d70f3b0000200341066a41002d00d90f3a00002002200229031037030020022004360218412010012203450d002002200336021020024220370214200241106a41004120102720022802102204200228021822056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a220136021820022802142105200220022802082001102720022802002203200228020822066a20042001101e1a2002200620016a220136020802402005450d00200410020b20022802042104200241106a41086a220542003703002002420037031020032001200241106a1003200241086a20052903003703002002200229031037030041002101024002402002411041d02d410041001000417f460d00200241003602104101210120024110200241106a41044100100041016a41044d0d01200228021021052004450d040c030b20040d020c030b41c1214133102d000b101c000b200310020b2000200136020020002005360204200241206a24000b8806010a7f230041306b22022400024002400240024002400240024002400240410710012203450d00200220033602182002420737021c200241186a4100410710272002280218200228022022046a220341002800cc0f360000200241086a41086a200441076a2204360200200341046a41002f00d00f3b0000200341066a41002d00d20f3a00002002200229031837030820022004360220412010012203450d00200220033602182002422037021c200241186a41004120102720022802182204200228022022056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a2201360220200228021c2103200241086a20022802102001102720022802082206200228021022056a20042001101e1a2002200520016a220136021002402003450d00200410020b200228020c2107200241186a41086a220342003703002002420037031820062001200241186a1003200241086a41086a200329030037030020022002290318370308200241086a411041d02d410041001000417f460d01200241003602184100200241086a4110200241186a41044100100022012001417f461b220141034d0d0720022802182208417f4c0d082008450d022008100122090d030b101c000b200041003602082000420137020020070d020c030b410121090b2002200836021c200220093602182002410036022002402008450d002001410420014104491b2103200241206a210a41002101410021040340200241003a002f200241086a41102002412f6a41012003100041016a41014b220b450d04200441016a210420022d002f210502402001200228021c470d00200241186a1023200a2802002101200228021821090b2003200b6a2103200920016a20053a0000200a200141016a220136020020042008490d000b200228021821090b2009450d032000200229021c370204200020093602002007450d010b200610020b200241306a24000f0b200228021c450d00200910020b41c1214133102d000b1024000b990401057f230041206b220224000240410710012203450d002002200336021020024207370214200241106a4100410710272002280210200228021822046a220341002800bf10360000200241086a200441076a2204360200200341046a41002f00c3103b0000200341066a41002d00c5103a00002002200229031037030020022004360218412010012203450d002002200336021020024220370214200241106a41004120102720022802102204200228021822056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a220136021820022802142105200220022802082001102720022802002203200228020822066a20042001101e1a2002200620016a220136020802402005450d00200410020b20022802042104200241106a41086a220542003703002002420037031020032001200241106a1003200241086a20052903003703002002200229031037030041002101024002402002411041d02d410041001000417f460d002002410036021020024110200241106a41044100100041016a41044d0d01200228021021012002410036021020024110200241106a41044104100041016a41044d0d01200041086a200228021036020020002001360204410121010b2000200136020002402004450d00200310020b200241206a24000f0b41c1214133102d000b101c000b930503067f017e097f230041d0006b220224002002410036023020012001280208220341002001280200220420012802042205200241306a41042003100022032003417f461b2203410420034104491b6a220636020802400240024002400240200341034d0d0020022802302207ad42287e2208422088a70d042008a72203417f4c0d032003450d012003100122090d02101c000b20004100360200200241d0006a24000f0b410821090b20022007360204200220093602002002410036020802402007450d00200241306a41186a210a200241306a41106a210b4100210c4100210d034020024200370330200141086a220e410020042005200241306a41082006100022032003417f461b2203410820034108491b20066a220636020002400240200341074d0d0020022903302108200a4200370300200b4200370300200241306a41086a220f420037030020024200370330200e410020042005200241306a41202006100022032003417f461b2203412020034120491b20066a22063602002003411f4d0d00200d41016a210d200241106a41186a220e200a290300370300200241106a41106a2210200b290300370300200241106a41086a2211200f29030037030020022002290330370310200c2002280204470d0120021068200241086a280200210c200228020021090c010b2000410036020002402002280204450d00200910020b200241d0006a24000f0b2009200c41286c6a2203200837030020032002290310370308200341206a200e290300370300200341186a2010290300370300200341106a2011290300370300200241086a200c41016a220c360200200d2007490d000b0b20002002290300370200200041086a200241086a280200360200200241d0006a24000f0b105f000b105e000bf40403057f017e037f230041306b22012400200041086a28020021022001410036022820014201370320200141206a4100410410272001280220200128022822036a20023600002001200341046a360228200141086a220420012802283602002001200129032037030002400240024002402002450d0020002802002200200241286c6a21050340200141106a41086a220341003602002001420137031020002903002106200141106a41004108102720032003280200220241086a2207360200200220012802106a2006370000200141106a20074120102720032003280200220741206a22023602002007200128021022086a220341086a200041106a290000370000200341106a200041186a290000370000200341186a200041206a2900003700002003200041086a2900003700002002417f4c0d03024002402002450d002002100122030d010c060b410121030b200141206a41086a220741003602002001200236022420012003360220200141206a41002002102720072007280200220920026a22033602002009200128022022076a20082002101e1a2001280224210202402001280214450d00200810020b200120042802002003102720012802002209200428020022086a20072003101e1a2004200820036a220336020002402002450d00200710020b200041286a22002005470d000c020b0b20012802082103200128020021090b20012802042102200141206a41086a2200420037030020014200370320418f114107200141206a1003200141106a41086a200029030037030020012001290320370310200141106a411020092003100402402002450d00200910020b200141306a24000f0b1019000b101c000bb50201077f230041206b22022400200141086a28020021032002410036021820024201370310200241106a4100410410272002280210200228021822046a20033600002002200441046a360218200241086a2204200228021836020020022002290310370300024002402003450d00200128020021050340410110012201450d022002200136021020024201370214200241106a410041011027200241106a41086a22012001280200220641016a22013602002006200228021022076a20052d00003a00002002280214210620022004280200200110272002280200200428020022086a20072001101e1a2004200820016a36020002402006450d00200710020b200541016a21052003417f6a22030d000b0b20002002290300370200200041086a2004280200360200200241206a24000f0b101c000bd60c03047f047e017f230041f0006b210202400240024002400240024002400240024002400240024002400240024020012d002822034103714101460d0020034102470d01200141206a22032802002204450d0e20032004417f6a3602002001411c6a2d0000450d050c0e0b20012802102204450d01200141106a4100360200024020012802082203200128020c2205460d002004417f7321040340200241c8006a41206a200341206a290300370300200241c8006a41186a200341186a290300370300200241c8006a41106a200341106a290300370300200241c8006a41086a200341086a29030037030020022003290300370348200441016a2204450d072005200341286a2203470d000b200141086a20053602000b200042003703000f0b20012802102204450d01200141106a410036020020012802082203200128020c2205460d022004417f7321040340200241c8006a41206a200341206a290300370300200241c8006a41186a200341186a290300370300200241c8006a41106a200341106a290300370300200241c8006a41086a200341086a29030037030020022003290300370348200441016a2204450d062005200341286a2203470d000b200141086a20053602000c020b20012802082202200128020c460d06200141086a200241286a360200200041286a200241206a290300370300200041206a200241186a290300370300200041186a200241106a290300370300200041106a200241086a29030037030020002002290300370308200042013703000f0b20012802082203200128020c460d00200141086a200341286a360200200241206a200341206a290300370300200241186a200341186a290300370300200241106a200341106a290300370300200241086a200341086a290300370300200220032903003703000c040b200141286a41023a0000200141206a22032802002204450d0820032004417f6a3602002001411c6a2d0000450d050c080b200141186a22042802002203200141146a280200460d082004200341586a220336020020032903004200510d05200241c8006a41206a200341206a2903002206370300200241c8006a41186a200341186a2903002207370300200241c8006a41106a200341106a2903002208370300200241c8006a41086a200341086a2903002209370300200241086a22042008370300200241106a22052007370300200241186a220a20063703002002200329030037034820022009370300200041286a200141246a280200290300370300200041206a200a290300370300200041186a2005290300370300200041106a200429030037030020002002290300370308200042013703000f0b2000200229034837030820004201370300200141086a200341286a360200200041106a200241c8006a41086a290300370300200041186a200241c8006a41106a290300370300200041206a200241c8006a41186a290300370300200041286a200241c8006a41206a2903003703000f0b200141086a200341286a360200200241086a200241c8006a41086a290300370300200241106a200241c8006a41106a290300370300200241186a200241c8006a41186a290300370300200241206a200241c8006a41206a290300370300200220022903483703000b2000200229030037030820004201370300200041106a200241086a290300370300200041186a200241106a290300370300200041206a200241186a290300370300200041286a200241206a2903003703000f0b200042003703000f0b200141186a22042802002203200141146a280200460d022004200341586a220336020020032903004200510d01200241c8006a41206a200341206a2903002206370300200241c8006a41186a200341186a2903002207370300200241c8006a41106a200341106a2903002208370300200241c8006a41086a200341086a2903002209370300200241286a41086a22042008370300200241286a41106a22052007370300200241286a41186a220a20063703002002200329030037034820022009370328200041286a200141246a280200290300370300200041206a200a290300370300200041186a2005290300370300200041106a200429030037030020002002290328370308200042013703000f0b2001411c6a41013a0000200042003703000f0b2001411c6a41013a0000200042003703000f0b200042003703000f0b200042003703000b8c0204017f017e017f017e230041c0006b22022400102e2103200241086a220442003703002002420037030041f726410720021003200241306a41086a2004290300370300200220022903003703300240200241306a411041d02d410041001000417f460d00200242003703000240200241306a4110200241084100100041016a41084d0d0020022903002105200241286a200041286a290300370300200241206a200041206a290300370300200241186a200041186a290300370300200241106a200041106a290300370300200241086a200041086a29030037030020022000290300370300200520037c20022001103f200241c0006a24000f0b41c1214133102d000b41f4214122102d000bba0503047f017e087f230041e0006b22012400200141c0006a41086a220242003703002001420037034041f2224107200141c0006a1003200141086a2002290300370300200120012903403703000240024002402001411041d02d410041001000417f460d00200141003602400240410020014110200141c0006a41044100100022022002417f461b220341034d0d0020012802402204ad42287e2205422088a70d022005a72202417f4c0d03024002402002450d002002100122060d01101c000b410821060b200120043602142001200636021020014100360218024002402004450d002003410420034104491b2107200141c0006a41186a21084100210341002109034020014200370340410020014110200141c0006a41082007100022022002417f461b220241074d0d022001290340210520084200370300200141c0006a41106a220a4200370300200141c0006a41086a220b420037030020014200370340410020014110200141c0006a41202002410820024108491b20076a2207100022022002417f461b2202411f4d0d02200941016a21092002412020024120491b2102200141206a41186a220c2008290300370300200141206a41106a220d200a290300370300200141206a41086a220a200b29030037030020012001290340370320024020032001280214470d00200141106a106f200141106a41086a2802002103200128021021060b200220076a21072006200341286c6a2202200537030020022001290320370308200241206a200c290300370300200241186a200d290300370300200241106a200a290300370300200141106a41086a200341016a220336020020092004490d000b200128021021060b2006450d012000200129021437020420002006360200200141e0006a24000f0b2001280214450d00200610020b41c1214133102d000b41f4214122102d000b1064000b1065000bf40403057f017e037f230041306b22012400200041086a28020021022001410036022820014201370320200141206a4100410410272001280220200128022822036a20023600002001200341046a360228200141086a220420012802283602002001200129032037030002400240024002402002450d0020002802002200200241286c6a21050340200141106a41086a220341003602002001420137031020002903002106200141106a41004108102720032003280200220241086a2207360200200220012802106a2006370000200141106a20074120102720032003280200220741206a22023602002007200128021022086a220341086a200041106a290000370000200341106a200041186a290000370000200341186a200041206a2900003700002003200041086a2900003700002002417f4c0d03024002402002450d002002100122030d010c060b410121030b200141206a41086a220741003602002001200236022420012003360220200141206a41002002102720072007280200220920026a22033602002009200128022022076a20082002101e1a2001280224210202402001280214450d00200810020b200120042802002003102720012802002209200428020022086a20072003101e1a2004200820036a220336020002402002450d00200710020b200041286a22002005470d000c020b0b20012802082103200128020021090b20012802042102200141206a41086a220042003703002001420037032041f2224107200141206a1003200141106a41086a200029030037030020012001290320370310200141106a411020092003100402402002450d00200910020b200141306a24000f0b1019000b101c000b922305077f017e027f017e037f230041b0016b22022400200241003a005020012001280208220320012802002001280204200241d0006a41012003100041016a220341014b6a220436020802400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020034102490d0020022d0050220341074b0d03024020030e080005020404060703000b200241003a0050200141086a20042001280200200141046a280200200241d0006a41012004100041016a220341014b6a220436020020034102490d1e20022d00502203450d0a20034101470d1e200141046a280200210520024100360250200141086a4100200128020022062005200241d0006a41042004100022032003417f461b2207410420074104491b20046a2203360200200741034d0d1e20022802502208ad42187e2209422088a70d202009a72204417f4c0d1f2004450d1b20041001220a0d1c0c210b20004106360200200241b0016a24000f0b200241003a005041042107200141086a200420012802002205200141046a280200220b200241d0006a41012004100041016a220341014b6a220436020020034102490d1020022d0050220341034b0d10024020030e04000e0f10000b20024200370350200141086a41002005200b200241d0006a41082004100022012001417f461b2201410820014108491b20046a360200200141074d0d1020022903502109410121070c0f0b200241003a0050200141086a200420012802002207200141046a2802002205200241d0006a41012004100041016a220341014b6a220436020020034102490d0620022d00502203450d0420034101470d0620024200370350200141086a410020072005200241d0006a41082004100022012001417f461b2201410820014108491b20046a360200200141074d0d06200229035021094202210c0c050b20004106360200200241b0016a24000f0b200241003a0050200141086a200420012802002207200141046a2802002205200241d0006a41012004100041016a220341014b6a220436020020034102490d0820022d00502203450d0620034101470d08420221090c070b200241003a0050200141086a200420012802002207200141046a2802002205200241d0006a41012004100041016a220341014b6a220436020020034102490d1120022d00502203450d0820034101470d1120024100360250200141086a410020072005200241d0006a41042004100022012001417f461b2201410420014104491b20046a360200200141034d0d1120022802502103420221090c200b200241003a0050200141086a200420012802002207200141046a2802002205200241d0006a41012004100041016a220341014b6a2204360200024020034102490d004105210320022d0050220b41034b0d1d0240200b0e0400100e0f000b20024100360250200141086a410020072005200241d0006a41042004100022012001417f461b2201410420014104491b20046a360200200141034d0d1d20022802502101410121030c1f0b410521030c1c0b20024200370350200141086a410020072005200241d0006a41082004100022012001417f461b2201410820014108491b20046a360200200141074d0d01200229035021094201210c0b20004105360200200041086a200c370300200041106a2009370300200041186a2002290350370300200041206a200241d0006a41086a290300370300200041286a200241d0006a41106a290300370300200241b0016a24000f0b20004106360200200241b0016a24000f0b200141046a280200210320024100360250200141086a410020012802002003200241d0006a41042004100022032003417f461b2203410420034104491b20046a2204360200200341034d0d1320022802502203417f4c0d172003450d0e20031001220a450d16200a4100200310171a200141086a28020021040c0f0b20024200370350200141086a410020072005200241d0006a41082004100022012001417f461b22014108200141084922011b20046a36020020010d012002290350210c420121090b20004101360200200041086a2009370300200041106a200c370300200041186a2002290350370300200041206a200241d0006a41086a290300370300200041286a200241d0006a41106a290300370300200241b0016a24000f0b20004106360200200241b0016a24000f0b200241d0006a200110bd0120024180016a41086a2203200241dc006a29020037030020024180016a41106a2204200241e4006a29020037030020024180016a41186a2207200241ec006a29020037030020024180016a41206a2205200241f4006a29020037030020024180016a41286a220b200241fc006a2802003602002002200229025437038001200228025022064106460d08200241206a41286a220a200b280200360200200241206a41206a220b2005290300370300200241206a41186a22052007290300370300200241206a41106a22072004290300370300200241206a41086a220420032903003703002002200229038001370320200241d0006a41286a200a280200360200200241d0006a41206a200b290300370300200241d0006a41186a2005290300370300200241d0006a41106a2007290300370300200241d0006a41086a200429030037030020022002290320370350413010012203450d1220032002290350370204200320063602002003410c6a200241d0006a41086a290300370200200341146a200241e0006a2903003702002003411c6a200241e8006a290300370200200341246a200241f0006a2903003702002003412c6a200241f8006a28020036020020022003360208200241003a0050200141086a2204200428020022042001280200200141046a280200200241d0006a41012004100041016a41014b22016a3602002001450d0720022d0050220141034f0d07420121090c170b20024200370350200141086a41002005200b200241d0006a41082004100022012001417f461b2201410820014108491b20046a360200200141074d0d0220022903502109410221070c010b20024100360250200141086a41002005200b200241d0006a41042004100022012001417f461b2201410420014104491b20046a36020041032107200141034d0d01200228025021060b20004102360200200041086a20073602002000410c6a2006360200200041106a2009370200200041186a2002290350370300200041206a200241d0006a41086a290300370300200041286a200241d0006a41106a290300370300200241b0016a24000f0b20004106360200200241b0016a24000f0b20024200370350200141086a410020072005200241d0006a41082004100022012001417f461b2201410820014108491b20046a360200200141074d0d0f20022903502109410321030c100b20024200370350200141086a410020072005200241d0006a41082004100022012001417f461b2201410820014108491b20046a360200200141074d0d0e20022903502109410421030c0f0b200241d0006a41186a220b4200370300200241d0006a41106a22064200370300200241d0006a41086a220a420037030020024200370350200141086a410020072005200241d0006a41202004100022012001417f461b2201412020014120491b20046a3602002001411f4d0d0220024180016a41186a2201200b29030037030020024180016a41106a2203200629030037030020024180016a41086a2204200a2903003703002002200229035037038001200b200129030037030020062003290300370300200a20042903003703002002200229038001370350410221032002411c6a41026a220420022d00523a0000200241086a41086a2207200241e7006a290000370300200241086a41106a2205200241d0006a411f6a2d00003a0000200220022f01503b011c2002200229005f3703082002280053210120022900572109200241046a41026a20042d00003a0000200241206a41086a2007290300370300200241206a41106a20052d00003a0000200220022f011c3b0104200220022903083703200c0f0b200241086a10220b20004106360200200241b0016a24000f0b200b20024180016a41186a290000370300200620024180016a41106a290000370300200a20024180016a41086a29000037030020022002290080013703500c0a0b4101210a0b200141086a200341002001280200200141046a280200200a20032004100022012001417f461b2201200120034b1b20046a3602000240200320014d0d00200a10020c040b200a450d032003ad22094220862009842109410121010c020b4104210a0b200220083602542002200a3602502002410036025802402008450d00200141086a21044101210d4100210b03402002410036028001200441002006200520024180016a41042003100022072007417f461b2207410420074104491b20036a220f36020002400240200741034d0d002002280280012203417f4c0d09024002402003450d00200310012207450d0a20074100200310171a0c010b410121070b2004200341002006200520072003200f100022052005417f461b2205200520034b1b200f6a3602000240200320054b0d002007450d012003ad22094220862009842109200141046a220e28020021052004280200210320024100360280012004200341002001280200200520024180016a41042003100022052005417f461b2205410420054104491b6a22063602000240200541034d0d002002280280012203417f4c0d0b024002402003450d00200310012205450d0c20054100200310171a200428020021060c010b410121050b2004200341002001280200200e2802002005200320061000220f200f417f461b220f200f20034b1b20066a36020002402003200f4b0d002005450d012003ad220c422086200c84210c200b2002280254470d04200241d0006a1076200241d0006a41086a280200210b2002280250210a0c040b200510020b2009a7450d010b200710020b200228025021040240200b450d00200b41186c21032004210103400240200141046a280200450d00200128020010020b0240200141106a280200450d002001410c6a28020010020b200141186a2101200341686a22030d000b0b2002280254450d04200410020c040b0240200a200b41186c6a22032009370204200320073602002003410c6a2005360200200341106a200c370200200241d0006a41086a200b41016a220b360200200d20084f0d00200d41016a210d20042802002103200e2802002105200128020021060c010b0b2002280250210a0b200a450d0120022902542109410221010b2000200136020420004100360200200041086a200a3602002000410c6a2009370200200041146a20022902503702002000411c6a200241d0006a41086a290200370200200041246a200241e0006a2902003702002000412c6a200241e8006a280200360200200241b0016a24000f0b20004106360200200241b0016a24000f0b1061000b1060000b101c000b1019000b0b0b200241086a41026a2204200241046a41026a2d00003a0000200241d0006a41086a2207200241206a41086a290300370300200241d0006a41106a2205200241206a41106a290300370300200220022f01043b010820022002290320370350024020034105470d0020004106360200200241b0016a24000f0b2002411c6a41026a220b20042d00003a000020024180016a41086a2204200729030037030020024180016a41106a22072005290300370300200220022f01083b011c2002200229035037038001200041086a20033a0000200041043602002000410c6a2001360000200041106a2009370000200020022f011c3b00092000410b6a200b2d00003a0000200041186a200229038001370000200041206a2004290300370000200041286a2007290300370000200241b0016a24000f0b200041033602002000410c6a2002290250370200200041146a200241d8006a2902003702002000411c6a200241e0006a290200370200200041246a200241e8006a2902003702002000412c6a200241f0006a28020036020020002003ad422086200141ff0171ad42088684200984370204200241b0016a24000be60201047f230041206b22022400200241003602082002420137030020024100412010272002280200200228020822036a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002002200341206a2204360208200220044120102720022802002203200228020822056a22042001290020370000200441086a200141286a290000370000200441106a200141306a290000370000200441186a200141386a2900003700002002200541206a220136020802402001417f4c0d00024002402001450d002001100122040d01101c000b410121040b200220013602142002200436021020024100360218200241106a41002001102720022002280218220420016a360218200420022802106a20032001101e1a200041086a20022802183602002000200229031037020002402002280204450d00200310020b200241206a24000f0b1019000be70101037f0240024002402000280200220128020022024103460d0020020d0220012802042202450d0220024101470d012001410c6a280200450d02200141086a2802001002200028020010020f0b20012d00044101470d01200141086a10bf01200028020010020f0b0240200141106a2802002203450d00200141086a2802002102200341186c210303400240200241046a280200450d00200228020010020b0240200241106a280200450d002002410c6a28020010020b200241186a2102200341686a22030d000b0b2001410c6a280200450d00200141086a28020010020b200028020010020be00302057f017e230041206b220124000240410710012202450d002001200236021020014207370214200141106a4100410710272001280210200128021822036a220241002800d92e360000200141086a200341076a2203360200200241046a41002f00dd2e3b0000200241066a41002d00df2e3a00002001200129031037030020012003360218412010012202450d002001200236021020014220370214200141106a41004120102720012802102203200128021822046a22022000290000370000200241086a200041086a290000370000200241106a200041106a290000370000200241186a200041186a2900003700002001200441206a220036021820012802142104200120012802082000102720012802002202200128020822056a20032000101e1a2001200520006a220036020802402004450d00200310020b2001280204210342002106200141106a41086a220442003703002001420037031020022000200141106a1003200141086a200429030037030020012001290310370300024002402001411041d02d410041001000417f460d002001420037031020014110200141106a41084100100041016a41084d0d01200129031021060b02402003450d00200210020b200141206a240020060f0b41c1214133102d000b101c000bd14b05067f017e057f047e047f230041a0076b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002203417f6a220441054b0d0002400240024002400240024020040e06000402030105000b200241f8006a41086a22042000410a6a290000370300200241f8006a41106a2205200041126a290000370300200241f8006a41186a22062000411a6a2900003703002002200041026a29000037037820002d0001450d21200241d8036a41186a2006290300370300200241d8036a41106a2005290300370300200241d8036a41086a2004290300370300200220022903783703d803410810012204450d43200220043602582002420837025c200241d8006a4100410810272002280258200228026022046a42f3cacdd3e38d9eba3a3700002002200441086a360260200241206a41086a200228026036020020022002290358370320412010012204450d43200220043602582002422037025c200241d8006a41004120102720022802582205200228026022066a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002002200641206a2201360260200228025c2106200241206a20022802282001102720022802202204200228022822076a20052001101e1a2002200720016a220136022802402006450d00200510020b20022802242105200241d8006a41086a220642003703002002420037035820042001200241d8006a1003200241c0006a41086a200629030037030020022002290358370340200241c0006a4110200241d8036a412010042005450d38200410020c380b200241d8036a41286a200041306a290300370300200241d8036a41206a200041286a290300370300200241d8036a41186a200041206a290300370300200241d8036a41106a200041186a290300370300200241d8036a41086a200041106a2903003703002002200041086a2903003703d803200241d8036a200110ae0141002101410121040c400b200041086a2903004200510d20200041106a2903002108200241f0036a4200370300200241d8036a41106a4200370300200241d8036a41086a4200370300200242003703d8030240200241d8036a2001460d002001200241d8036a412010060d270b200241d8006a41086a220142003703002002420037035841ad0b4107200241d8006a1003200241c0006a41086a2204200129030037030020022002290358370340200241c0006a411020024190076a410041001000417f470d21200142003703002002420037035841ed2d4107200241d8006a10032004200129030037030020022002290358370340200241c0006a411041d02d410041001000417f460d22200241003602d803200241c0006a4110200241d8036a41044100100041016a41044d0d1a20022802d8030d23200220083703d803200241d8006a41086a220142003703002002420037035841a90c4107200241d8006a1003200241c0006a41086a2205200129030037030020022002290358370340200241c0006a4110200241d8036a4108100441012104200241013a00d803200142003703002002420037035841ad0b4107200241d8006a10032005200129030037030020022002290358370340200241c0006a4110200241d8036a410110040c370b200241086a2205200041106a2903003703002002200041086a29030037030020022d000022044103714101460d0520044102460d0320044103470d2320022d0001210920022802042105410810012206450d40200220063602d803200242083702dc03200241d8036a41004108102720022802d80320022802e00322066a42e4cab5d383cedcb73a3700002002200641086a3602e003200241f8006a41086a20022802e003360200200220022903d803370378410410012206450d40200220063602d803200242043702dc03200241d8036a41004104102720022802d803220720022802e00322066a20053600002002200641046a22063602e00320022802dc03210a200241f8006a200228028001200610272002280278220b200228028001220c6a20072006101e1a2002200c20066a2206360280010240200a450d00200710020b200228027c2107200241d8006a41086a220a420037030020024200370358200b2006200241d8006a1003200241c0006a41086a200a29030037030020022002290358370340200241c0006a411020024190076a410041001000210602402007450d00200b10020b2006417f460d2620011043210820011044420020087d510d27200241e4036a200141086a290000370200200241ec036a200141106a290000370200200241f4036a200141186a290000370200200220053602d803200220012900003702dc03410810012206450d40200220063602782002420837027c200241f8006a410041081027200228027820022802800122066a42e4cab5d3e3ee9bba3a3700002002200641086a36028001200241d8006a41086a220620022802800136020020022002290378370358200241f8006a200241d8036a1045200228027c210c2002280278210b200241d8006a2006280200200228028001220710272002280258220a2006280200220d6a200b2007101e1a2006200d20076a22073602000240200c450d00200b10020b200228025c2106200241d8006a41086a220b420037030020024200370358200a2007200241d8006a1003200241c0006a41086a200b29030037030020022002290358370340200241c0006a411020024190076a410041001000210702402006450d00200a10020b2007417f470d3a20024190076a20051042200241d8036a41186a2207200141186a290000370300200241d8036a41106a220b200141106a290000370300200241d8036a41086a220a200141086a290000370300200220012900003703d8032002280298072206200228029407460d170c390b200241086a2204200041116a290000370300200241106a2205200041196a290000370300200241186a2206200041216a2900003703002002200041096a290000370300200041086a2d000041037122034101460d0520034103460d0320034102470d23200241d8006a41086a220342003703002002420037035841d61d4108200241d8006a1003200241c0006a41086a200329030037030020022002290358370340200241c0006a411041d02d410041001000417f460d122002421037027c2002200241c0006a360278200241d8036a200241f8006a103a20022802d8032206450d27200220022902dc0322083702242002200636022020062008422088a7220741057422036a210520034105754104490d06200621040340200120042203460d182003200141201006450d18200341206a22042001460d182004200141201006450d18200441206a22042001460d182004200141201006450d18200441206a22042001460d182004200141201006450d182005200441206a22046b41057541034b0d000b20034180016a22032005470d070c080b200241f8036a200041246a280200360200200241f0036a2000411c6a290200370300200241e8036a200041146a290200370300200241e0036a2000410c6a2902003703002002200041046a2902003703d803200241d8036a200110db014100210541012104410121010c3d0b200041106a2d00004102470d32419cc200103b000b200241d8036a20022802042205103720022802e003450d25200241d8006a41106a2206200241d8036a41106a290300370300200241d8006a41086a200241d8036a41086a290300370300200220022903d8033703582001200229035810b201450d26200241f8006a41186a2207200141186a290000370300200241f8006a41106a200141106a290000370300200241f8006a41086a200141086a2900003703002002200129000037037820062802002201200241e4006a280200460d110c340b200241d8006a41086a220342003703002002420037035841d61d4108200241d8006a1003200241c0006a41086a2003290300370300200220022903583703404100210b200241c0006a411041d02d410041001000417f460d052002421037027c2002200241c0006a360278200241d8036a200241f8006a103a20022802d8032205450d2c2005200241e0036a280200220941057422036a210720022802dc03210b20034105754104490d0620052106410021030340200120062204460d0a2003200420014120100622064100476a21032006450d0a200441206a22062001460d0a20032006200141201006220a4100476a2103200a450d0a200641206a22062001460d0a20032006200141201006220a4100476a2103200a450d0a200641206a22062001460d0a20032006200141201006220a4100476a2103200a450d0a2007200641206a22066b41057541034b0d000b20044180016a22042007470d070c080b20052903002108200220022802042206360220200241d8006a41086a220442003703002002420037035841a2294107200241d8006a1003200241c0006a41086a200429030037030020022002290358370340200241c0006a411041d02d410041001000417f460d25200242003703d803200241c0006a4110200241d8036a41084100100041016a41084d0d1420022903d8032008560d262001200810b201450d27200241d8006a41086a220442003703002002420037035841a9294107200241d8006a1003200241c0006a41086a200429030037030020022002290358370340410021050240200241c0006a411041d02d410041001000417f460d00200241003602d803200241c0006a4110200241d8036a41044100100041016a41044d0d1820022802d80321050b2002200541016a3602d803200241d8006a41086a220442003703002002420037035841a9294107200241d8006a1003200241c0006a41086a200429030037030020022002290358370340200241c0006a4110200241d8036a41041004412010012204450d3a200241e4036a428180808010370200200141086a2207290000210e200141106a220b290000210f20012900002110200441186a200141186a220a290000370000200441106a200f370000200441086a200e37000020042010370000200220083703d803200220043602e0032005200241d8036a10df01200241d8006a1036200241d8036a200610e001200241f8006a41186a2206200a290000370300200241f8006a41106a200b290000370300200241f8006a41086a20072900003703002002200129000037037820022802602204200228025c460d100c310b200041306a2903002108200241206a41186a2006290300370300200241206a41106a2005290300370300200241206a41086a20042903003703002002200229030037032041d02d200110c60122112008540d2741d02d200241206a10c601210e410810012203450d39200220033602d803200242083702dc03200241d8036a41004108102720022802d80320022802e00322036a42f3e885d3a3ec9bb73a3700002002200341086a3602e003200241f8006a41086a20022802e003360200200220022903d803370378412010012203450d39200220033602d803200242203702dc03200241d8036a41004120102720022802d803220420022802e00322056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a22033602e00320022802dc032106200241f8006a200228028001200310272002280278220520022802800122076a20042003101e1a2002200720036a22033602800102402006450d00200410020b200228027c21044200210f200241d8006a41086a220642003703002002420037035820052003200241d8006a1003200241c0006a41086a2006290300370300200220022903583703400240200241c0006a411041d02d410041001000417f460d00200242003703d803200241c0006a4110200241d8036a41084100100041016a41084d0d1520022903d803210f0b02402004450d00200510020b410810012203450d39200220033602d803200242083702dc03200241d8036a41004108102720022802d80320022802e00322036a42f3e885d3a3ec9bb73a3700002002200341086a3602e003200241f8006a41086a20022802e003360200200220022903d803370378412010012203450d39200220033602d803200242203702dc03200241d8036a41004120102720022802d803220420022802e00322056a22032002290320370000200341086a200241206a41086a290300370000200341106a200241206a41106a290300370000200341186a200241206a41186a2903003700002002200541206a22033602e00320022802dc032106200241f8006a200228028001200310272002280278220520022802800122076a20042003101e1a2002200720036a22033602800102402006450d00200410020b200228027c210442002110200241d8006a41086a220642003703002002420037035820052003200241d8006a1003200241c0006a41086a2006290300370300200220022903583703400240200241c0006a411041d02d410041001000417f460d00200242003703d803200241c0006a4110200241d8036a41084100100041016a41084d0d1620022903d80321100b02402004450d00200510020b200f2010560d28200e20087c220f200e580d2941a00610012203450d392003200241d8036a41b803101e220341003b01be03200341003602b803200341c0036a200241f8006a41e002101e1a200241c8006a4200370300200241d4006a41d43c3602002002200336024420024100360240200241d02d360250200241206a2001460d0b2001200241206a41201006450d0b2002417f360240200241d8036a41186a2207200141186a290000370300200241d8036a41106a220b200141106a290000370300200241d8036a41086a220a200141086a290000370300200220012900003703d8032002200241c0006a41047222043602602002200241c0006a41086a2802003602582002200228024436025c200241f8006a200241d8006a200241d8036a10970141012103200241f8006a41106a2802002105200241f8006a410c6a2802002109200241f8006a41086a2802002106200228027c210c024020022802784101470d00200241d8006a41186a2007290300370300200241d8006a41106a200b290300370300200241d8006a41086a200a290300370300200220022903d803370358410021030b41900210012201450d39201120087d21082001200241d8036a418802101e220141003b018e0220014100360288022003450d09200220013602782002420037027c2006200541286c6a2101200241d8036a200241f8006a109801200241d8036a1099010c0a0b200622032005460d010b200620074105746a2104034020012003460d102003200141201006450d102004200341206a2203470d000b0b200241d8036a41186a200141186a290000370300200241d8036a41106a200141106a290000370300200241d8036a41086a200141086a290000370300200220012900003703d803200241d8036a210320072008a7460d0a0c290b41012105410021094100210341000d270c040b41002103200522042007460d010b034020012004460d022003200420014120100622064100476a21032006450d022007200441206a2204470d000b0b4100450d010c240b41010d230b41dc3b103b000b200241f4036a200241e0006a290300370200200241fc036a200241e8006a29030037020020024184046a200241f0006a290300370200200220063602dc032002200c3602d803200220093602e003200220053602e4032002200241c0006a410c6a3602e803200220022903583702ec0320024198016a42003703002002410036028801200242003703782002200136029401200241d8036a200241f8006a109a0121010b20014201370300200120083703082002417f360240200241d8036a41186a2201200241206a41186a290300370300200241d8036a41106a2206200241206a41106a290300370300200241d8036a41086a2207200241206a41086a290300370300200220022903203703d803200220043602602002200241c0006a41086a2802003602582002200228024436025c200241f8006a200241d8006a200241d8036a10970141012103200241f8006a41106a2802002104200241f8006a410c6a280200210b200241f8006a41086a2802002105200228027c210a024020022802784101470d00200241d8006a41186a2001290300370300200241d8006a41106a2006290300370300200241d8006a41086a2007290300370300200220022903d803370358410021030b41900210012201450d2e2001200241d8036a418802101e220141003b018e022001410036028802024002402003450d00200220013602782002420037027c2005200441286c6a2101200241d8036a200241f8006a109801200241d8036a1099010c010b200241f4036a200241e0006a290300370200200241fc036a200241e8006a29030037020020024184046a200241f0006a290300370200200220053602dc032002200a3602d8032002200b3602e003200220043602e4032002200241c0006a410c6a3602e803200220022903583702ec0320024198016a42003703002002410036028801200242003703782002200136029401200241d8036a200241f8006a109a0121010b200142013703002001200f370308200241003602400b200241d8036a200241c0006a200241206a109b010240024020022802e0032201450d0020022802d80322032001200241206a200241c0006a108e01450d010b200241c8006a290300210820022802442101024020022802dc03450d0020022802d80310020b2001450d22200220083702dc03200220013602d80320024190076a200241d8036a10c7010c220b200241c0006a4104722101024020022802dc03450d00200310020b200241f8006a41086a200141086a28020036020020022001290200370378200241d8036a200241f8006a109d01200241d8036a109e010c210b2002410036022820024201370320200241d8036a41186a200141186a290000370300200241d8036a41106a200141106a290000370300200241d8036a41086a200141086a290000370300200220012900003703d803200241d8036a21030b200241206a107c200241286a2802002107200228022021060c1e0b200241e0006a107c200241e8006a28020021010c220b200241d8006a1074200241e0006a28020021040c200b20024190076a107c20024190076a41086a28020021060c210b41c43b103b000b41c1214133102d000b41c1214133102d000b41c1214133102d000b41c1214133102d000b41c1214133102d000b418431103b000b41dc32103b000b418c33103b000b41f4214122102d000b41a433103b000b419cc000103b000b41f43b103b000b41f432103b000b41fcc000103b000b4194c100103b000b41c1214133102d000b41b0294124102d000b41e4c000103b000b41f4214122102d000b41b4c000103b000b41ccc000103b000b418c3c103b000b41a43c103b000b41bc3c103b000b41c1214133102d000b200241d8036a41186a2206200520034105746a220341186a2207290000370300200241d8036a41106a220a200341106a220c290000370300200241d8036a41086a220d200341086a2212290000370300200220032900003703d80320052009417f6a22094105746a22042900002108200441086a2213290000210e200441106a2214290000210f2007200441186a2215290000370000200c200f3700002012200e37000020032008370000200420022903d8033700002013200d2903003700002014200a290300370000201520062903003700002002200b36027c200220053602782002200936028001200241d8036a200241f8006a10a20120022802e003210420022802d8032103200241d8006a41086a220642003703002002420037035841d61d4108200241d8006a1003200241c0006a41086a200629030037030020022002290358370340200241c0006a4110200320041004024020022802dc03450d00200310020b0240200b450d00200510020b200241d8006a41086a220342003703002002420037035841c81d4107200241d8006a1003200241c0006a41086a20032903003703002002200229035837034002400240200241c0006a411041d02d410041001000417f460d00200242003703d80302400240200241c0006a4110200241d8036a41084100100041016a41084d0d0020022903d8032108200241d8006a41086a220342003703002002420037035841d21e4107200241d8006a1003200241c0006a41086a200329030037030020022002290358370340200241c0006a411041d02d410041001000417f460d03200242003703d803200241c0006a4110200241d8036a41084100100041016a41084d0d01200120022903d80320087c10c5010c050b41c1214133102d000b41c1214133102d000b41f4214122102d000b41f4214122102d000b200341086a2900002108200341106a290000210e200341186a290000210f200620074105746a22042003290000370000200441186a200f370000200441106a200e370000200441086a2008370000200241206a41086a2203200741016a360200200241f8006a41086a200328020036020020022002290320370378200241d8036a200241f8006a10a20120022802e003210420022802d8032103200241d8006a41086a220542003703002002420037035841d61d4108200241d8006a1003200241c0006a41086a200529030037030020022002290358370340200241c0006a4110200320041004024020022802dc03450d00200310020b0240200228027c450d00200228027810020b2001427f10c5010b20002d000021030b410121040b410121010c070b2002280258200441d8006c6a220120022903d8033703002001200536023020012002290378370234200141086a200241d8036a41086a2205290300370300200141106a200241d8036a41106a290300370300200141186a200241d8036a41186a290300370300200141206a200241d8036a41206a290300370300200141286a200241d8036a41286a2903003703002001413c6a200241f8006a41086a290300370200200141c4006a200241f8006a41106a290300370200200141cc006a2006290300370200200241d8006a41086a2201200441016a36020020052001280200360200200220022903583703d803200241d8036a103e20022802d8032106024020052802002201450d00200141d8006c210420062101034020011038200141d8006a2101200441a87f6a22040d000b0b024020022802dc03450d00200610020b200241206a10220c050b200241d8006a41106a2206200141016a360200200241d8006a41086a220b28020020014105746a22012002290378370000200141086a200241f8006a41086a290300370000200141106a200241f8006a41106a290300370000200141186a2007290300370000200241d8036a41106a2006290300370300200241d8036a41086a200b290300370300200220022903583703d8032005200241d8036a10df010c020b20024190076a41086a220c200641016a360200200a2903002108200b290300210e2007290300210f20022802900720064105746a220620022903d803370000200641186a200f370000200641106a200e370000200641086a2008370000200241206a41086a200c2802003602002002200229039007370320410810012206450d06200220063602d803200242083702dc03200241d8036a41004108102720022802d80320022802e00322066a42e4cab5d3e38e9db93a3700002002200641086a3602e003200241f8006a41086a20022802e003360200200220022903d803370378410410012206450d06200220063602d803200242043702dc03200241d8036a41004104102720022802d803220720022802e00322066a20053600002002200641046a22063602e00320022802dc03210a200241f8006a200228028001200610272002280278220b200228028001220c6a20072006101e1a2002200c20066a220c360280010240200a450d00200710020b200228027c2107200241d8036a200241206a10a20120022802e003210a20022802d8032106200241d8006a41086a220d420037030020024200370358200b200c200241d8006a1003200241c0006a41086a200d29030037030020022002290358370340200241c0006a41102006200a1004024020022802dc03450d00200610020b02402007450d00200b10020b2002280224450d00200228022010020b200241e4036a200141086a290000370200200241ec036a200141106a290000370200200241f4036a200141186a290000370200200220053602d803200220012900003702dc03200220093a0020410810012201450d05200220013602782002420837027c200241f8006a410041081027200228027820022802800122016a42e4cab5d3e3ee9bba3a3700002002200141086a36028001200241d8006a41086a220120022802800136020020022002290378370358200241f8006a200241d8036a1045200228027c210b20022802782106200241d8006a200128020020022802800122051027200228025822072001280200220a6a20062005101e1a2001200a20056a22053602000240200b450d00200610020b200228025c2101200241d8006a41086a220642003703002002420037035820072005200241d8006a1003200241c0006a41086a200629030037030020022002290358370340200241c0006a4110200241206a410110042001450d002007100220044101460d010c020b20044101470d010b200241047210220b41012101410021040b410121050b2003411d74411d75417f4a0d0102400240200341077122034104460d0020034105470d012001450d03200041086a2d00004101470d03200041106a280200450d032000410c6a2802001002200241a0076a24000f0b2004450d02200041086a2d00004101470d022000410c6a104b200241a0076a24000f0b2005450d01200041046a2d00004101470d01200041086a104b200241a0076a24000f0b101c000b200241a0076a24000b080041ec3a1054000b080041ec3a1054000bfe2507097f027e0a7f027e067f017e0d7f230041d0026b220424000240024020014115490d0041012105410121060240024002400340200620057121070340024002402003450d0020054101710d012000200110e1012003417f6a21030c010b2000200110e201200441d0026a24000f0b2001410276220641036c2108200641017421094100210a024020014132490d0020082008417f6a220b2000200841286c6a220c41586a290300220d200c290300220e54220a1b220f200841016a200b2008200a1b200d200e200a1b220d200c41286a290300220e5422101b2000200f41286c6a290300200e200d20101b5422111b210820092009417f6a220c2000200941286c6a220b41586a290300220d200b290300220e54220b1b22122009410172220f200c2009200b1b200d200e200b1b220d2000200f41286c6a290300220e54220f1b2000201241286c6a290300200e200d200f1b5422131b210920062006417f6a22142000200641286c6a221241586a290300220d2012290300220e54220c1b2215200641016a20142006200c1b200d200e200c1b220d201241286a290300220e5422121b2000201541286c6a290300200e200d20121b5422141b210641024101200c1b200c20121b20146a200b6a200f6a20136a200a6a20106a20116a210a0b200a2000200641286c6a290300220d2000200941286c6a290300220e54220c6a200d200e200c1b220d2000200841286c6a290300220e54220b6a210a0240024002400240200020092006200c1b221641286c6a290300200e200d200b1b5a0d00200a41016a220a410b4b0d012007200a45714101470d030c020b200820062009200c1b200b1b21162007200a45714101470d020c010b2001417f6a2117024020014101762208450d002000200141286c6a41586a2106200021090340200441a8016a41206a220c200941206a220a290300370300200441a8016a41186a220b200941186a2210290300370300200441a8016a41106a220f200941106a2212290300370300200441a8016a41086a2211200941086a2213290300370300200420092903003703a801200641086a2214290300210d200641106a2215290300210e200641186a221829030021192006290300211a200a200641206a221b290300370300201020193703002012200e3703002013200d3703002009201a370300201b200c2903003703002018200b2903003703002015200f29030037030020142011290300370300200620042903a801370300200941286a2109200641586a21062008417f6a22080d000b0b201720166b211620074101714101470d010b2000200110e3010d070b024002400240024002402002450d00201620014f0d092000201641286c6a22062903002002290300540d00200441a8016a41206a220a200041206a2212290300370300200441a8016a41186a220b200041186a2211290300370300200441a8016a41106a2210200041106a2213290300370300200441a8016a41086a220f200041086a2209290300370300200420002903003703a801200641086a2208290300210d200641106a220c290300210e200641186a221429030021192006290300211a2012200641206a2215290300370300201120193703002013200e3703002009200d3703002000201a3703002015200a2903003703002014200b290300370300200c20102903003703002008200f290300370300200620042903a8013703002000290300210d200441086a41186a221c2012290300370300200441086a41106a221d2011290300370300200441086a41086a221e201329030037030020042009290300370308200041286a21144100210841002001417f6a22094f0d010c020b201620014f0d07200441a8016a41206a2224200041206a2205290300370300200441a8016a41186a2225200041186a2226290300370300200441a8016a41106a2227200041106a2228290300370300200441a8016a41086a2229200041086a222a290300370300200420002903003703a8012000201641286c6a2206290300210d200641086a2209290300210e200641106a22082903002119200641186a220c290300211a2005200641206a220a2903003703002026201a37030020282019370300202a200e3703002000200d370300200a2024290300370300200c20252903003703002008202729030037030020092029290300370300200620042903a8013703002000290300210d200441086a41186a222b2005290300370300200441086a41106a222c2026290300370300200441086a41086a222d20282903003703002004202a2903003703082001417f6a210941002120200041286a2208210602400340200d20062903005a0d01200641286a2106202041016a22202009490d000b0b200921070240200920204d0d002000200141286c6a41586a2106200921070340200d2006290300540d01200641586a21062007417f6a220720204b0d000b0b20072020490d0620092007490d032008200741286c6a210b41800121164100210a410021154100210c4100211441800121172008202041286c6a222e21180340200b20186b220641286e21090240024002400240024002400240200641a7d0004b221f0d00200941807f6a20092015200a492014200c4922087222101b21062010450d012017200620081b21172006201620081b21160b2014200c470d020c010b2006200641017622176b21162014200c470d010b2017450d0141002106200441286a2214210c201821090340200c20063a0000200c200d20092903005a6a210c200941286a2109200641016a22062017490d000b0b2015200a470d020c010b200441286a220c21142015200a470d010b02402016450d00200b41586a210641002109200441a8016a2215210a0340200a20093a0000200a200d2006290300546a210a200641586a2106200941016a22092016490d000c020b0b200441a8016a220a21150b0240200a20156b2206200c20146b2209200920064b1b221b450d00200441a8026a41206a2222201820142d000041286c6a220641206a290300370300200441a8026a41186a221c200641186a290300370300200441a8026a41106a221d200641106a290300370300200441a8026a41086a221e200641086a290300370300200420062903003703a802201820142d000041286c6a2206200b20152d00002210417f7341286c6a2209290300370300200641206a200941206a290300370300200641186a200941186a290300370300200641106a200941106a290300370300200641086a200941086a2903003703000240201b4101460d00410021080340200b2010417f7341807e7241286c6a22092018201420086a41016a2d000041286c6a2206290300370300200941206a200641206a220f290300370300200941186a200641186a2212290300370300200941106a200641106a2211290300370300200941086a200641086a22132903003703002006200b201520086a41016a2d00002210417f7341286c6a2209290300370300200f200941206a2903003703002012200941186a2903003703002011200941106a2903003703002013200941086a290300370300200841026a2106200841016a220f21082006201b490d000b2015200f6a21152014200f6a21140b200920042903a802370300200941206a2022290300370300200941186a201c290300370300200941106a201d290300370300200941086a201e290300370300201541016a2115201441016a21140b2018201741286c6a20182014200c461b2118200b410020166b41286c6a200b2015200a461b210b201f0d000b024002402014200c4f0d00200b41586a2106200c21080340200441a8026a41206a220a20182008417f6a22082d000041286c6a220941206a2210290300370300200441a8026a41186a220f200941186a2212290300370300200441a8026a41106a2211200941106a2213290300370300200441a8026a41086a2215200941086a221b290300370300200420092903003703a802200641086a2216290300210e200641106a22172903002119200641186a221f290300211a200629030021212010200641206a22222903003703002012201a37030020132019370300201b200e370300200920213703002022200a290300370300201f200f2903003703002017201129030037030020162015290300370300200620042903a802370300200641586a210620142008490d000b200b2014200c6b41286c6a21180c010b20182106200a21082015200a4f0d0003402008417f6a22082d00002109200441a8026a41206a220c200641206a2210290300370300200441a8026a41186a220f200641186a2212290300370300200441a8026a41106a2211200641106a2213290300370300200441a8026a41086a2214200641086a221b290300370300200420062903003703a802200b2009417f7341286c6a2209290300210e200941086a22162903002119200941106a2217290300211a200941186a221f29030021212010200941206a2222290300370300201220213703002013201a370300201b20193703002006200e3703002022200c290300370300201f200f2903003703002017201129030037030020162014290300370300200920042903a802370300200641286a210620152008490d000b2018200a20156b41286c6a21180b2000200d3703002005202b2903003703002026202c2903003703002028202d290300370300200020042903083703080240024020012018202e6b41286e20206a22094d0d002024200529030037030020252026290300370300202720282903003703002029202a290300370300200420002903003703a8012000200941286c6a2206290300210d200641086a2208290300210e200641106a220c2903002119200641186a220a290300211a2005200641206a220b2903003703002026201a37030020282019370300202a200e3703002000200d370300200b2024290300370300200a2025290300370300200c202729030037030020082029290300370300200620042903a801370300200120096b2208450d0120082009200920084b1b210c2001410376210a200641286a210b0240024020092008417f6a22014f0d00200020092002200310c40120062102200b21000c010b200b20012006200310c401200921010b200c200a4f2105200720204d2106200141154f0d070c0b0b41b4c20020092001103c000b41c4c200103b000b410021230c010b410621230b03400240024002400240024002400240024002400240024002400240024002400240024020230e0a04080905060001020307070b200a2014200841286c6a220c41206a2215290300370300200b200c41186a22182903003703002010200c41106a221b290300370300200f200c41086a22162903003703002004200c2903003703a801200641086a2217290300210e200641106a221f2903002119200641186a2220290300211a200629030021212015200641206a22222903003703002018201a370300201b20193703002016200e370300200c20213703002022200a2903003703002020200b290300370300201f20102903003703002017200f290300370300200620042903a801370300200841016a22082009417f6a22094f0d0d410621230c100b2014200841286c6a2106410721230c0f0b2006290300200d540d0a410821230c0e0b200641286a2106200841016a22082009490d08410021230c0d0b200820094f0d06410321230c0c0b2000200941286c6a2106410421230c0b0b2006290300200d5a0d09410921230c0a0b200641586a210620082009417f6a2209490d07410121230c090b2000200d3703002012201c2903003703002011201d2903003703002013201e290300370300200020042903083703082001200841016a2206490d01410221230c080b2000200641286c6a2100200120066b220141154f0d090c0e0b200620011055000b410121230c050b410721230c040b410021230c030b410021230c020b410421230c010b410521230c000b0b0b0b200720091029000b202020071055000b41b4c20020162001103c000b41dcc20020162001103c000b20014102490d002000210a410121090340200941016a210c02402000200941286c6a220641586a22082903002006290300220d5a0d00200441086a41186a2210200641206a220b290300370300200441086a41106a220f200641186a2212290300370300200441086a41086a2211200641106a22132903003703002004200629030837030820062008290300370300200641086a200841086a2903003703002013200841106a2903003703002012200841186a290300370300200b200841206a2903003703004100210b0240024002402009417f6a2208450d00200a21060340200641586a2209290300200d5a0d02200641206a200641786a290300370300200641186a200641706a290300370300200641106a200641686a290300370300200641086a200641606a29030037030020062009290300370300200921062008417f6a22080d000b200921060c020b2000200841286c6a21060c010b2008210b0b2006200d3703002000200b41286c6a22062004290308370308200641206a2010290300370300200641186a200f290300370300200641106a20112903003703000b200a41286a210a200c2109200c2001490d000b0b200441d0026a24000b9a0301057f230041306b220224000240410810012203450d002002200336022020024208370224200241206a4100410810272002280220200228022822036a42f3e885d3a3ec9bb73a3700002002200341086a360228200241106a41086a200228022836020020022002290320370310412010012203450d002002200336022020024220370224200241206a41004120102720022802202204200228022822056a22032000290000370000200341086a200041086a290000370000200341106a200041106a290000370000200341186a200041186a2900003700002002200541206a220036022820022802242105200241106a20022802182000102720022802102203200228021822066a20042000101e1a2002200620006a220036021802402005450d00200410020b2002280214210420022001370308200241206a41086a220542003703002002420037032020032000200241206a1003200241106a41086a200529030037030020022002290320370310200241106a4110200241086a4108100402402004450d00200310020b200241306a24000f0b101c000bc70302057f017e230041206b220224000240410810012203450d002002200336021020024208370214200241106a4100410810272002280210200228021822036a42f3e885d3a3ac98b63a3700002002200341086a360218200241086a200228021836020020022002290310370300412010012203450d002002200336021020024220370214200241106a41004120102720022802102204200228021822056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a220136021820022802142105200220022802082001102720022802002203200228020822066a20042001101e1a2002200620016a220136020802402005450d00200410020b2002280204210442002107200241106a41086a220542003703002002420037031020032001200241106a1003200241086a200529030037030020022002290310370300024002402002411041d02d410041001000417f460d002002420037031020024110200241106a41084100100041016a41084d0d01200229031021070b02402004450d00200310020b200241206a240020070f0b41c1214133102d000b101c000ba11105027f017e0e7f017e0b7f230041b0036b2202240020024188016a41086a2203200141086a2802003602002002200129020037038801200241086a20024188016a109d01200241306a41206a200241086a41206a280200360200200241306a41186a200241086a41186a290300370300200241306a41106a200241086a41106a290300370300200241306a41086a200241086a41086a2903003703002002200229030837033020024188016a200241306a10c8010240024020022903a80122044202510d00200241f0016a4104722105200241c0016a210620024188016a41206a2107200241b0016a2108200241b8016a2109200241bc016a210a20024194016a210b2002419c016a210c200241ac016a210d0340200241e8006a41186a220120024188016a41186a220e290300370300200241e8006a41106a220f20024188016a41106a2210290300370300200241e8006a41086a22112003290300370300200241d8006a41086a2212200641086a2903003703002002200229038801370368200220062903003703582008290300211320092802002114200a2802002115200241d0016a41186a22162001290300370300200241d0016a41106a2217200f290300370300200241d0016a41086a22182011290300370300200220022903683703d001200241f0016a41086a2012290300370300200220022903583703f001024020044201520d00410810012201450d0320022001360288012002420837028c0120024188016a41004108102720032003280200220141086a36020020012002280288016a42f3e885d3a3ac98b63a370000200241a8026a41086a2201200328020036020020022002290388013703a80241201001220f450d032002200f360288012002422037028c0120024188016a41004120102720032003280200221141206a220f360200201120022802880122126a221120022903d001370000201141086a2018290300370000201141106a2017290300370000201141186a2016290300370000200228028c012119200241a8026a2001280200200f102720022802a80222112001280200221a6a2012200f101e1a2001201a200f6a220f36020002402019450d00201210020b20022802ac022101200220133703880120024190036a41086a2212420037030020024200370390032011200f20024190036a100320024180036a41086a201229030037030020022002290390033703800320024180036a411020024188016a410810042001450d00201110020b024002402014450d00200320022802f0013602002002201536028c012002201436028801200241d0016a20024188016a10c9014101211b2015450d01201410020c010b4100211b0b2003200541086a280200360200200220052902003703880120024180026a20024188016a109801200241a8026a41206a20024180026a41206a280200360200200241a8026a41186a20024180026a41186a290300370300200241a8026a41106a20024180026a41106a290300370300200241a8026a41086a20024180026a41086a29030037030020022002290380023703a80220024188016a200241a8026a10ca010240200228028801450d000340200241d0026a41086a2201200328020036020020022002290388013703d002200b280200211120102802002112200c2802002119200241e0026a41086a220f2001280200360200200220022903d0023703e002024002402011450d00200241f0026a41086a2019360200200220123602f402200220113602f002200e20162903003703002010201729030037030020032018290300370300200720022903e002370200200741086a200f280200360200200220022903d00137038801410810012201450d062002200136029003200242083702940320024190036a41004108102720024190036a41086a22012001280200220f41086a360200200f2002280290036a42f3e885d3b38eddb73a37000020024180036a41086a220f200128020036020020022002290390033703800320024190036a20024188016a10cb01200228029403211c200228029003211a20024180036a200f280200200128020022191027200228028003221d200f280200221e6a201a2019101e1a200f201e20196a221e3602000240201c450d00201a10020b200228028403211a200241a0036a200241f0026a1051200241a0036a41086a280200211c20022802a0032119200142003703002002420037039003201d201e20024190036a1003200f200129030037030020022002290390033703800320024180036a41102019201c1004024020022802a403450d00201910020b0240201a450d00201d10020b0240200d280200450d00200728020010020b2012450d01201110020c010b200720022903e002370200200e20162903003703002010201729030037030020032018290300370300200741086a200f280200360200200220022903d00137038801410810012201450d052002200136029003200242083702940320024190036a41004108102720024190036a41086a22012001280200220f41086a360200200f2002280290036a42f3e885d3b38eddb73a37000020024180036a41086a220f200128020036020020022002290390033703800320024190036a20024188016a10cb01200228029403211a200228029003211220024180036a200f2802002001280200221110272002280280032219200f280200221d6a20122011101e1a200f201d20116a22113602000240201a450d00201210020b20022802840321122001420037030020024200370390032019201120024190036a1003200f200129030037030020022002290390033703800320024180036a4110100502402012450d00201910020b200d280200450d00200728020010020b20024188016a200241a8026a10ca012002280288010d000b0b200241a8026a1099010240201b201445720d002015450d00201410020b20024188016a200241306a10c801200729030022044202520d000b0b200241306a109e01200241b0036a24000f0b101c000bc10b03087f017e027f230041d0016b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01be034f0d01200241306a41186a2206200520034105746a220741d8036a290000370300200241306a41106a2208200741d0036a290000370300200241306a41086a2209200741c8036a2900003703002002200741c0036a290000370330200141046a2005360200200141086a20043602002001410c6a200341016a360200200241d0006a41206a22072005200341286c6a220341206a290300370300200241d0006a41186a2205200341186a290300370300200241d0006a41106a2204200341106a290300370300200241d0006a41086a2201200341086a29030037030020022003290300370350200241f8006a41186a2006290300370300200241f8006a41106a2008290300370300200241f8006a41086a2009290300370300200241f8006a41286a2001290300370300200241a8016a2004290300370300200241b0016a2005290300370300200241b8016a20072903003703002002200229033037037820022002290350370398012000200241f8006a41c800101e1a200241d0016a24000f0b20004202370320200241d0016a24000f0b200128020021070240024020052802b8032203450d0020053201bc03210a2002200336027c2002200741016a22073602782002200a4220862004ad84220a370380010c010b2004ad210a410021030b20051002200241106a220820033602002002200736020c02400240200a422088a7220520032f01be034f0d00200241186a2005360200200241146a200a3e020020024100360208200241086a410472210b200241206a21070c010b200241146a2209200a37020020024101360208200aa72104200241086a410472210b200241186a210c2003210503400240024020032802b8032206450d00200741016a210720033201bc034220862004ad84210a200621030c010b2004ad210a410021030b024020051002200820033602002002200736020c0240200a422088a7220520032f01be034f0d00200c20053602002009200aa72204360200200241003602082003210541000d020c010b2009200a370200200aa72104200241013602082003210541010d010b0b200241206a21070b2007200b290200370200200741086a200b41086a290200370200200241306a41086a20022802242206200228022c22084105746a220341c8036a290000370300200241306a41106a200341d0036a290000370300200241306a41186a200341d8036a2900003703002002200341c0036a290000370330200241d0006a41206a2006200841286c6a220341206a290300370300200241d0006a41186a200341186a290300370300200241d0006a41106a200341106a290300370300200241d0006a41086a200341086a290300370300200220032903003703502007280200210920022802282105200241f8006a41086a2204200620084102746a41a4066a280200220736020020024184016a2206200536020020022009417f6a220336027c20022003410047360278024002402003450d002009417e6a2103200241f8006a41047221080340200420072802a0062207360200200620053602002002200336027c200220034100473602782003417f6a2203417f470d000c020b0b200241f8006a41047221080b200120082902003702002001410c6a4100360200200141086a200841086a280200360200200241f8006a41186a200241306a41186a290300370300200241f8006a41106a200241306a41106a290300370300200241f8006a41086a200241306a41086a290300370300200241a0016a200241d0006a41086a290300370300200241a8016a200241d0006a41106a290300370300200241b0016a200241d0006a41186a290300370300200241b8016a200241f0006a2903003703002002200229033037037820022002290350370398012000200241f8006a41c800101e1a200241d0016a24000bb30301057f230041306b220224000240410810012203450d002002200336022020024208370224200241206a4100410810272002280220200228022822036a42f3e885d3b3ec9bb23a3700002002200341086a360228200241106a41086a200228022836020020022002290320370310412010012203450d002002200336022020024220370224200241206a41004120102720022802202204200228022822056a22032000290000370000200341086a200041086a290000370000200341106a200041106a290000370000200341186a200041186a2900003700002002200541206a220036022820022802242105200241106a20022802182000102720022802102203200228021822066a20042000101e1a2002200620006a220636021802402005450d00200410020b200228021421042002200110512002280208210120022802002100200241206a41086a220542003703002002420037032020032006200241206a1003200241106a41086a200529030037030020022002290320370310200241106a411020002001100402402002280204450d00200010020b02402004450d00200310020b200241306a24000f0b101c000bba0803057f017e057f230041f0006b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f018e024f0d01200141046a2005360200200141086a20043602002001410c6a200341016a360200200241086a220620052003410c6c6a220341086a28020036020020022003290200370300200241c8006a41086a22052006280200360200200241dc006a2003418c016a280200360200200020022903002207370200200220034184016a290200370254200041086a2005290300370200200041106a200241c8006a41106a29030037020020022007370348200241f0006a24000f0b20004100360200200241f0006a24000f0b20012802002106024002402005280288022203450d00200532018c0221072002200336024c2002200641016a2206360248200220074220862004ad8422073703500c010b2004ad2107410021030b20051002200241086a2208200336020020022006360204024002402007422088a7220520032f018e024f0d00200241106a20053602002002410c6a20073e02002002410036020020024104722109200241186a21060c010b2002410c6a220a2007370200200241013602002007a7210420024104722109200241106a210b20032105034002400240200328028802220c450d00200641016a2106200332018c024220862004ad842107200c21030c010b2004ad2107410021030b024020051002200820033602002002200636020402402007422088a7220520032f018e024f0d00200b2005360200200a2007a72204360200200241003602002003210541000d020c010b200a20073702002007a72104200241013602002003210541010d010b0b200241186a21060b20062009290200370200200641086a200941086a290200370200200241286a41086a200228021c220c2002280224220a410c6c6a220341086a28020036020020022003290200370328200241386a41086a2003418c016a280200360200200220034184016a2902003703382006280200210820022802202105200241c8006a41086a2204200c200a4102746a4194026a2802002206360200200241c8006a410c6a220c200536020020022008417f6a220336024c20022003410047360248024002402003450d002008417e6a2103200241c8006a4104722108034020042006280290022206360200200c20053602002002200336024c200220034100473602482003417f6a2203417f470d000c020b0b200241c8006a41047221080b200120082902003702002001410c6a4100360200200141086a200841086a280200360200200241c8006a41086a2203200241286a41086a280200360200200241dc006a200241386a41086a28020036020020002002290328220737020020022002290338370254200041086a2003290300370200200041106a200241c8006a41106a29030037020020022007370348200241f0006a24000bda0201057f230041206b22022400200241003602082002420137030020024100412010272002280200200228020822036a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002002200341206a2205360208200241106a200141206a1051200228021021032002200520022802182204102720022004200228020822066a22013602082006200228020022056a20032004101e1a02402002280214450d00200310020b02402001417f4c0d00024002402001450d002001100122040d01101c000b410121040b200220013602142002200436021020024100360218200241106a41002001102720022002280218220420016a360218200420022802106a20052001101e1a200041086a20022802183602002000200229031037020002402002280204450d00200510020b200241206a24000f0b1019000b02000be90502047f017e230041d0006b220524000240024002402004417f4c0d000240024002402004450d002004100122060d010c020b410121060b200520043602042005200636020020054100360208200541002004102720052005280208220620046a360208200620052802006a20032004101e1a200541c0006a41086a2204200528020836020020052005290300370340200541186a200241186a290000370300200541106a200241106a290000370300200541086a200241086a290000370300200541286a20042802003602002005200229000037030020052005290340370320410810012204450d002005200436024020054208370244200541c0006a4100410810272005280240200528024822046a42f3e885d3b38eddb73a3700002005200441086a360248200541306a41086a2204200528024836020020052005290340370330200541c0006a200510cb012005280244210720052802402103200541306a200428020020052802482202102720052802302206200428020022086a20032002101e1a2004200820026a220236020002402007450d00200310020b20052802342103200541c0006a41086a220442003703002005420037034020062002200541c0006a1003200541306a41086a20042903003703002005200529034037033002400240024002400240200541306a411041d02d410041001000417f460d00200541003602404100200541306a4110200541c0006a41044100100022042004417f461b220741034d0d0820052802402204417f4c0d062004450d01200410012202450d0520024100200410171a0c020b2000410036020020030d020c030b410121020b20044100200541306a4110200220042007410420074104491b100022072007417f461b4b0d042002450d0520002004ad2209422086200984370204200020023602002003450d010b200610020b0240200541246a280200450d00200541206a28020010020b200541d0006a24000f0b101c000b1019000b200210020b41c1214133102d000bd50402057f017e230041206b220324000240024002400240410810012204450d002003200436021020034208370214200341106a4100410810272003280210200328021822046a42f3e885d3b3ec9bb23a3700002003200441086a360218200341086a200328021836020020032003290310370300412010012204450d002003200436021020034220370214200341106a41004120102720032802102205200328021822066a22042002290000370000200441086a200241086a290000370000200441106a200241106a290000370000200441186a200241186a2900003700002003200641206a220236021820032802142104200320032802082002102720032802002206200328020822076a20052002101e1a2003200720026a220236020802402004450d00200510020b20032802042105200341106a41086a220442003703002003420037031020062002200341106a1003200341086a200429030037030020032003290310370300024002400240024002402003411041d02d410041001000417f460d0020034100360210410020034110200341106a41044100100022022002417f461b220741034d0d0820032802102202417f4c0d062002450d01200210012204450d0520044100200210171a0c020b200041003602082000420137020020050d020c030b410121040b2002410020034110200420022007410420074104491b100022072007417f461b4b0d042004450d0520002002ad2208422086200884370204200020043602002005450d010b200610020b200341206a24000f0b101c000b1019000b200410020b41c1214133102d000ba90701047f230041f0006b220424000240024002402003280200450d00200441086a200341086a28020036020020042003290200370300200441106a41186a200141186a290000370300200441106a41106a200141106a290000370300200441106a41086a200141086a290000370300200441386a200241086a2802003602002004200129000037031020042002290200370330410810012201450d022004200136025020044208370254200441d0006a4100410810272004280250200428025822016a42f3e885d3b38eddb73a3700002004200141086a360258200441c0006a41086a2201200428025836020020042004290350370340200441d0006a200441106a10cb012004280254210520042802502102200441c0006a200128020020042802582203102720042802402206200128020022076a20022003101e1a2001200720036a220336020002402005450d00200210020b20042802442102200441e0006a200410512004280268210520042802602101200441d0006a41086a220742003703002004420037035020062003200441d0006a1003200441c0006a41086a200729030037030020042004290350370340200441c0006a411020012005100402402004280264450d00200110020b02402002450d00200610020b0240200441346a280200450d00200441306a28020010020b2004280204450d0120042802001002200441f0006a24000f0b200441106a41186a200141186a290000370300200441106a41106a200141106a290000370300200441106a41086a200141086a290000370300200441386a200241086a2802003602002004200129000037031020042002290200370330410810012201450d012004200136025020044208370254200441d0006a4100410810272004280250200428025822016a42f3e885d3b38eddb73a3700002004200141086a360258200441c0006a41086a2201200428025836020020042004290350370340200441d0006a200441106a10cb012004280254210520042802502102200441c0006a200128020020042802582203102720042802402206200128020022076a20022003101e1a2001200720036a220336020002402005450d00200210020b20042802442101200441d0006a41086a220242003703002004420037035020062003200441d0006a1003200441c0006a41086a200229030037030020042004290350370340200441c0006a4110100502402001450d00200610020b200441346a280200450d00200441306a28020010020b200441f0006a24000f0b101c000b1e002001200210c9010240200241046a280200450d00200228020010020b0b9a0301057f230041306b220324000240410810012204450d002003200436022020034208370224200341206a4100410810272003280220200328022822046a42f3e885d3a3ac98b63a3700002003200441086a360228200341106a41086a200328022836020020032003290320370310412010012204450d002003200436022020034220370224200341206a41004120102720032802202205200328022822066a22042001290000370000200441086a200141086a290000370000200441106a200141106a290000370000200441186a200141186a2900003700002003200641206a220136022820032802242106200341106a20032802182001102720032802102204200328021822076a20052001101e1a2003200720016a220136021802402006450d00200510020b2003280214210520032002370308200341206a41086a220642003703002003420037032020042001200341206a1003200341106a41086a200629030037030020032003290320370310200341106a4110200341086a4108100402402005450d00200410020b200341306a24000f0b101c000bf90f020b7f017e230041a0036b220424002001280204210520022802082106200228020421072002280200210802400240200128020022092f018e02220a450d004107210b0c010b4101210b0b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200b0e1b0a090b0c0d0708000102030406050e1a0f10141617151819121113130b2009200a410c6c6a210c4100210a200921024108210b0c300b20082002280200200241086a280200220d20062006200d4b1b1006220e450d1b4109210b0c2f0b200e411e76417f73410271417f6a220d450d24410a210b0c2e0b200d4101470d1d410b210b0c2d0b200a41016a210a2002410c6a2202200c470d1b0c1a0b4100417f41012006200d491b2006200d461b220d0d20410c210b0c2b0b200441013a00980120042d0098014101710d154105210b0c2a0b2005450d1d4106210b0c290b2005417f6a21052009200a4102746a4190026a28020022092f018e02220a0d124101210b0c280b200441003a00980120042d009801410171450d180c190b2009418e026a2f0100210a0c130b200141086a2102200aad4220862001ad84210f2007450d184103210b0c250b200810024104210b0c240b20042005360268200420023602782004200936026c2004200f370370200441086a41086a2202200341086a2802003602002004200329020037030820044198016a41086a220a2009200f422088a7410c6c6a2206418c016a220d280000220536020020064184016a2206290000210f20062004290308370000200d2002280200360000200220053602002004200f370398012004200f370308200a20022802003602002004200429030837039801200041013602002000410c6a200a2802003602002000200429039801370204200441a0036a24000f0b200441086a41106a20093602002001200128020841016a3602082004411c6a200aad4220862001ad84220f3702002004200736020c2004200836020820042006ad3703102004200936026c200441003602682004200f3703702004200736024c2004200836024820042006360250200441d8006a41086a200341086a2802003602002004200329020037035820044198016a200441e8006a200441c8006a200441d8006a1089012004280298014101470d1a4110210b0c220b200441286a41086a200441b0016a280200360200200441386a41086a200441bc016a280200360200200420044198016a41106a2903003703282004200441b4016a290200370338200441a4016a2802002102200441c4016a2802002109200441c0016a280200210a200428029c01210520044198016a41086a280200220d280288022206450d1a4111210b0c210b200d2f018c02210d2004200636026c2004200541016a2205360268200420023602702004200d3602744100450d1b4119210b0c200b2005210241c002100122060d1e4118210b0c1f0b101c000b2004200d36026c20042005360268200420023602702002210541010d174112210b0c1d0b200441b4016a210e200441a8016a2108200441e8006a410c6a210c200441c4016a2103200441c0016a21010c180b20032802002109200428029c0141016a2105200d2f018c02210d4113210b0c1b0b200441e8006a41086a2002360200200c200d3602002004200636026c20042005360268200441c8006a41086a200441286a41086a220228020036020020042004290328370348200441d8006a41086a200441386a41086a22062802003602002004200429033837035820044198016a200441e8006a200441c8006a200441d8006a200a2009108a012004280298014101470d114114210b0c1a0b2002200841086a2802003602002006200e41086a280200360200200420082902003703282004200e29020037033820044198016a410c6a28020021022001280200210a20044198016a41086a280200220d2802880222060d164116210b0c190b41c00210012206450d164117210b0c180b200620044198016a418802101e220641003b018e022006410036028802200620042902683702900220064198026a200441e8006a41086a290200370200200641a0026a200441f8006a290200370200200641a8026a20044180016a290200370200200641b0026a20044188016a290200370200200641b8026a20044190016a2902003702002006200228020036029002200220063602002002200228020441016a360204200628029002220241003b018c022002200636028802200620062f018e02220d410c6c6a220220042903283702002002418c016a200441386a41086a280200220536020020024184016a2004290338220f370200200241086a200441286a41086a28020036020020064190026a200d41016a22024102746a200a360200200620062f018e0241016a3b018e0220044198016a41086a2005360200200a20023b018c02200a2006360288022004200f37039801410f210b0c170b20004100360200200441a0036a24000f0b4107210b0c150b4102210b0c140b410d210b0c130b4101210b0c120b4100210b0c110b4108210b0c100b4101210b0c0f0b4105210b0c0e0b4102210b0c0d0b4104210b0c0c0b410e210b0c0b0b410a210b0c0a0b410c210b0c090b410f210b0c080b410f210b0c070b411a210b0c060b4119210b0c050b4112210b0c040b4113210b0c030b4115210b0c020b4118210b0c010b4117210b0c000b0b4501017f230041c0006b22012400200141386a2000410c6a28020036020020012000290204370330200141086a200141306a109d01200141086a109e01200141c0006a24000b7302017f017e024020002802002202417f460d002000200241016a36000002400240200041046a20011096012202450d002002280200450d00200241086a29030021030c010b20002802102001200041146a28020028021411140021030b20002000280200417f6a36000020030f0b109f01000b960501077f230041e0026b22032400200341086a200241086a28020036020020032002290200370300024002400240024020002802000d002000417f360000200341306a41186a2204200141186a290000370300200341306a41106a2205200141106a290000370300200341306a41086a200141086a290000370300200320012900003703302003200041046a3602182003200041086a28020036021020032000280204360214200341b8026a200341106a200341306a10970141012102200341b8026a41106a2802002106200341c4026a2802002107200341b8026a41086a280200210820032802bc022109024020032802b8024101470d00200341106a41186a2004290300370300200341106a41106a2005290300370300200341106a41086a200341306a41086a29030037030020032003290330370310410021020b41900210012201450d012001200341306a418802101e220141003b018e02200141003602880202402002450d00200320013602b802200342003702bc02200341306a200341b8026a109801200341306a1099012008200641286c6a220241106a210120022802102206450d040c030b200341cc006a200341186a290300370200200341d4006a200341206a290300370200200341dc006a200341286a2903003702002003200836023420032009360230200320073602382003200636023c20032000410c6a36024020032003290310370244200341d8026a4200370300200341003602c802200342003703b802200320013602d402200341306a200341b8026a109a01220241106a2101200228021022060d020c030b10c301000b101c000b200241146a280200450d00200610020b20012003290300370200200141086a200341086a28020036020020004100360000200341e0026a24000bab0401097f230041d0026b220324000240024020002802000d002000417f360000200341c8006a41186a2204200141186a290000370300200341c8006a41106a2205200141106a290000370300200341c8006a41086a2206200141086a290000370300200320012900003703482003200041046a3602082003200041086a28020036020020032000280204360204200341206a2003200341c8006a10970141012107200341206a41106a28020021082003412c6a2802002109200341206a41086a280200210a2003280224210b024020032802204101470d00200341186a2004290300370300200341106a2005290300370300200341086a200629030037030020032003290348370300410021070b41900210012201450d012001200341c8006a418802101e220141003b018e022001410036028802024002402007450d002003200136022020034200370224200a200841286c6a2101200341c8006a200341206a109801200341c8006a1099010c010b200341e4006a200341086a290300370200200341ec006a200341106a290300370200200341f4006a200341186a2903003702002003200a36024c2003200b360248200320093602502003200836025420032000410c6a3602582003200329030037025c200341c0006a420037030020034100360230200342003703202003200136023c200341c8006a200341206a109a0121010b200142013703002001200237030820004100360000200341d0026a24000f0b10c301000b101c000bfc0103017f017e047f230041306b2203240020034100360208200342013703002002290300210420034100410810272003280200200328020822056a20043700002003200541086a2206360208200341206a200241086a10a201200328022021052003200620032802282202102720032002200328020822076a22083602082007200328020022066a20052002101e1a02402003280224450d00200510020b200341206a41086a220242003703002003420037032020002001200341206a1003200341106a41086a200229030037030020032003290320370310200341106a411020062008100402402003280204450d00200610020b200341306a24000bfb1903047f017e077f230041d0006b22022400200241003602082002420137030002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220341044b0d000240024002400240024020030e050004020301000b2002107e2002280200200241086a22032802006a41013a00002003200328020041016a22043602002002410036024820024201370340200141086a28020022054101460d0920054102470d1a200241c0006a107e20022802402205200241c8006a220328020022016a41013a00002003200141016a22013602000c0a0b2002107e2002280200200241086a22032802006a41073a00002003200328020041016a3602002002410036024820024201370340200141086a28020022034101460d0420034102470d1a200241c0006a107e2002280240200241c0006a41086a220328020022056a41013a00002003200541016a2205360200200141106a2903002106200241c0006a20054108102720032003280200220441086a22013602002004200228024022056a20063700000c050b2002107e2002280200200241086a22032802006a41053a00002003200328020041016a360200200241003602382002420137033020012d000422034103714101460d0520034102470d1a200241306a107e2002280230200241306a41086a220328020022056a41013a00002003200541016a2205360200200141086a2802002104200241306a20054104102720032003280200220741046a22013602002007200228023022056a20043600000c060b2002107e2002280200200241086a22032802006a41063a00002003200328020041016a3602002002410036024820024201370340200141086a22042d0000417f6a220341034b0d1a024020030e04000d0a0c000b200241c0006a107e2002280240200241c8006a220328020022056a41003a00002003200541016a22053602002001410c6a2802002104200241c0006a20054104102720032003280200220741046a22013602002007200228024022056a20043600000c0d0b2002107e2002280200200241086a22032802006a41023a00002003200328020041016a3602002002410036024820024201370340200141086a280200417f6a220341034b0d1a024020030e04000f0a0e000b200241c0006a107e2002280240200241c0006a41086a220328020022056a41003a00002003200541016a2205360200200141106a2903002106200241c0006a20054108102720032003280200220441086a22013602002004200228024022056a20063700000c0f0b2002107e2002280200200241086a22032802006a41003a00002003200328020041016a3602002002410036021820024201370310200128020422034101460d0620034102470d1a200241106a107e2002280210200241106a41086a220328020022056a41013a00002003200541016a2208360200200141106a220328020021052002410036024820024201370340200241c0006a4100410410272002280240200228024822046a20053600002002200441046a360248200241206a41086a220420022802483602002002200229034037032020032802002203450d0f200141086a2802002201200341186c6a21090340200241306a41086a2203410036020020024201370330200241c0006a200110512002280240210a200241306a4100200241c0006a41086a220528020022071027200320072003280200220b6a220c360200200b20022802306a200a2007101e1a02402002280244450d00200a10020b200241c0006a2001410c6a220d10512002280240210a200241306a200c200528020022071027200320072003280200220c6a2201360200200c2002280230220b6a200a2007101e1a02402002280244450d00200a10020b2001417f4c0d14024002402001450d002001100122030d010c170b410121030b200541003602002002200136024420022003360240200241c0006a41002001102720052005280200220720016a22033602002007200228024022056a200b2001101e1a2002280244210102402002280234450d00200b10020b200241206a2004280200200310272002280220220a200428020022076a20052003101e1a2004200720036a220336020002402001450d00200510020b200d410c6a22012009470d000c110b0b200241c0006a107e2002280240200241c0006a41086a220328020022056a41003a00002003200541016a2205360200200141106a2903002106200241c0006a20054108102720032003280200220441086a22013602002004200228024022056a20063700000b200228024421042002200241086a22032802002001102720032003280200220720016a360200200720022802006a20052001101e1a2004450d10200510020c100b200241306a107e2002280230200241306a41086a220328020022056a41003a00002003200541016a2207360200200241c0006a200141086a28020010d80120022802402104200241306a200720022802482205102720032005200328020022076a220a360200200720022802306a20042005101e1a02402002280244450d00200410020b410221030240200141056a2d000022014103714102460d004100210320014101470d00410121030b200241306a200a41011027200241386a22012001280200220441016a22013602002004200228023022056a20033a00000b200228023421042002200241086a22032802002001102720032003280200220720016a360200200720022802006a20052001101e1a2004450d0e200510020c0e0b200241c0006a107e2002280240200241c0006a41086a220428020022056a41003a00002004200541016a2205360200200141106a2903002106200241c0006a20054108102720022802402205200428020022016a20063700002004200141086a2201360200200328020021040b200228024421032002200420011027200241086a22042004280200220420016a360200200420022802006a20052001101e1a2003450d0c200510020c0c0b200241106a107e2002280210200241106a41086a220328020022056a41003a00002003200541016a2205360200200241c0006a200141086a105120022802402107200241106a2005200228024822041027200320042003280200220a6a2201360200200a200228021022056a20072004101e1a2002280244450d0a200710020c0a0b200241c0006a107e2002280240200241c0006a41086a220328020022056a41023a00002003200541016a2205360200200141106a2903002106200241c0006a20054108102720032003280200220441086a22013602002004200228024022056a20063700000c030b200241c0006a107e2002280240200241c8006a220328020022056a41023a00002003200541016a22053602002001410c6a2802002104200241c0006a20054104102720032003280200220741046a22013602002007200228024022056a20043600000c050b200241c0006a107e2002280240200241c0006a41086a220328020022056a41033a00002003200541016a2205360200200141106a2903002106200241c0006a20054108102720032003280200220441086a22013602002004200228024022056a20063700000c010b200241c0006a107e2002280240200241c0006a41086a220328020022016a41013a00002003200141016a2201360200200241c0006a20014120102720032003280200220741206a22013602002007200228024022056a220341086a200441096a290000370000200341106a200441116a290000370000200341186a200441196a290000370000200320042900013700000b200228024421042002200241086a22032802002001102720032003280200220720016a360200200720022802006a20052001101e1a2004450d06200510020c060b200241c0006a107e20022802402205200241c8006a220328020022016a41033a00002003200141016a22013602000c010b200241c0006a107e2002280240200241c0006a41086a220328020022056a41013a00002003200541016a2205360200200141106a2903002106200241c0006a20054108102720032003280200220441086a22013602002004200228024022056a20063700000b200228024421042002200241086a22032802002001102720032003280200220720016a360200200720022802006a20052001101e1a2004450d03200510020c030b200228022821032002280220210a0b20022802242104200241106a20082003102720022002280218220720036a22013602182007200228021022056a200a2003101e1a2004450d00200a10020b200228021421042002200241086a22032802002001102720032003280200220720016a360200200720022802006a20052001101e1a2004450d00200510020b20002002290300370200200041086a200241086a280200360200200241d0006a24000f0b1019000b101c000b41ec30103b000b41843e103b000b41ac3f103b000b419435103b000b41943b103b000b41ecc100103b000bc20201027f230041c0006b22022400200241106a41086a220342003703002002420037031020014107200241106a1003200241086a20032903003703002002200229031037030002402002411041d02d410041001000417f460d00200241386a4200370300200241206a41106a4200370300200241206a41086a420037030020024200370320024020024110200241206a4120410010002203417f460d002003411f4d0d0020002002290320370000200041186a200241206a41186a290300370000200041106a200241206a41106a290300370000200041086a200241206a41086a2200290300370000200241106a41086a220342003703002002420037031020014107200241106a10032000200329030037030020022002290310370320200241206a41101005200241c0006a24000f0b41c1214133102d000b41f4214122102d000bb80101027f230041306b22032400200341206a41086a220442003703002003420037032020012002200341206a1003200341086a200429030037030020032003290320370300024002402003411041d02d410041001000417f460d002003421037021420032003360210200341206a200341106a103a20032802202201450d012000200329022437020420002001360200200341306a24000f0b2000410036020820004201370200200341306a24000f0b41c1214133102d000b8d5b05087f037e137f017e017f230041e0016b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d000022034103714101460d00024020034102460d0020034103470d0d200241206a200041196a290000370300200241186a200041116a290000370300200241106a200041096a29000037030020022000290001370308200241386a1047200228023822042002280240220541286c22066a2107200421030240200641286d4104490d00200421060340200120062203460d062003200141201006450d06200341286a22062001460d0a2006200141201006450d0a200641286a22062001460d0b2006200141201006450d0b200641286a22062001460d0c2006200141201006450d0c2007200641286a22066b41286d41034b0d000b200341a0016a21030b024020032007460d002004200541286c6a2106034020012003460d042003200141201006450d042006200341286a2203470d000b0b2004200228023c10870141fc3e103b000b200041216a2d0000210520024198016a41186a200041196a220329000037030020024198016a41106a200041116a220629000037030020024198016a41086a200041096a22042900003703002002200029000137039801200241386a41186a2003290000370300200241386a41106a2006290000370300200241386a41086a2004290000370300200241e0006a200141086a290000370300200241e8006a200141106a290000370300200241f0006a200141186a2900003703002002200029000137033820022001290000370358410910012203450d17200220033602c001200242093702c401200241c0016a41004109102720022802c00120022802c80122066a220441002900f922370000200241086a41086a2203200641096a2206360200200441086a41002d0081233a0000200220022903c001370308200220063602c801200241c0016a200241386a10be0120022802c401210820022802c0012104200241086a200328020020022802c8012206102720022802082207200328020022096a20042006101e1a2003200920066a220636020002402008450d00200410020b200228020c210320024188016a41086a2204420037030020024200370388012007200620024188016a1003200241f8006a41086a20042903003703002002200229038801370378200241f8006a411041d02d410041001000417f460d02200241003a00c001200241f8006a4110200241c0016a41014100100041016a41014d0d1020022d00c00121062003450d160c150b200041046a280200210d102e210a20024188016a41086a22034200370300200242003703880141e122410a20024188016a1003200241f8006a41086a20032903003703002002200229038801370378200241f8006a411041d02d410041001000417f460d0c20024200370338200241f8006a4110200241386a41084100100041016a41084d0d0a2002290338200a7c210a200241386a1047200228023822072002280240220841286c22066a2105200721030240200641286d4104490d00200721030340200120032206460d052006200141201006450d05200641286a2103200641286a22042001460d062004200141201006450d06200641d0006a2103200441286a22042001460d062004200141201006450d06200641f8006a2103200441286a22042001460d062004200141201006450d062005200441286a22036b41286d41034b0d000b200641a0016a21030b4102210420032005460d052007200841286c6a2106034020012003460d052003200141201006450d052006200341286a2203470d000c060b0b200228023c450d120c110b4102210620030d120c130b200228023c0d0f0c100b200621030b200341206a290300200a5621040b200441024720047121030240200228023c450d00200710020b2003450d0720024198016a200d10d80120022802a00121052002280298012107200241386a41186a22034200370300200241386a41106a22064200370300200241386a41086a220442003703002002420037033820072005200241386a1012200241c0016a41186a22052003290300370300200241c0016a41106a22082006290300370300200241c0016a41086a22092004290300370300200220022903383703c0010240200228029c01450d00200710020b200320052903003703002006200829030037030020042009290300370300200220022903c001370338410710012203450d1020022003360298012002420737029c0120024198016a41004107102720022802980120022802a00122066a220341002800eb22360000200241086a41086a200641076a2206360200200341046a41002f00ef223b0000200341066a41002d00f1223a00002002200229039801370308200220063602a001412010012203450d1020022003360298012002422037029c0120024198016a410041201027200228029801220620022802a00122046a22032002290338370000200341086a200241386a41086a290300370000200341106a200241386a41106a290300370000200341186a200241386a41186a2903003700002002200441206a22033602a001200228029c012107200241086a20022802102003102720022802082204200228021022056a20062003101e1a2002200520036a220336021002402007450d00200610020b200228020c210620024188016a41086a2207420037030020024200370388012004200320024188016a1003200241f8006a41086a20072903003703002002200229038801370378200241f8006a411020024198016a410041001000210302402006450d00200410020b2003417f470d08200241386a200241c0016a10dc01024020022802402203450d002002290338210b20022802442106102e210c02402006450d00200310020b200c200b540d0b0b200241286a10bb01200241386a41186a2206200241c0016a41186a290300370300200241386a41106a2204200241c0016a41106a290300370300200241386a41086a2207200241c0016a41086a290300370300200220022903c00137033820022802302205200228022c460d030c0b0b200228023c0d0b0c0c0b200228023c0d0a0c0b0b200228023c0d090c0a0b200241286a106f200241286a41086a28020021050c070b41c1214133102d000b419c3e103b000b41f4214122102d000b41b43e103b000b41cc3e103b000b41c1214133102d000b41e43e103b000b200241286a41086a200541016a22153602002002280228220f200541286c6a2203200a37030020032002290338370308200341106a2007290300370300200341186a2004290300370300200341206a2006290300370300024002400240024002400240024002400240024002400240024002400240024002400240201541144b0d00201541014d0d01200f200541286c6a21110340201520052203417f6a2205490d100240201520056b22074102490d00200f200341286c6a2204290300200f200541286c6a220e290300220a5a0d00200e2004290300370300200e290308210b200e41086a200441086a290300370300200241386a41186a2200200e41206a2203290300370300200241386a41106a2212200e41186a2206290300370300200241386a41086a2213200e41106a22082903003703002008200441106a2903003703002006200441186a2903003703002003200441206a2903003703002002200b37033841012108024020074103490d0041012106201121030340200641016a220820074f0d150240200341286a2204290300200a5a0d00200620074f0d15200341206a200341c8006a290300370300200341186a200341c0006a290300370300200341106a200341386a290300370300200341086a200341306a29030037030020032004290300370300200641026a2109200821062004210320092007490d010c020b0b20062108200321040b2004200a370300200e200841286c6a22032002290338370308200341206a2000290300370300200341186a2012290300370300200341106a20132903003703000b201141586a211120050d000c020b0b20154101762216ad42287e220a422088a70d0d200aa72203417f4c0d0c4108211702402003450d00200310012217450d160b41002106200241003602a0012002420437039801200f41586a2118200f41887f6a21194104210420024198016a41086a211a2015211003402010211141002110410121070240024002402011417f6a2203450d000240024002400240024002400240200f200341286c6a290300200f2011417e6a220741286c6a290300220a5a0d00410021082007450d022019201141286c6a21030340200a2003290300220b5a0d02200341586a2103200b210a2007417f6a22070d000c030b0b02402007450d002019201141286c6a2103410221070340200a2003290300220b540d04200341586a2103200b210a2011200741016a2207470d000b41002110201121072006200228029c01470d090c080b41022107410021102006200228029c01470d080c070b200721080b024020112008490d00201120154b0d140240201120086b22074101762209450d002018201141286c6a2103200f200841286c6a21050340200241386a41206a220e200541206a2200290300370300200241386a41186a2212200541186a2213290300370300200241386a41106a2214200541106a2210290300370300200241386a41086a221b200541086a221c29030037030020022005290300370338200341086a221d290300210a200341106a221e290300210b200341186a221f290300210c200329030021202000200341206a22212903003703002013200c3703002010200b370300201c200a370300200520203703002021200e290300370300201f2012290300370300201e2014290300370300201d201b29030037030020032002290338370300200341586a2103200541286a21052009417f6a22090d000b0b2008450d030c020b200820111055000b201120076b2208450d010b200741094d0d010b200821102006200228029c01470d030c020b201120154b0d0d200f200841286c6a2112034020112008417f6a2210490d0f0240201120106b22074102490d00200f200841286c6a2208290300200f201041286c6a2200290300220a5a0d00200020082903003703002000290308210b200041086a200841086a290300370300200241386a41186a2213200041206a2203290300370300200241386a41106a2214200041186a2205290300370300200241386a41086a221b200041106a22092903003703002009200841106a2903003703002005200841186a2903003703002003200841206a2903003703002002200b37033841012109024020074103490d0041012105201221030340200541016a220920074f0d090240200341286a2208290300200a5a0d00200520074f0d0b200341206a200341c8006a290300370300200341186a200341c0006a290300370300200341106a200341386a290300370300200341086a200341306a29030037030020032008290300370300200541026a210e2009210520082103200e2007490d010c020b0b20052109200321080b2008200a3703002000200941286c6a22032002290338370308200341206a2013290300370300200341186a2014290300370300200341106a201b2903003703000b2010450d01201241586a2112201021082007410a490d000b0b2006200228029c01470d010b20024198016a107a201a280200210620022802980121040b200420064103746a2203200736020420032010360200201a200641016a2206360200024020064102490d0020022802980121040340024002400240024020042006417f6a4103746a2203280200450d00200420064103746a220841746a2802002205200328020422074d0d00200641024d0d0520042006417d6a22124103746a2802042203200720056a4d0d01200641034d0d05200841646a280200200320056a4d0d010c050b20064103490d012003280204210720042006417d6a22124103746a28020421030b20032007490d010b2006417e6a21120b2006201241016a22134d0d06200620124d0d0720042012410374221b6a2203280204221c20032802006a220320042013410374221d6a22062802002214490d08200320154b0d09200f201441286c6a22112006280204220041286c22066a2107200341286c210402400240024002400240200320146b220820006b220320004f0d0020172007200341286c2206101e220e20066a210520004101480d0120034101480d01201820046a21042007210303402004200341586a2207200541586a2208200829030020072903005422091b2206290300370300200441206a200641206a290300370300200441186a200641186a290300370300200441106a200641106a290300370300200441086a200641086a2903003703002005200820091b210520112007200320091b22034f0d04200441586a2104200e2106200e2005490d000c050b0b201720112006101e220320066a210520004101480d01200820004c0d01200f20046a210920032106201121030340200320072006200729030020062903005422081b2204290300370300200341206a200441206a290300370300200341186a200441186a290300370300200341106a200441106a290300370300200341086a200441086a2903003703002006200641286a20081b2106200341286a2103200741286a200720081b220720094f0d04200520064b0d000c040b0b200721030c010b201121030b201721060b20032006200520066b220420044128706b101e1a201a280200220320124d0d0a2002280298012204201b6a2206201c20006a36020420062014360200200320134d0d0b2004201d6a2206200641086a200320136b41037441786a10391a201a2003417f6a2206360200200641014b0d000b0b20100d000b0240200228029c01450d0020022802980110020b2016450d00201710020b200241286a10bc0120024198016a41186a200241c0016a41186a29030037030020024198016a41106a200241c0016a41106a29030037030020024198016a41086a200241c0016a41086a290300370300200220022903c00137039801200241386a41286a200d41286a290300370300200241386a41206a200d41206a290300370300200241386a41186a200d41186a290300370300200241386a41106a200d41106a290300370300200241386a41086a200d41086a2903003703002002200d290300370338410710012203450d14200220033602082002420737020c200241086a4100410710272002280208200228021022066a220341002800eb2236000020024188016a41086a200641076a2206360200200341046a41002f00ef223b0000200341066a41002d00f1223a0000200220022903083703880120022006360210412010012203450d14200220033602082002422037020c200241086a41004120102720022802082206200228021022046a2203200229039801370000200341086a20024198016a41086a290300370000200341106a20024198016a41106a290300370000200341186a20024198016a41186a2903003700002002200441206a2203360210200228020c210720024188016a20022802900120031027200228028801220420022802900122056a20062003101e1a2002200520036a22053602900102402007450d00200610020b200228028c012106200241086a200241386a10d801200228021021072002280208210320024188016a41086a2208420037030020024200370388012004200520024188016a1003200241f8006a41086a20082903003703002002200229038801370378200241f8006a41102003200710040240200228020c450d00200310020b02402006450d00200410020b024002400240200228023822034103460d0020030d02200228023c2203450d0220034101470d01200241c4006a280200450d02200241c0006a28020010020c020b20022d003c4101470d01200241c0006a10bf010c010b0240200241386a41106a2802002206450d00200241c0006a2802002103200641186c210603400240200341046a280200450d00200328020010020b0240200341106a280200450d002003410c6a28020010020b200341186a2103200641686a22060d000b0b200241c4006a280200450d00200241c0006a28020010020b200241386a41186a2206200241c0016a41186a2204290300370300200241386a41106a2207200241c0016a41106a2205290300370300200241386a41086a2208200241c0016a41086a2209290300370300200220022903c001370338412010012203450d14200141086a220e290000210a200141106a2211290000210b2001290000210c200341186a200141186a2200290000370000200341106a200b370000200341086a200a3700002003200c3700002002200336029801200242818080801037029c01200241386a20024198016a10dd01200620042903003703002007200529030037030020082009290300370300200241e0006a200e290000370300200241e8006a2011290000370300200241f0006a2000290000370300200220022903c00137033820022001290000370358200241386a410110de010240200228022c450d00200228022810020b200d1002200241e0016a24000f0b41ccc100200541016a2007103c000b41dcc10020052007103c000b41acc10020132006103c000b41acc10020122006103c000b201420031055000b200320151029000b41bcc10020122003103c000b41b4c300103b000b20112008417f6a22104f0d010b201020111055000b201120151029000b1065000b1064000b200520151055000b41dcc10020062007103c000b41ccc100200641016a2007103c000b200410020b410b10012203450d02200220033602382002420b37023c200241386a4100410b10272002280238200228024022066a220341002900822337000020024198016a41086a2006410b6a2206360200200341086a41002f008a233b00002003410a6a41002d008c233a0000200220022903383703980120022006360240412010012203450d02200220033602382002422037023c200241386a41004120102720022802382206200228024022046a22032002290308370000200341086a200241086a41086a290300370000200341106a200241086a41106a290300370000200341186a200241086a41186a2903003700002002200441206a2203360240200228023c210720024198016a20022802a00120031027200228029801220420022802a00122056a20062003101e1a2002200520036a22033602a00102402007450d00200610020b200228029c01210620024188016a41086a2207420037030020024200370388012004200320024188016a1003200241f8006a41086a20072903003703002002200229038801370378200241f8006a411020024198016a410041001000210302402006450d00200410020b02400240024002402003417f460d00200241386a200241086a10dc010240024002400240024020022802402208450d0020022002290244220a37022c20022008360228200aa7210e200a422088a72209450d0120094101470d02410021030c030b410021092002410036023020024201370328410121084100210e0b410021060c020b4100210320092106034020032006410176220720036a2204200820044105746a2001412010062205417f4a1b200420051b2103200620076b220641014b0d000b0b200820034105746a2001412010062206450d032006411f7620036a21060b200241386a41186a200141186a290000370300200241386a41106a200141106a290000370300200241386a41086a200141086a2900003703002002200129000037033820092006490d012009200e470d03200241286a107c200228022821080c030b41943f103b000b419cc300103b000b200310c201000b200820064105746a220341206a2003200920066b41057410391a20032002290338370000200341186a200241386a41186a290300370000200341106a200241386a41106a290300370000200341086a200241386a41086a290300370000200241286a41086a200941016a360200102e210a20024188016a41086a220342003703002002420037038801418d23410b20024188016a1003200241f8006a41086a200329030037030020022002290388013703780240200241f8006a411041d02d410041001000417f460d00200242003703380240200241f8006a4110200241386a41084100100041016a41084d0d002002290338210b200241c8006a200241286a41086a2802003602002002200b200a7c37033820022002290328370340410910012203450d0420022003360298012002420937029c0120024198016a41004109102720022802980120022802a00122036a2206410029009823370000200241c0016a41086a200341096a2203360200200641086a41002d00a0233a000020022002290398013703c001200220033602a001412010012203450d0420022003360298012002422037029c0120024198016a410041201027200228029801220620022802a00122046a22032002290308370000200341086a200241086a41086a290300370000200341106a200241086a41106a290300370000200341186a200241086a41186a2903003700002002200441206a22033602a001200228029c012107200241c0016a20022802c8012003102720022802c001220420022802c80122056a20062003101e1a2002200520036a22033602c80102402007450d00200610020b20022802c401210620042003200241386a10d70102402006450d00200410020b0240200241c4006a280200450d00200241c0006a28020010020b200241386a10bb01200228023c210f20022802382110024002400240024020022802402203450d00200341286c41b07f6a2104200241386a41086a2106201021030340200241386a41206a200341206a290300370300200241386a41186a200341186a290300370300200241386a41106a200341106a2903003703002006200341086a29030037030020022003290300370338200241c0016a41186a200641186a290000370300200241c0016a41106a200641106a290000370300200241c0016a41086a200641086a290000370300200220062900003703c001200241c0016a200241086a412010060d02200341286a2103200441586a220441b07f470d000b0b2002410036024020024208370338200f450d0120101002200241386a10bc010c020b20024198016a41206a2206200241386a41206a29030037030020024198016a41186a2207200241386a41186a29030037030020024198016a41106a2205200241386a41106a29030037030020024198016a41086a2208200241386a41086a2903003703002002200229033837039801412810012211450d062011200229039801370300201141206a2006290300370300201141186a2007290300370300201141106a2005290300370300201141086a20082903003703002002201136028801200242818080801037028c01024020044158460d00200341286a2103200241386a41086a21064101210e0340200241386a41206a2205200341206a290300370300200241386a41186a2208200341186a290300370300200241386a41106a2209200341106a2903003703002006200341086a29030037030020022003290300370338200241c0016a41186a200641186a290000370300200241c0016a41106a200641106a290000370300200241c0016a41086a200641086a290000370300200220062900003703c0010240200241c0016a200241086a41201006450d0020024198016a41206a2207200529030037030020024198016a41186a2212200829030037030020024198016a41106a2213200929030037030020024198016a41086a2214200629030037030020022002290338370398012005200729030037030020082012290300370300200920132903003703002006201429030037030020022002290398013703380240200e200228028c01470d0020024188016a200e410110820120022802880121110b2011200e41286c6a22072002290338370300200741206a2005290300370300200741186a2008290300370300200741106a2009290300370300200741086a200629030037030020024188016a41086a200e41016a220e3602000b2004450d01200341286a2103200441586a21040c000b0b0240200f450d00201010020b200241386a41086a20024188016a41086a2802003602002002200229038801370338200228023c2103200241386a10bc012003450d01200228023810020c010b200241386a10bc010b200241386a41186a200241086a41186a290300370300200241386a41106a200241086a41106a290300370300200241386a41086a200241086a41086a29030037030020022002290308370338410b10012203450d0420022003360298012002420b37029c0120024198016a4100410b102720022802980120022802a00122066a2203410029008223370000200241c0016a41086a2006410b6a2206360200200341086a41002f008a233b00002003410a6a41002d008c233a000020022002290398013703c001200220063602a001412010012203450d0420022003360298012002422037029c0120024198016a410041201027200228029801220620022802a00122046a22032002290338370000200341086a200241386a41086a290300370000200341106a200241386a41106a290300370000200341186a200241386a41186a2903003700002002200441206a22033602a001200228029c012107200241c0016a20022802c8012003102720022802c001220420022802c80122056a20062003101e1a2002200520036a22033602c80102402007450d00200610020b20022802c401210620024188016a41086a2207420037030020024200370388012004200320024188016a1003200241f8006a41086a20072903003703002002200229038801370378200241f8006a4110100502402006450d00200410020b200241386a41186a200241086a41186a290300370300200241386a41106a200241086a41106a290300370300200241386a41086a200241086a41086a29030037030020022002290308370338410710012203450d0420022003360298012002420737029c0120024198016a41004107102720022802980120022802a00122066a220341002800eb22360000200241c0016a41086a200641076a2206360200200341046a41002f00ef223b0000200341066a41002d00f1223a000020022002290398013703c001200220063602a001412010012203450d0420022003360298012002422037029c0120024198016a410041201027200228029801220620022802a00122046a22032002290338370000200341086a200241386a41086a290300370000200341106a200241386a41106a290300370000200341186a200241386a41186a2903003700002002200441206a22033602a001200228029c012107200241c0016a20022802c8012003102720022802c001220420022802c80122056a20062003101e1a2002200520036a22033602c80102402007450d00200610020b20022802c401210620024188016a41086a2207420037030020024200370388012004200320024188016a1003200241f8006a41086a20072903003703002002200229038801370378200241f8006a4110100502402006450d00200410020b200241386a1047200228023c211320022802382112024020022802402203450d00200341286c2109200241d8006a210620122103034020062003290000370000200241386a41186a200241086a41186a290300370300200241386a41106a200241086a41106a290300370300200241386a41086a200241086a41086a290300370300200641086a200341086a290000370000200641106a200341106a290000370000200641186a200341186a29000037000020022002290308370338410910012204450d0620022004360298012002420937029c0120024198016a41004109102720024198016a41086a22072007280200220441096a220536020020042002280298016a220841002900f922370000200241c0016a41086a22042005360200200841086a41002d0081233a000020022002290398013703c00120024198016a200241386a10be01200228029c01210e2002280298012105200241c0016a200428020020072802002207102720022802c0012208200428020022116a20052007101e1a2004201120076a22073602000240200e450d00200510020b20022802c401210420024188016a41086a2205420037030020024200370388012008200720024188016a1003200241f8006a41086a20052903003703002002200229038801370378200241f8006a4110100502402004450d00200810020b200341286a2103200941586a22090d000b0b02402013450d00201210020b20002d00004101470d0a0c090b41c1214133102d000b41f4214122102d000b200710020b200641ff01714102470d04410b10012203450d00200220033602382002420b37023c200241386a4100410b10272002280238200228024022066a2203410029008223370000200241c0016a41086a2006410b6a2206360200200341086a41002f008a233b00002003410a6a41002d008c233a0000200220022903383703c00120022006360240412010012203450d00200220033602382002422037023c200241386a41004120102720022802382206200228024022046a2203200229039801370000200341086a20024198016a41086a290300370000200341106a20024198016a41106a290300370000200341186a20024198016a41186a2903003700002002200441206a2203360240200228023c2107200241c0016a20022802c8012003102720022802c001220420022802c80122086a20062003101e1a2002200820036a22033602c80102402007450d00200610020b20022802c401210720024188016a41086a2206420037030020024200370388012004200320024188016a1003200241f8006a41086a20062903003703002002200229038801370378410021030240200241f8006a411041d02d410041001000417f460d00200242103702c4012002200241f8006a3602c001200241386a200241c0016a103a20022802382206450d022002200229023c220a37020c20022006360208200a422088a72103200aa721092007450d040c030b2002410036021020024201370308410121064100210920070d020c030b101c000b41c1214133102d000b200410020b200241386a41186a2204200141186a290000370300200241386a41106a2207200141106a290000370300200241386a41086a2208200141086a29000037030020022001290000370338024020032009470d00200241086a107c200241086a41086a2802002103200228020821060b2008290300210a2007290300210b2004290300210c200620034105746a22062002290338370000200641186a200c370000200641106a200b370000200641086a200a370000200241086a41086a2206200341016a360200200420024198016a41186a290300370300200720024198016a41106a290300370300200820024198016a41086a2903003703002002200229039801370338200241c0016a41086a2006280200360200200220022903083703c001200241386a200241c0016a10dd010b200241386a41186a20024198016a41186a290300370300200241386a41106a20024198016a41106a290300370300200241386a41086a20024198016a41086a290300370300200241e0006a200141086a290000370300200241e8006a200141106a290000370300200241f0006a200141186a290000370300200220022903980137033820022001290000370358200241386a200541ff017141004710de0120002d00004101470d010b200041046a10bf010b200241e0016a24000bcd0402057f017e230041c0006b220224000240024002400240410910012203450d002002200336023020024209370234200241306a4100410910272002280230200228023822036a2204410029009823370000200241086a200341096a2203360200200441086a41002d00a0233a00002002200229033037030020022003360238412010012203450d002002200336023020024220370234200241306a41004120102720022802302204200228023822056a22032001290000370000200341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a2900003700002002200541206a220136023820022802342105200220022802082001102720022802002203200228020822066a20042001101e1a2002200620016a220136020802402005450d00200410020b20022802042104200241306a41086a220542003703002002420037033020032001200241306a1003200241086a20052903003703002002200229033037030002402002411041d02d410041001000417f460d002002200236021020024110360214200242003703302002410020024110200241306a41084100100022012001417f461b2201410820014108491b360218200141074d0d0220022903302107200241306a200241106a103a20022802302201450d022002200229023437032020002001360208200020073703002000200229032037020c200041146a200241286a2802003602002004450d040c030b2000410036020820040d020c030b101c000b41c1214133102d000b200310020b200241c0006a24000be20301067f230041306b220224000240410b10012203450d00200220033602202002420b370224200241206a4100410b10272002280220200228022822046a2203410029008223370000200241106a41086a2004410b6a2204360200200341086a41002f008a233b00002003410a6a41002d008c233a00002002200229032037031020022004360228412010012203450d002002200336022020024220370224200241206a41004120102720022802202204200228022822056a22032000290000370000200341086a200041086a290000370000200341106a200041106a290000370000200341186a200041186a2900003700002002200541206a220036022820022802242105200241106a20022802182000102720022802102203200228021822066a20042000101e1a2002200620006a220636021802402005450d00200410020b200228021421042002200110a2012002280208210520022802002100200241206a41086a220742003703002002420037032020032006200241206a1003200241106a41086a200729030037030020022002290320370310200241106a411020002005100402402002280204450d00200010020b02402004450d00200310020b0240200141046a280200450d00200128020010020b200241306a24000f0b101c000bc00201057f230041306b22022400200220013a000f0240410910012201450d002002200136022020024209370224200241206a4100410910272002280220200228022822036a220441002900f922370000200241106a41086a2201200341096a2203360200200441086a41002d0081233a00002002200229032037031020022003360228200241206a200010be012002280224210520022802202103200241106a200128020020022802282200102720022802102204200128020022066a20032000101e1a2001200620006a220036020002402005450d00200310020b20022802142103200241206a41086a220542003703002002420037032020042000200241206a10032001200529030037030020022002290320370310200241106a41102002410f6a4101100402402003450d00200410020b200241306a24000f0b101c000bab0201057f230041206b220224000240410810012203450d002002200336021020024208370214200241106a4100410810272002280210200228021822036a42e4cab5d3c3ac99b83a3700002002200341086a360218200241086a200228021836020020022002290310370300410410012203450d002002200336021020024204370214200241106a41004104102720022802102203200228021822046a20003600002002200441046a220036021820022802142105200220022802082000102720022802002204200228020822066a20032000101e1a2002200620006a220036020802402005450d00200310020b2002280204210320042000200110d70102402003450d00200410020b02402001410c6a280200450d00200128020810020b200241206a24000f0b101c000b9c0b04027f017e027f017e230041d0006b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220341044b0d000240024002400240024020030e050004020301000b200141086a28020022034101460d0720034102470d16420221040c080b420121040240200141086a28020022034101460d0020034102470d17420221040b20004105360200200041086a2004370300200041106a200141106a290300370300200241d0006a24000f0b20012d000422034103714101460d034102210520034102470d16200141086a28020021030c040b200141086a22052d0000417f6a220341034b0d16024020030e04000c080a000b2001410c6a2802002101410121030c0c0b200141086a280200417f6a220641034b0d1641042103024020060e0400080d0e000b200141106a2903002104410121030c0d0b200128020422034101460d0420034102470d16200141106a2802002205ad42187e2204422088a70d172004a72203417f4c0d18200141086a28020021012003450d0d2003100122060d0e0c100b413010012203450d0f2003200141086a28020010e001200141056a2d00002101410121050b20004103360200200041086a20033602002000200141ff0171410874200572360204200241d0006a24000f0b200141106a2903002107420121040b20004101360200200041106a2007370300200041086a2004370300200241d0006a24000f0b200141106a2802002203417f4c0d14200141086a2802002106410121014101210502402003450d00200310012205450d0c0b2002200336023c2002200536023820024100360240200241386a41002003102720022002280240220520036a360240200520022802386a20062003101e1a200241286a2002280240360200200220022903383703200c0a0b200141106a2903002104410321030c020b200141106a2903002104410221030c050b200141106a2903002104410421030b0c010b41022103200241206a41026a200541036a2d00003a0000200241c0006a200141206a290000370300200241386a41106a200141286a2d00003a0000200220052f00013b01202002200141186a290000370338200141106a29000021042001410c6a28000021010b200020022f01203b000920004104360200200041086a20033a00002000410c6a2001360200200041106a2004370300200041186a20022903383703002000410b6a200241226a2d00003a0000200041206a200241386a41086a290300370300200041286a200241386a41106a290300370300200241d0006a24000f0b2001410c6a2802002105410321030b200041023602002000410c6a2005360200200041086a2003360200200041106a2004370300200241d0006a24000f0b410421060b20022006360208200241003602102002200536020c200241086a4100200341186d10830120022802102103200228020821062002200136021820022001200541186c6a36021c200241386a200241186a103302402002280238450d002006200341186c6a21010340200241206a41106a2205200241386a41106a290300370300200241206a41086a2206200241386a41086a29030037030020022002290338370320200141106a2005290300370200200141086a200629030037020020012002290320370200200341016a2103200141186a2101200241386a200241186a103320022802380d000b0b200241086a41086a2003360200200241206a41086a200336020020022002290308370320410221010b2000200136020420004100360200200041086a2002290320370200200041106a200241206a41086a280200360200200241d0006a24000f0b101c000b41ec30103b000b41843e103b000b41ac3f103b000b419435103b000b41943b103b000b41ecc100103b000b1060000b1061000b1019000b9d08090e7f017e017f017e017f017e017f017e017f230041306b22022400024002400240024020014108490d00200141017641feffffff07712203417f6a220420014f0d032001410d74200173220541117620057322054105742005732206417f2001417f6a677622077122054100200120052001491b6b220520014f0d01200241086a41206a22082000200441286c6a220441206a2209290300370300200241086a41186a220a200441186a220b290300370300200241086a41106a220c200441106a220d290300370300200241086a41086a220e200441086a220f2903003703002000200541286c6a22052903002110200541086a22112903002112200541106a22132903002114200541186a221529030021162009200541206a2217290300370300200b2016370300200d2014370300200f2012370300200429030021122004201037030020022012370308201720082903003703002015200a2903003703002013200c2903003703002011200e29030037030020052002290308370300200320014f0d022006410d7420067322054111762005732205410574200573220620077122054100200120052001491b6b220520014f0d01200241086a41206a22082000200341286c6a220441206a2209290300370300200241086a41186a220a200441186a220b290300370300200241086a41106a220c200441106a220d290300370300200241086a41086a220e200441086a220f2903003703002000200541286c6a22052903002110200541086a22112903002112200541106a22132903002114200541186a221529030021162009200541206a2217290300370300200b2016370300200d2014370300200f2012370300200429030021122004201037030020022012370308201720082903003703002015200a2903003703002013200c2903003703002011200e290300370300200520022903083703002003410172220420014f0d032006410d742006732205411176200573220541057420057320077122054100200120052001491b6b220520014f0d01200241086a41206a22032000200441286c6a220141206a2204290300370300200241086a41186a2206200141186a2207290300370300200241086a41106a2208200141106a2209290300370300200241086a41086a220a200141086a220b2903003703002000200541286c6a22002903002110200041086a22052903002112200041106a220c2903002114200041186a220d29030021162004200041206a220e2903003703002007201637030020092014370300200b2012370300200129030021122001201037030020022012370308200e2003290300370300200d2006290300370300200c20082903003703002005200a290300370300200020022903083703000b200241306a24000f0b41b4c20020052001103c000b200321040b41ecc20020042001103c000bd808070d7f017e017f017e017f027e027f230041306b2202240002400240024002400240024020014101762203450d0003402003417f6a2203210403402004410174220d41017221160240200d41026a220d20014f0d00201620014f0d06200d20162000200d41286c6a2903002000201641286c6a290300541b21160b0240201620014f0d00200420014f0d042000201641286c6a220d2903002000200441286c6a22042903005a0d00200241086a41206a2205200441206a2206290300370300200241086a41186a2207200441186a2208290300370300200241086a41106a2209200441106a220a290300370300200241086a41086a220b200441086a220c290300370300200d41086a220e290300210f200d41106a22102903002111200d41186a22122903002113200d29030021142006200d41206a221529030037030020082013370300200a2011370300200c200f3703002004290300210f200420143703002002200f370308201520052903003703002012200729030037030020102009290300370300200e200b290300370300200d2002290308370300201621040c010b0b20030d000b0b024020014102490d002001210503402005417f6a220520014f0d06200241086a41206a2206200041206a220d290300370300200241086a41186a2207200041186a2216290300370300200241086a41106a2208200041106a220a290300370300200241086a41086a2209200041086a220b2903003703002000200541286c6a2204290300210f200441086a220c2903002111200441106a220e2903002113200441186a22102903002114200d200441206a221229030037030020162014370300200a2013370300200b2011370300200029030021112000200f370300200220113703082012200629030037030020102007290300370300200e2008290300370300200c2009290300370300200420022903083703004100210403402004410174220d41017221160240200d41026a220d20054f0d00201620054f0d07200d20162000200d41286c6a2903002000201641286c6a290300541b21160b0240201620054f0d00200420054f0d052000201641286c6a220d2903002000200441286c6a22042903005a0d002006200441206a220a2903003703002007200441186a220b2903003703002008200441106a220c2903003703002009200441086a220e290300370300200d41086a2210290300210f200d41106a22122903002111200d41186a22152903002113200d2903002114200a200d41206a2203290300370300200b2013370300200c2011370300200e200f3703002004290300210f200420143703002002200f37030820032006290300370300201520072903003703002012200829030037030020102009290300370300200d2002290308370300201621040c010b0b200541014b0d000b0b200241306a24000f0b418cc30020042001103c000b418cc30020042005103c000b41fcc20020162001103c000b41fcc20020162005103c000b41b4c20020052001103c000bac0904097f017e0e7f017e230041306b22022400200041286a2103200041887f6a2104200041586a21054100210620014132492107410121080240024002400340024002400240200820014f0d002005200841286c6a210903402009290300200941286a2209290300540d0220092109200841016a22082001490d000b0b410021092008200146220a0d030c010b410121092008200146220a0d020b20070d012008417f6a220a20014f0d022009450d032000200a41286c6a2209290300210b20092000200841286c220c6a220a290300370300200241086a41206a220d200941206a220e290300370300200241086a41186a220f200941186a2210290300370300200241086a41106a2211200941106a2212290300370300200241086a41086a2213200941086a22142903003703002014200a41086a22152903003703002012200a41106a22162903003703002010200a41186a2217290300370300200e200a41206a22182903003703002002200b3703082018200d2903003703002017200f2903003703002016201129030037030020152013290300370300200a2002290308370300024020084102490d0020002008417e6a220d41286c6a22192903002009290300220b5a0d00200920192903003703002009290308211a2014201941086a290300370300200f200e29030037030020112010290300370300201320122903003703002012201941106a2903003703002010201941186a290300370300200e201941206a2903003703002002201a3703084100210e0240200d450d002004200c6a2109024003402009290300200b5a0d01200941286a2009290300370300200941c8006a200941206a290300370300200941c0006a200941186a290300370300200941386a200941106a290300370300200941306a200941086a290300370300200941586a2109200d417f6a220d0d000b200941286a21190c010b200941286a2119200d210e0b2019200b3703002000200e41286c6a22092002290308370308200941206a200f290300370300200941186a2011290300370300200941106a20132903003703000b200641016a21060240200120086b22124102490d00200a290300220b200a2903285a0d00200a200a41286a220d290300370300200a290308211a2015200d41086a290300370300200f201829030037030020112017290300370300201320162903003703002016200d41106a2903003703002017200d41186a2903003703002018200d41206a2903003703002002201a37030841012116024020124103490d002003200c6a21094101210e02400340200b200941286a220d2903005a0d01200941206a200941c8006a290300370300200941186a200941c0006a290300370300200941106a200941386a290300370300200941086a200941306a2903003703002009200d290300370300200e41026a2110200e41016a2216210e200d210920102012490d000c020b0b200e21162009210d0b200d200b370300200a201641286c6a22092002290308370308200941206a200f290300370300200941186a2011290300370300200941106a20132903003703000b20064105490d000b4100210a0b200241306a2400200a0f0b41ecc200200a2001103c000b41b4c20020082001103c000b0bdb3b02004180080bec282f55736572732f726f626572742f70726f6a656374732f6574682f706f6c6b61646f742f7375627374726174652f72756e74696d652f73657373696f6e2f7372632f6c69622e72737365733a696e647365733a6c656e7365733a6c6c637365733a6e6c6e7365733a76616c00000000002f636865636b6f75742f7372632f6c6962636f72652f6f70732f61726974682e72730000000000000000000000000000617474656d707420746f20646976696465206279207a65726f00000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f616c6c206974656d7320636f6d652066726f6d2060766f74657273603b20666f7220616e206974656d20746f20626520696e2060766f7465727360207468657265206d757374206265206120766f746520726567697374657265643b2071656448617368206e6f7420657175616c52756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e676c6962616c6c6f632f7261775f7665632e72736361706163697479206f766572666c6f7774696d3a64696454696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f55736572732f726f626572742f70726f6a656374732f6574682f706f6c6b61646f742f7375627374726174652f72756e74696d652f74696d657374616d702f7372632f6c69622e727374696d3a76616c54696d657374616d70206d7573742062652066697273742065787472696e73696320696e2074686520626c6f636b54696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b617373657274696f6e206661696c65643a206175782e69735f656d7074792829656e766578745f7365745f73746f726167656578745f6765745f73746f726167656578745f7472616e736665726578745f6372656174656d656d6f727963616c6c002f55736572732f726f626572742f70726f6a656374732f6574682f706f6c6b61646f742f7375627374726174652f72756e74696d652f7374616b696e672f7372632f636f6e74726163742e72730000000000000000000000000000000000000000000000000000000000000000007372632f6c69622e72732f55736572732f726f626572742f70726f6a656374732f6574682f706f6c6b61646f742f7375627374726174652f72756e74696d652f636f756e63696c2f7372632f6c69622e7273636f753a6e7874636f753a76636f636f753a76626f636f753a767273636f753a617072636f753a6c616374617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665636f753a766770636f753a63616e616c6c206974656d7320696e2063616e64696461746573206c697374206172652072656769737465726564636f753a726567636f753a63626f636f753a636e6363616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64636f753a737373636f753a707373636f753a77696e6c6561646572626f617264206d757374206578697374207768696c652070726573656e7420706861736520616374697665636f753a61637470726573656e7465642063616e646964617465206d7573742062652063757272656e7463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c656374656463616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726470726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647300000000000000002f636865636b6f75742f7372632f6c6962636f72652f736c6963652f6d6f642e7273696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e64736475706c69636174652063616e646964617465207375626d697373696f6e72657472616374696f6e20696e646578206d69736d6174636872657472616374696f6e20696e64657820696e76616c696463616e6e6f742072657472616374206e6f6e2d766f74657263616e6e6f742072657472616374207768656e2070726573656e74696e676261642074617267657420696e646578626164207265706f7274657220696e64657863616e6e6f74207265617020647572696e67206772616365207065726964766f746520696e646578206e6f742063757272656e74726561706572206d757374206265206120766f74657263616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f64617373657274696f6e206661696c65643a202153656c663a3a70726573656e746174696f6e5f6163746976652829636f753a737473636f753a706475636f753a74726d636f753a706572636f753a63636f66696e616c6973652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e72756e6e6572207570206d757374206265207265676973746572656400617474656d707420746f20646976696465206279207a65726f000000000000002f636865636b6f75742f7372632f6c6962636f72652f6f70732f61726974682e72730000000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f53746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f55736572732f726f626572742f70726f6a656374732f6574682f706f6c6b61646f742f7375627374726174652f72756e74696d652f6578656375746976652f7372632f6c69622e7273617373657274696f6e206661696c65643a206865616465722e6469676573742829203d3d20263c73797374656d3a3a4d6f64756c653c53797374656d3e3e3a3a6469676573742829416c6c207472616e73616374696f6e732073686f756c6420686176652074686520636f7272656374206e6f6e6365416c6c207472616e73616374696f6e732073686f756c642062652070726f7065726c79207369676e65645472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e7374726f616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c696420747970656c6962636f72652f726573756c742e727373657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a0909097165642f55736572732f726f626572742f70726f6a656374732f6574682f706f6c6b61646f742f7375627374726174652f72756e74696d652d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e72732f55736572732f726f626572742f70726f6a656374732f6574682f706f6c6b61646f742f7375627374726174652f72756e74696d652f7374616b696e672f7372632f6c69622e72737374613a6c65637374613a7370657374613a6572617374613a6e73657374613a77696c3a7374613a7661630000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f636865636b6f75742f7372632f6c6962636f72652f6f70732f61726974682e72737374613a6c6f63617373657274696f6e206661696c65643a20746f5f62616c616e6365202b2076616c7565203e20746f5f62616c616e6365617373657274696f6e206661696c65643a203c426f6e646167653c543e3e3a3a676574287472616e736163746f7229203c3d203c426f6e646167653c543e3e3a3a676574286465737429617373657274696f6e206661696c65643a2066726f6d5f62616c616e6365203e3d2076616c756543616e6e6f7420756e7374616b65206966206e6f7420616c7265616479207374616b65642e43616e6e6f74207374616b6520696620616c7265616479207374616b65642e7374613a666565617474656d707420746f207472616e7361637420776974686f757420656e6f7567682066756e647320746f20706179206665657374613a746f74617373657274696f6e206661696c65643a20266465737420213d207472616e736163746f72617373657274696f6e206661696c65643a2062203e3d2076616c756573746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c6964207479706552657175697265642076616c756573206d75737420626520696e2073746f726167652f55736572732f726f626572742f70726f6a656374732f6574682f706f6c6b61646f742f7375627374726174652f72756e74696d652f636f756e63696c2f7372632f766f74696e672e7273636f763a706572696f64636f763a70726f636f763a707273636f763a766f74653a636f763a766f746572733a636f763a636f6f6c6f6666636f763a7665746f3a70726f706f73616c206d75737420657869737420746f206265207665746f65646f6e6c7920636f756e63696c6c6f7273206d6179207665746f20636f756e63696c2070726f706f73616c73617373657274696f6e206661696c65643a202153656c663a3a69735f7665746f6564282670726f706f73616c5f68617368294e6f206475706c69636174652070726f706f73616c7320616c6c6f776564617373657274696f6e206661696c65643a2053656c663a3a77696c6c5f7374696c6c5f62655f636f756e63696c6c6f725f6174286175782e7265665f696e746f28292c2065787069727929616c6c207175657565642070726f706f73616c20686173686573206d7573742068617665206173736f6369617465642070726f706f73616c732f55736572732f726f626572742f70726f6a656374732f6574682f706f6c6b61646f742f7375627374726174652f72756e74696d652f64656d6f63726163792f7372632f6c69622e727364656d3a6c617564656d3a707562416c6c2063757272656e74207075626c69632070726f706f73616c73206861766520616e20616d6f756e74206c6f636b65646465706f7369746f727320616c7761797320657869737420666f722063757272656e742070726f706f73616c7364656d3a70657264656d3a6e787464656d3a72636f43616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d63616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75656c6962636f72652f6f7074696f6e2e7273002f636865636b6f75742f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f636865636b6f75742f7372632f6c6962636f72652f6f70732f61726974682e727364656d3a6d696e64656d3a70706363616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7472616e736163746f72206d75737420686176652062616c616e636520746f207369676e616c20617070726f76616c2e766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e617373657274696f6e206661696c65643a203c7374616b696e673a3a4d6f64756c653c543e3e3a3a6465647563745f756e626f6e646564286175782e7265665f696e746f28292c206465706f7369742e3029617373657274696f6e206661696c65643a203c7374616b696e673a3a4d6f64756c653c543e3e3a3a6465647563745f756e626f6e646564286175782e7265665f696e746f28292c2076616c756529617373657274696f6e206661696c65643a2076616c7565203e3d2053656c663a3a6d696e696d756d5f6465706f736974282900000000000000002f636865636b6f75742f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000000000000000000000002f636865636b6f75742f7372632f6c6962616c6c6f632f736c6963652e7273696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f55736572732f726f626572742f70726f6a656374732f6574682f706f6c6b61646f742f7375627374726174652f72756e74696d652f636f6e73656e7375732f7372632f6c69622e72733a617574683a7379733a6f6c640000007379733a6e756d7379733a7068617379733a7478727379733a726e647379733a787469426c6f636b206e756d626572206d6179206e65766572206265207a65726f2f55736572732f726f626572742f70726f6a656374732f6574682f706f6c6b61646f742f7375627374726174652f72756e74696d652f73797374656d2f7372632f6c69622e72737379733a6e6f6e7379733a7874647379733a6469676c656e5f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e3a636f6465000000000000002f636865636b6f75742f7372632f6c6962636f72652f736c6963652f736f72742e7273617373657274696f6e206661696c65643a206d6964203c3d206c656e6c6962636f72652f736c6963652f6d6f642e7273000000000000000000000000002f636865636b6f75742f7372632f6c6962636f72652f736c6963652f6d6f642e7273617373657274696f6e206661696c65643a20696e646578203c3d206c656e6c6962616c6c6f632f7665632e7273617373657274696f6e206661696c65643a20696e646578203c206c656e0041ec300be0124f1600002800000000040000480000003300000001000000711700002300000000040000480000003300000001000000a0040000190000007004000022000000c50100002d000000c00400003900000070040000220000001a0200002d0000004f160000280000001f0e0000530000006f000000090000004f160000280000001f0e00005300000078000000090000009c050000110000008905000013000000e502000005000000df17000014000000d008000005000000df17000014000000d608000005000000fe130000110000009203000005000000b40500002b000000df0500004a0000004b000000030000007117000023000000df0500004a0000002b000000010000008e06000020000000df0500004a00000041000000030000005e06000030000000df0500004a0000004200000003000000300600002e000000df0500004a0000004300000003000000f00600004d0000008700000012000000f00600004d0000008800000012000000f00600004d000000890000000f000000f00600004d0000007000000019000000f00600004d0000007100000019000000f00600004d000000720000000f000000f00600004d0000005e00000016000000f00600004d0000005f00000012000000f00600004d0000003d00000016000000f00600004d0000003e00000018000000f00600004d0000003f000000130000004f16000028000000df0500004a0000002b000000010000005e0700000a000000a8000000020000004f1600002800000068070000480000006500000001000000711700002300000068070000480000006500000001000000ed0a00002e0000006807000048000000e3000000030000006807000048000000e400000003000000c70a0000260000006807000048000000f800000003000000b10a0000160000006807000048000000f9000000030000009b0a0000160000006807000048000000fb000000030000007d0a00001e0000006807000048000000fc000000030000008009000022000000200900000a0000006b0a000012000000680700004800000000010000030000005b0a000010000000680700004800000001010000030000003d0a00001e00000068070000480000001b01000003000000250a00001800000068070000480000001c010000030000000d0a00001800000068070000480000001f01000003000000f40900001900000068070000480000002001000003000000d60900001e00000068070000480000002901000003000000b80900001e00000068070000480000002a01000003000000a20900001600000068070000480000002f010000030000008009000022000000260900000e000000680700004800000044010000030000004a0900002e00000068070000480000004a01000003000000270900002300000068070000480000004d01000003000000f1080000360000006807000048000000500100000400000080090000220000003c02000023000000e00b000039000000b00b0000220000001a0200002d000000900b000019000000b00b000022000000c50100002d0000004f0d00001c000000410c00004a00000050000000030000002b0d000024000000410c00004a00000058000000030000008b0c000048000000410c00004a0000009c00000003000000190c000028000000410c00004a000000a400000003000000010d00002a000000410c00004a000000850000000e000000d30c00002e000000410c00004a0000008b000000040000009e0d000011000000b1030000050000004f160000280000001f0e00005300000008010000090000004f16000028000000720e0000480000005b00000001000000f00e000039000000300f0000220000001a0200002d000000201000001f000000720e000048000000c800000003000000fb0f000025000000720e000048000000d6000000040000007117000023000000720e0000480000005b00000001000000d40f000027000000720e00004800000030020000030000008a0f00004a000000720e0000480000003302000003000000590f000031000000720e00004800000034020000030000000600000000000000010000000700000008000000090000000a0000000b0000000c0000000d0000004610000033000000720e0000480000005702000003000000d40f000027000000720e00004800000016020000030000008010000025000000720e00004800000022020000030000000e00000018000000040000000f000000100000001100000012000000130000001400000015000000a51000001c000000720e00004800000015010000030000004f16000028000000161100004b0000001b000000010000007117000023000000161100004b0000001b000000010000003c1200004b000000161100004b0000004e000000030000001e1200001e000000161100004b0000005200000003000000ec11000032000000161100004b0000005300000003000000c11100002b000000161100004b0000006900000003000000a111000020000000161100004b0000006a000000030000004f16000028000000c01200004a0000003900000001000000401400003900000080140000220000001a0200002d00000010140000220000003c02000023000000d31300002b000000fe130000110000004f010000150000008c13000047000000c01200004a000000d9000000040000007117000023000000c01200004a0000003900000001000000c615000032000000c01200004a0000009300000003000000781500004e000000c01200004a00000094000000030000002615000052000000c01200004a000000a2000000030000000415000022000000c01200004a000000ac00000004000000d414000030000000c01200004a000000af000000040000000016000022000000200900000a0000000016000022000000260900000e000000301600001f000000b20200001e000000301600001f000000b5020000360000004f16000028000000771600004a0000003b00000001000000f41600001e00000012170000470000007d000000030000007117000023000000771600004a0000003b0000000100000000180000220000003d02000023000000c31700001c000000df17000014000000cc0100000d000000a017000023000000910200001d00000000180000220000003c02000023000000a017000023000000a70000003a000000a017000023000000ae00000030000000221800001e000000401800000f00000047030000090000004f1800001d000000401800000f0000006f03000009000000000c076c696e6b696e670302cc3b00ff8401046e616d6501f68401e40100146578745f6765745f73746f726167655f696e746f010a6578745f6d616c6c6f6302086578745f66726565030c6578745f74776f785f313238040f6578745f7365745f73746f7261676505116578745f636c6561725f73746f72616765060a6578745f6d656d636d7007186578745f656e756d6572617465645f747269655f726f6f74080e6578745f7072696e745f75746638090d6578745f7072696e745f6e756d0a0a6578745f6d656d6370790b0b6578745f6d656d6d6f76650c0a6578745f6d656d7365740d166578745f73616e64626f785f6d656d6f72795f6e65770e176578745f73616e64626f785f696e7374616e74696174650f126578745f73616e64626f785f696e766f6b6510166578745f73616e64626f785f6d656d6f72795f67657411166578745f73616e64626f785f6d656d6f72795f736574120e6578745f626c616b65325f323536130d6578745f7072696e745f68657814106578745f73746f726167655f726f6f7415126578745f656432353531395f76657269667916773c7375627374726174655f72756e74696d655f7072696d6974697665733a3a67656e657269633a3a4469676573743c4974656d3e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a6465636f64653a3a686366613333306530633737643531613517066d656d73657418393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a6838313936363666396265663463633931194b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68646339636565313232303362623835621a4b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68353632363038323130343238623465631b4b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68653335663962326562366332393066621c24616c6c6f633a3a616c6c6f633a3a6f6f6d3a3a68613732396634666436376436376633391d8b013c7375627374726174655f72756e74696d655f7072696d6974697665733a3a67656e657269633a3a4865616465723c4e756d6265722c20486173682c204469676573744974656d3e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a6465636f64653a3a68306561356233376164373865313636341e066d656d6370791f573c616c6c6f633a3a7665633a3a5665633c75383e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a6465636f64653a3a683135633166653139313338396266313020a0013c7375627374726174655f72756e74696d655f7072696d6974697665733a3a67656e657269633a3a556e636865636b656445787472696e7369633c4163636f756e7449642c20496e6465782c2043616c6c2c205369676e61747572653e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a6465636f64653a3a686666343637646332363738333264373321583c616c6c6f633a3a626f7865643a3a426f783c543e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a6465636f64653a3a683733356130396161356431326165663322345f5a4e34636f726533707472313364726f705f696e5f706c61636531376834616536316365303665356638316331452e3138363723393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a6835646661343736643064326634353464244b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6831623238376135353263616531393734252b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a683461653631636530366535663831633126a0013c7375627374726174655f72756e74696d655f7072696d6974697665733a3a67656e657269633a3a556e636865636b656445787472696e7369633c4163636f756e7449642c20496e6465782c2043616c6c2c205369676e61747572653e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a656e636f64653a3a6862346461326637656565363934383334273a3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a726573657276653a3a6861623665336266623631626431356231285a3c706f6c6b61646f745f72756e74696d653a3a43616c6c206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a656e636f64653a3a68393931323239363862316130396334322934636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68363938393263393438396363616162622a363c5420617320636f72653a3a636f6e766572743a3a496e746f3c553e3e3a3a696e746f3a3a68353666353936643634373237343833632b8d015f5a4e34395f244c5424616c6c6f632e2e7261775f7665632e2e526177566563244c54245424432424753230244124475424244754243131616c6c6f636174655f696e32385f24753762242475376224636c6f737572652475376424247537642431376838343739373131363565646633646537452e6c6c766d2e3632303339333138363734383337373033382c493c7375627374726174655f72756e74696d655f73657373696f6e3a3a4d6f64756c653c543e3e3a3a726f746174655f73657373696f6e3a3a68663938353764613535613230616562632d2e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a68653163323536643932353565393632662e463c7375627374726174655f72756e74696d655f73797374656d3a3a4d6f64756c653c543e3e3a3a626c6f636b5f6e756d6265723a3a68313635316433343866326134346235372f527375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653a3a726571756972653a3a6861313164373161613165393864646363304b3c54206173207375627374726174655f636f6465633a3a6b657965647665633a3a4b657965645665633e3a3a746f5f6b657965645f7665633a3a6866346339626432626430633262303964314f7375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765745f6f725f64656661756c743a3a6837623835343430353965333637333638324b3c54206173207375627374726174655f636f6465633a3a6b657965647665633a3a4b657965645665633e3a3a746f5f6b657965645f7665633a3a686466633130663239626637643964313133523c636f72653a3a697465723a3a436c6f6e65643c493e20617320636f72653a3a697465723a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683032316562386262636530636661323334583c28412c204229206173207375627374726174655f72756e74696d655f7072696d6974697665733a3a7472616974733a3a45786563757461626c653e3a3a657865637574653a3a6863373034616135306561623165643139359f017375627374726174655f72756e74696d655f636f756e63696c3a3a766f74696e673a3a3c696d706c207375627374726174655f72756e74696d655f7072696d6974697665733a3a7472616974733a3a45786563757461626c6520666f72207375627374726174655f72756e74696d655f636f756e63696c3a3a4d6f64756c653c543e3e3a3a657865637574653a3a683730353563353930613161356165386336597375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653a3a6765745f6f725f64656661756c743a3a686432656434346461383333643033393337473c7375627374726174655f72756e74696d655f64656d6f63726163793a3a4d6f64756c653c543e3e3a3a6465706f7369745f6f663a3a6864356630353863656136333834623032382b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a683436373662323538363033663731396439076d656d6d6f76653a563c616c6c6f633a3a7665633a3a5665633c543e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a6465636f64653a3a68653630626561346331643730393736643b29636f72653a3a70616e69636b696e673a3a70616e69633a3a68313137323734323133346465393231303c36636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68363630346666363535326232666562323d413c7375627374726174655f72756e74696d655f7374616b696e673a3a4d6f64756c653c543e3e3a3a726566756e643a3a68633362613564623165383537303661313e86013c7375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a52756e74696d6553746f72616765206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a68656161636164343939313263336335363f4e3c7375627374726174655f72756e74696d655f64656d6f63726163793a3a4d6f64756c653c543e3e3a3a696e6a6563745f7265666572656e64756d3a3a6863653264346134373837396137323635404c3c7375627374726174655f72756e74696d655f64656d6f63726163793a3a4d6f64756c653c543e3e3a3a7265666572656e64756d5f696e666f3a3a68356430386136656330613537303133384134616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a686334316261316636346437363033373942473c7375627374726174655f72756e74696d655f64656d6f63726163793a3a4d6f64756c653c543e3e3a3a766f746572735f666f723a3a686539303831303936616133363162333843473c7375627374726174655f72756e74696d655f7374616b696e673a3a4d6f64756c653c543e3e3a3a667265655f62616c616e63653a3a6862653837643063316262386365323731444b3c7375627374726174655f72756e74696d655f7374616b696e673a3a4d6f64756c653c543e3e3a3a72657365727665645f62616c616e63653a3a6865623966656232366134653538343433453e7375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653a3a656e636f64653a3a6835666661663632366231656464306238464d3c7375627374726174655f72756e74696d655f64656d6f63726163793a3a4d6f64756c653c543e3e3a3a636c6561725f7265666572656e64756d3a3a683065326261346565363332393465346547597375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653a3a6765745f6f725f64656661756c743a3a686364633932303862653939363865303148423c7375627374726174655f72756e74696d655f7374616b696e673a3a4d6f64756c653c543e3e3a3a6e65775f6572613a3a6834333536343534386630353530373663493a3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a726573657276653a3a68666363653264376532363234386132664a86013c7375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a52756e74696d6553746f72616765206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a68383237346662353239326530653935384b345f5a4e34636f726533707472313364726f705f696e5f706c61636531376834616536316365303665356638316331452e313933304c6d3c7375627374726174655f72756e74696d655f696f3a3a426c616b6554776f323536206173207375627374726174655f72756e74696d655f696f3a3a48617368696e673e3a3a656e756d6572617465645f747269655f726f6f743a3a68373531363037396363363934643362344d11727573745f626567696e5f756e77696e644e08727573745f6f6f6d4f393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a683934323963666464366239343939316550463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a686638333437636630333536663137633751573c616c6c6f633a3a7665633a3a5665633c75383e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a656e636f64653a3a683562613039363631356162393163653352066d616c6c6f63530466726565542d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a68343066313034346338363430636537655536636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a6838313330343432303532386232613865564b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6832653739643730623164373537336236574b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6834333337316334333361323734393066584b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6835653639393561353131376336316261594b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68393332616436626561643261373838325a4b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68643335646131306634323134323937335b4b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68306464323861643233626338353865665c4b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68323236353666303366323931393738325d4b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68626461366634636434623039663433665e4b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303139363230336638363464396133345f4b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6862396532346165643662353163376566604b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6863613166626538323365653436383431614b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6862323236663235303162633264306264624b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6836333364303435386436356363393863634b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6866616563633135353361633333613835644b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6861356133316562653333306639326635654b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6832376361366365373461626664666264664b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a6836323932333830613439323131383638674b3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a686163306336633862333061653039663768393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a683063653362633633326336616364326169463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a68376636633966373761363663373937636a393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a68343038373662383637653261396330396b463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a68383863616164303861633361623961646c393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a68353262366336626163626135633061386d463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a68623437366264373632363935623330336e463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a68326132353062613265323263336337396f393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a683636323532376436666130383237343470463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a683365363965636439633766616165306371393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a683764313835303766636661646366353972463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a686335663366366638303064303431353273463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a683738366438643636323036316564613074393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a686261353735613734386133306233306375463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a686532653262373435333764623266386476393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a686461363738663731646162613761666577463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a683863323961323539383931333766343978393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a686463356361653038383331346337376679463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a68326161633766383935303734356563397a393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a68646433633635373262343532613031347b463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a68626462393236656664376432346539387c393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a68653333366232306266663138383930347d463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a68346633396332623430636437333963347e393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a68653338643736373866303134323236317f463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a68363862383536613030333235623134628001393c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a68656330653961326130616435633466648101463c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a646f75626c653a3a7b7b636c6f737572657d7d3a3a683838636134306365646335303261316282013a3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a726573657276653a3a683534343836366335623963663730373583013a3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a726573657276653a3a683734393131616635323537633037393784013a3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a726573657276653a3a683735663262666638613830643365623985013a3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a726573657276653a3a683863616636616537333938376436346386013a3c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e3e3a3a726573657276653a3a68653033623365323432663733346433308701503c616c6c6f633a3a7261775f7665633a3a5261775665633c542c20413e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68393537643736623535353030646266348801c3013c616c6c6f633a3a62747265653a3a6e6f64653a3a48616e646c653c616c6c6f633a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4d75743c27613e2c204b2c20562c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4c6561663e2c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a456467653e3e3a3a696e736572743a3a68353731386465393136646662313737328901c3013c616c6c6f633a3a62747265653a3a6e6f64653a3a48616e646c653c616c6c6f633a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4d75743c27613e2c204b2c20562c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4c6561663e2c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a456467653e3e3a3a696e736572743a3a68373463373532366661626363646564358a01c7013c616c6c6f633a3a62747265653a3a6e6f64653a3a48616e646c653c616c6c6f633a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4d75743c27613e2c204b2c20562c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a496e7465726e616c3e2c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a456467653e3e3a3a696e736572743a3a68343437336564333066636136316137308b01cb013c616c6c6f633a3a62747265653a3a6e6f64653a3a48616e646c653c616c6c6f633a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4d75743c27613e2c204b2c20562c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a496e7465726e616c3e2c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a456467653e3e3a3a696e736572745f6669743a3a68326333636630383765623331663734338c01c7013c616c6c6f633a3a62747265653a3a6e6f64653a3a48616e646c653c616c6c6f633a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4d75743c27613e2c204b2c20562c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a496e7465726e616c3e2c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a456467653e3e3a3a696e736572743a3a68386365653235383631313166343439668d01cb013c616c6c6f633a3a62747265653a3a6e6f64653a3a48616e646c653c616c6c6f633a3a62747265653a3a6e6f64653a3a4e6f64655265663c616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a4d75743c27613e2c204b2c20562c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a496e7465726e616c3e2c20616c6c6f633a3a62747265653a3a6e6f64653a3a6d61726b65723a3a456467653e3e3a3a696e736572745f6669743a3a68663630346163643262623861646636648e013f7375627374726174655f72756e74696d655f7374616b696e673a3a636f6e74726163743a3a657865637574653a3a68666332303937306166616238363265658f01507375627374726174655f72756e74696d655f7374616b696e673a3a636f6e74726163743a3a657865637574653a3a6578745f7365745f73746f726167653a3a68633235623630316631346635383463389001507375627374726174655f72756e74696d655f7374616b696e673a3a636f6e74726163743a3a657865637574653a3a6578745f6765745f73746f726167653a3a683736613962653764306632343937316491014d7375627374726174655f72756e74696d655f7374616b696e673a3a636f6e74726163743a3a657865637574653a3a6578745f7472616e736665723a3a683632326464636435333464616431363892014b7375627374726174655f72756e74696d655f7374616b696e673a3a636f6e74726163743a3a657865637574653a3a6578745f6372656174653a3a68396363303263356565333664303032379301417375627374726174655f72756e74696d655f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a683939386139316165306131663037633594017f3c7375627374726174655f72756e74696d655f7374616b696e673a3a4f7665726c61794163636f756e7444623c27612c20543e206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a7365745f73746f726167653a3a683035373136666235306661623636643395017f3c7375627374726174655f72756e74696d655f7374616b696e673a3a4f7665726c61794163636f756e7444623c27612c20543e206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a683031326363613031653639396364643996013b3c616c6c6f633a3a62747265653a3a6d61703a3a42547265654d61703c4b2c20563e3e3a3a6765743a3a6865383334633533623431306361303264970134616c6c6f633a3a62747265653a3a7365617263683a3a7365617263685f747265653a3a68613435343266643037623530613430349801653c616c6c6f633a3a62747265653a3a6d61703a3a42547265654d61703c4b2c20563e20617320636f72653a3a697465723a3a7472616974733a3a496e746f4974657261746f723e3a3a696e746f5f697465723a3a68323337613934396465633834333065369901553c616c6c6f633a3a62747265653a3a6d61703a3a496e746f497465723c4b2c20563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68663765393037343761386636613332309a01453c616c6c6f633a3a62747265653a3a6d61703a3a566163616e74456e7472793c27612c204b2c20563e3e3a3a696e736572743a3a68616639316138373166656365356538369b017c3c7375627374726174655f72756e74696d655f7374616b696e673a3a4f7665726c61794163636f756e7444623c27612c20543e206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a6765745f636f64653a3a68636634333438326462356135353864349c01793c7375627374726174655f72756e74696d655f7374616b696e673a3a4f7665726c61794163636f756e7444623c27612c20543e206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a6d657267653a3a68306134623934346339646231343665329d01653c616c6c6f633a3a62747265653a3a6d61703a3a42547265654d61703c4b2c20563e20617320636f72653a3a697465723a3a7472616974733a3a496e746f4974657261746f723e3a3a696e746f5f697465723a3a68336331666362643134643933623735619e01553c616c6c6f633a3a62747265653a3a6d61703a3a496e746f497465723c4b2c20563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68626262323936373561396334396234399f012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6866313734613335313966343639373764a0016c3c7375627374726174655f72756e74696d655f64656d6f63726163793a3a5072697643616c6c3c543e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a6465636f64653a3a6836313935643931346137663363333636a1010b617574686f726974696573a201563c616c6c6f633a3a7665633a3a5665633c543e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a656e636f64653a3a6834663037313434396230306561366362a30110696e697469616c6973655f626c6f636ba401443c7375627374726174655f72756e74696d655f73797374656d3a3a4d6f64756c653c543e3e3a3a696e697469616c6973653a3a6832326337643330356130373863393035a5010f6170706c795f65787472696e736963a601783c7375627374726174655f72756e74696d655f6578656375746976653a3a4578656375746976653c53797374656d2c20426c6f636b2c205061796d656e742c2046696e616c69736174696f6e3e3e3a3a6170706c795f65787472696e7369635f696e6e65723a3a6836303438333536646465653962326663a7010d657865637574655f626c6f636ba801443c7375627374726174655f72756e74696d655f73797374656d3a3a4d6f64756c653c543e3e3a3a626c6f636b5f686173683a3a6838333036626630323533366265386266a901523c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c20493e3e3a3a66726f6d5f697465723a3a6863383933623037366263653438356361aa01423c7375627374726174655f72756e74696d655f73797374656d3a3a4d6f64756c653c543e3e3a3a66696e616c6973653a3a6835643638333133636232646637366465ab010e66696e616c6973655f626c6f636bac010f76616c696461746f725f636f756e74ad010a76616c696461746f7273ae01793c7375627374726174655f72756e74696d655f636f756e63696c3a3a43616c6c3c543e206173207375627374726174655f72756e74696d655f737570706f72743a3a64697370617463683a3a417578446973706174636861626c653e3a3a64697370617463683a3a6836363435303363376332313138323333af01563c55206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c20563e3e3a3a6578697374733a3a6837323366316130366637356338376235b001473c7375627374726174655f72756e74696d655f636f756e63696c3a3a4d6f64756c653c543e3e3a3a72656d6f76655f766f7465723a3a6837326137643235373861356638346333b101563c55206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c20563e3e3a3a696e736572743a3a6830396163353435653961376538333833b2014a3c7375627374726174655f72756e74696d655f7374616b696e673a3a4d6f64756c653c543e3e3a3a6465647563745f756e626f6e6465643a3a6835366234393235363039633261333763b3014c3c7375627374726174655f72756e74696d655f636f756e63696c3a3a4d6f64756c653c543e3e3a3a766f7465725f6c6173745f6163746976653a3a6862336538666236373336303764663063b401473c7375627374726174655f72756e74696d655f636f756e63696c3a3a4d6f64756c653c543e3e3a3a617070726f76616c735f6f663a3a6865333163643561323839663761303839b5014d3c7375627374726174655f72756e74696d655f636f756e63696c3a3a4d6f64756c653c543e3e3a3a63616e6469646174655f7265675f696e666f3a3a6866303561313635613136333135646633b601563c616c6c6f633a3a7665633a3a5665633c543e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a6465636f64653a3a6831613262363530646163366431306537b70186013c7375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a52756e74696d6553746f72616765206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6866373862303163316265363933623132b801563c616c6c6f633a3a7665633a3a5665633c543e206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a656e636f64653a3a6862636662316161343963386239396538b901543c636f72653a3a697465723a3a436861696e3c412c20423e20617320636f72653a3a697465723a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6839313464643736343236613933323338ba01563c7375627374726174655f72756e74696d655f64656d6f63726163793a3a4d6f64756c653c543e3e3a3a696e7465726e616c5f73746172745f7265666572656e64756d3a3a6864663562353935316539353236643238bb01527375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653a3a726571756972653a3a6862646338666238653461356339396261bc0186013c7375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a52756e74696d6553746f72616765206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6836363231356566633664633732336432bd015e3c706f6c6b61646f745f72756e74696d653a3a5072697643616c6c206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a6465636f64653a3a6836636664343364363366653539376139be013e7375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653a3a656e636f64653a3a6834356437316332383730346338366538bf01345f5a4e34636f726533707472313364726f705f696e5f706c61636531376834616536316365303665356638316331452e31383434c001473c7375627374726174655f72756e74696d655f73797374656d3a3a4d6f64756c653c543e3e3a3a6163636f756e745f696e6465783a3a6830663032313835306531326631353532c1016d3c706f6c6b61646f745f72756e74696d653a3a43616c6c206173207375627374726174655f72756e74696d655f737570706f72743a3a64697370617463683a3a417578446973706174636861626c653e3a3a64697370617463683a3a6862353365306137383562356439313664c2012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6835636361383862626431396436663637c3012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6861636366363539333334346266343932c4012d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a6865653866663861633636343163366337c501563c55206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c20563e3e3a3a696e736572743a3a6836643335643961613335663530373466c601773c7375627374726174655f72756e74696d655f7374616b696e673a3a4469726563744163636f756e744462206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6839366364653364613533393430373432c701713c7375627374726174655f72756e74696d655f7374616b696e673a3a4469726563744163636f756e744462206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a6d657267653a3a6863386138646538333035626335356661c8015e3c616c6c6f633a3a62747265653a3a6d61703a3a496e746f497465723c4b2c20563e20617320636f72653a3a697465723a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6839663430373961306139316533623539c901563c55206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c20563e3e3a3a696e736572743a3a6839633838336432616334356335643565ca015e3c616c6c6f633a3a62747265653a3a6d61703a3a496e746f497465723c4b2c20563e20617320636f72653a3a697465723a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6831353032303864643239373239616232cb013e7375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653a3a656e636f64653a3a6866653733303335653834393636616231cc012b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6837313232393564313131373938333732cd01773c7375627374726174655f72756e74696d655f7374616b696e673a3a4469726563744163636f756e744462206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6865626533633663393533393837616132ce01743c7375627374726174655f72756e74696d655f7374616b696e673a3a4469726563744163636f756e744462206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a6765745f636f64653a3a6837376330653737383334326563333934cf01773c7375627374726174655f72756e74696d655f7374616b696e673a3a4469726563744163636f756e744462206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a7365745f73746f726167653a3a6862663865653331383633303066393130d001743c7375627374726174655f72756e74696d655f7374616b696e673a3a4469726563744163636f756e744462206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a7365745f636f64653a3a6834393266643631333433343565656533d101773c7375627374726174655f72756e74696d655f7374616b696e673a3a4469726563744163636f756e744462206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a7365745f62616c616e63653a3a6861303936363266636534323061373632d2013e3c616c6c6f633a3a62747265653a3a6d61703a3a42547265654d61703c4b2c20563e3e3a3a696e736572743a3a6863313238323330343366616132306235d3012b636f72653a3a7074723a3a64726f705f696e5f706c6163653a3a6862623666313834333462363831646364d4017f3c7375627374726174655f72756e74696d655f7374616b696e673a3a4f7665726c61794163636f756e7444623c27612c20543e206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6864333339636666326536626431326136d5017c3c7375627374726174655f72756e74696d655f7374616b696e673a3a4f7665726c61794163636f756e7444623c27612c20543e206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a7365745f636f64653a3a6832353031306366393163383531653633d6017f3c7375627374726174655f72756e74696d655f7374616b696e673a3a4f7665726c61794163636f756e7444623c27612c20543e206173207375627374726174655f72756e74696d655f7374616b696e673a3a4163636f756e7444623c543e3e3a3a7365745f62616c616e63653a3a6835663038363634343266663639663034d70186013c7375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a52756e74696d6553746f72616765206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6833663831363961656164316536306634d8015e3c706f6c6b61646f745f72756e74696d653a3a5072697643616c6c206173207375627374726174655f636f6465633a3a736c696361626c653a3a536c696361626c653e3a3a656e636f64653a3a6864323261663136323532663732653865d901587375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653a3a74616b655f6f725f70616e69633a3a6865373635393838373032386265316365da01597375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653a3a6765745f6f725f64656661756c743a3a6834623732396637663566373061363932db0181013c7375627374726174655f72756e74696d655f636f756e63696c3a3a766f74696e673a3a43616c6c3c543e206173207375627374726174655f72756e74696d655f737570706f72743a3a64697370617463683a3a417578446973706174636861626c653e3a3a64697370617463683a3a6830653834363332383930313361343764dc014a3c7375627374726174655f72756e74696d655f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3e3a3a7665746f5f6f663a3a6862306633653061333063356237626537dd01563c55206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c20563e3e3a3a696e736572743a3a6834336534383363363337326338613963de01563c55206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c20563e3e3a3a696e736572743a3a6866323533306336323935613261646262df01563c55206173207375627374726174655f72756e74696d655f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c20563e3e3a3a696e736572743a3a6863373164346434623063343438383037e0014c3c706f6c6b61646f745f72756e74696d653a3a5072697643616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6833623430356561333864626335613735e10134636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a6836346333343639613537386236366265e2012e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a6830386534373738303065643562646365e3013c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a6838643731323265613337623036313336", - "0x0346fb0f1ce64e1a02c4959d38ebad38": "0x00000000" -}}, -"bootNodes": [ - "/ip4/104.211.54.233/tcp/30333/p2p/QmRMGcQh69t8a8YwzHkofVo9SFr7ffggUwhAYjVSTChmrd", - "/ip4/104.211.48.51/tcp/30333/p2p/QmWCnXrhM1in1qPqVT3rDXQEJHedAzbPDMimdjqy2P9fGn", - "/ip4/104.211.48.247/tcp/30333/p2p/QmY33GW69TnTsdQWjAkxJR1GrWTdeV1PmzzcSmUay4HvAB", - "/ip4/40.114.120.164/tcp/30333/p2p/QmWzYU5X1NpFrprD1YZF5Lcj9aE5WF4QEg5FpvQx5XGWG7", - "/ip4/40.117.153.33/tcp/30333/p2p/QmSz8qCADMmi92QB8dTqMPu56JYQQKZBAHz7y8KXjvqcvW" -], -"telemetryUrl": "wss://telemetry.polkadot.io/submit/" -} diff --git a/substrate/polkadot/service/src/chain_spec.rs b/substrate/polkadot/service/src/chain_spec.rs deleted file mode 100644 index dcf487de0bd..00000000000 --- a/substrate/polkadot/service/src/chain_spec.rs +++ /dev/null @@ -1,191 +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 <http://www.gnu.org/licenses/>. - -//! Polkadot chain configurations. - -use ed25519; -use primitives::AuthorityId; -use polkadot_runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, - SessionConfig, StakingConfig, TimestampConfig}; -use service::ChainSpec; - -const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; - -pub fn poc_1_testnet_config() -> Result<ChainSpec<GenesisConfig>, String> { - ChainSpec::from_embedded(include_bytes!("../res/krummelanke.json")) -} - -fn staging_testnet_config_genesis() -> GenesisConfig { - let initial_authorities = vec![ - hex!["82c39b31a2b79a90f8e66e7a77fdb85a4ed5517f2ae39f6a80565e8ecae85cf5"].into(), - hex!["4de37a07567ebcbf8c64568428a835269a566723687058e017b6d69db00a77e7"].into(), - hex!["063d7787ebca768b7445dfebe7d62cbb1625ff4dba288ea34488da266dd6dca5"].into(), - hex!["8101764f45778d4980dadaceee6e8af2517d3ab91ac9bec9cd1714fa5994081c"].into(), - ]; - let endowed_accounts = vec![ - hex!["f295940fa750df68a686fcf4abd4111c8a9c5a5a5a83c4c8639c451a94a7adfd"].into(), - ]; - GenesisConfig { - consensus: Some(ConsensusConfig { - code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm").to_vec(), // TODO change - authorities: initial_authorities.clone(), - }), - system: None, - session: Some(SessionConfig { - validators: initial_authorities.iter().cloned().map(Into::into).collect(), - session_length: 60, // that's 5 minutes per session. - broken_percent_late: 50, - }), - staking: Some(StakingConfig { - current_era: 0, - intentions: initial_authorities.iter().cloned().map(Into::into).collect(), - transaction_base_fee: 100, - transaction_byte_fee: 1, - existential_deposit: 500, - transfer_fee: 0, - creation_fee: 0, - reclaim_rebate: 0, - early_era_slash: 10000, - session_reward: 100, - balances: endowed_accounts.iter().map(|&k|(k, 1u128 << 60)).collect(), - validator_count: 12, - sessions_per_era: 12, // 1 hour per era - bonding_duration: 24, // 1 day per bond. - }), - democracy: Some(DemocracyConfig { - launch_period: 12 * 60 * 24, // 1 day per public referendum - voting_period: 12 * 60 * 24 * 3, // 3 days to discuss & vote on an active referendum - minimum_deposit: 5000, // 12000 as the minimum deposit for a referendum - }), - council: Some(CouncilConfig { - active_council: vec![], - candidacy_bond: 5000, // 5000 to become a council candidate - voter_bond: 1000, // 1000 down to vote for a candidate - present_slash_per_voter: 1, // slash by 1 per voter for an invalid presentation. - carry_count: 6, // carry over the 6 runners-up to the next council election - presentation_duration: 12 * 60 * 24, // one day for presenting winners. - approval_voting_period: 12 * 60 * 24 * 2, // two days period between possible council elections. - term_duration: 12 * 60 * 24 * 24, // 24 day term duration for the council. - desired_seats: 0, // start with no council: we'll raise this once the stake has been dispersed a bit. - inactive_grace_period: 1, // one addition vote should go by before an inactive voter can be reaped. - - cooloff_period: 12 * 60 * 24 * 4, // 4 day cooling off period if council member vetoes a proposal. - voting_period: 12 * 60 * 24, // 1 day voting period for council members. - }), - parachains: Some(Default::default()), - timestamp: Some(TimestampConfig { - period: 5, // 5 second block time. - }), - } -} - -/// Staging testnet config. -pub fn staging_testnet_config() -> ChainSpec<GenesisConfig> { - let boot_nodes = vec![]; - ChainSpec::from_genesis( - "Staging Testnet", - "staging_testnet", - staging_testnet_config_genesis, - boot_nodes, - Some(STAGING_TELEMETRY_URL.into()), - ) -} - -fn testnet_genesis(initial_authorities: Vec<AuthorityId>) -> GenesisConfig { - let endowed_accounts = vec![ - 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(), - ]; - GenesisConfig { - consensus: Some(ConsensusConfig { - code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm").to_vec(), - authorities: initial_authorities.clone(), - }), - system: None, - session: Some(SessionConfig { - validators: initial_authorities.iter().cloned().map(Into::into).collect(), - session_length: 10, - broken_percent_late: 30, - }), - staking: Some(StakingConfig { - current_era: 0, - intentions: initial_authorities.iter().cloned().map(Into::into).collect(), - transaction_base_fee: 1, - transaction_byte_fee: 0, - existential_deposit: 500, - transfer_fee: 0, - creation_fee: 0, - reclaim_rebate: 0, - balances: endowed_accounts.iter().map(|&k|(k, (1u128 << 60))).collect(), - validator_count: 2, - sessions_per_era: 5, - bonding_duration: 2, - early_era_slash: 0, - session_reward: 0, - }), - democracy: Some(DemocracyConfig { - launch_period: 9, - voting_period: 18, - minimum_deposit: 10, - }), - council: Some(CouncilConfig { - active_council: endowed_accounts.iter().filter(|a| initial_authorities.iter().find(|&b| a.0 == b.0).is_none()).map(|a| (a.clone(), 1000000)).collect(), - candidacy_bond: 10, - voter_bond: 2, - present_slash_per_voter: 1, - carry_count: 4, - presentation_duration: 10, - approval_voting_period: 20, - term_duration: 1000000, - desired_seats: (endowed_accounts.len() - initial_authorities.len()) as u32, - inactive_grace_period: 1, - - cooloff_period: 75, - voting_period: 20, - }), - parachains: Some(Default::default()), - timestamp: Some(TimestampConfig { - period: 5, // 5 second block time. - }), - } -} - -fn development_config_genesis() -> GenesisConfig { - testnet_genesis(vec![ - ed25519::Pair::from_seed(b"Alice ").public().into(), - ]) -} - -/// Development config (single validator Alice) -pub fn development_config() -> ChainSpec<GenesisConfig> { - ChainSpec::from_genesis("Development", "development", development_config_genesis, vec![], None) -} - -fn local_testnet_genesis() -> GenesisConfig { - testnet_genesis(vec![ - ed25519::Pair::from_seed(b"Alice ").public().into(), - ed25519::Pair::from_seed(b"Bob ").public().into(), - ]) -} - -/// Local testnet config (multivalidator Alice + Bob) -pub fn local_testnet_config() -> ChainSpec<GenesisConfig> { - ChainSpec::from_genesis("Local Testnet", "local_testnet", local_testnet_genesis, vec![], None) -} diff --git a/substrate/polkadot/service/src/lib.rs b/substrate/polkadot/service/src/lib.rs deleted file mode 100644 index 3814a1c98da..00000000000 --- a/substrate/polkadot/service/src/lib.rs +++ /dev/null @@ -1,362 +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 <http://www.gnu.org/licenses/>. - -#![warn(unused_extern_crates)] - -//! Polkadot service. Specialized wrapper over substrate service. - -extern crate ed25519; -extern crate polkadot_availability_store as av_store; -extern crate polkadot_primitives; -extern crate polkadot_runtime; -extern crate polkadot_executor; -extern crate polkadot_api; -extern crate polkadot_consensus as consensus; -extern crate polkadot_transaction_pool as transaction_pool; -extern crate polkadot_network; -extern crate substrate_primitives as primitives; -extern crate substrate_network as network; -extern crate substrate_codec as codec; -extern crate substrate_client as client; -extern crate substrate_service as service; -extern crate tokio; - -#[macro_use] -extern crate log; -#[macro_use] -extern crate hex_literal; - -pub mod chain_spec; - -use std::sync::Arc; -use std::collections::HashMap; - -use codec::{Encode, Decode}; -use transaction_pool::TransactionPool; -use polkadot_api::{PolkadotApi, light::RemotePolkadotApiWrapper}; -use polkadot_primitives::{parachain, AccountId, Block, BlockId, Hash}; -use polkadot_runtime::GenesisConfig; -use client::Client; -use polkadot_network::{PolkadotProtocol, consensus::ConsensusNetwork}; -use tokio::runtime::TaskExecutor; -use service::FactoryFullConfiguration; - -pub use service::{Roles, PruningMode, ExtrinsicPoolOptions, - ErrorKind, Error, ComponentBlock, LightComponents, FullComponents}; -pub use client::ExecutionStrategy; - -/// Specialised polkadot `ChainSpec`. -pub type ChainSpec = service::ChainSpec<GenesisConfig>; -/// Polkadot client type for specialised `Components`. -pub type ComponentClient<C> = Client<<C as Components>::Backend, <C as Components>::Executor, Block>; -pub type NetworkService = network::Service<Block, <Factory as service::ServiceFactory>::NetworkProtocol>; - -/// A collection of type to generalise Polkadot specific components over full / light client. -pub trait Components: service::Components { - /// Polkadot API. - type Api: 'static + PolkadotApi + Send + Sync; - /// Client backend. - type Backend: 'static + client::backend::Backend<Block>; - /// Client executor. - type Executor: 'static + client::CallExecutor<Block> + Send + Sync; -} - -impl Components for service::LightComponents<Factory> { - type Api = RemotePolkadotApiWrapper< - <service::LightComponents<Factory> as service::Components>::Backend, - <service::LightComponents<Factory> as service::Components>::Executor, - >; - type Executor = service::LightExecutor<Factory>; - type Backend = service::LightBackend<Factory>; -} - -impl Components for service::FullComponents<Factory> { - type Api = service::FullClient<Factory>; - type Executor = service::FullExecutor<Factory>; - type Backend = service::FullBackend<Factory>; -} - -/// All configuration for the polkadot node. -pub type Configuration = FactoryFullConfiguration<Factory>; - -/// Polkadot-specific configuration. -#[derive(Default)] -pub struct CustomConfiguration { - /// Set to `Some` with a collator `AccountId` and desired parachain - /// if the network protocol should be started in collator mode. - pub collating_for: Option<(AccountId, parachain::Id)>, -} - -/// Polkadot config for the substrate service. -pub struct Factory; - -impl service::ServiceFactory for Factory { - type Block = Block; - type NetworkProtocol = PolkadotProtocol; - type RuntimeDispatch = polkadot_executor::Executor; - type FullExtrinsicPool = TransactionPoolAdapter< - service::FullBackend<Self>, - service::FullExecutor<Self>, - service::FullClient<Self> - >; - type LightExtrinsicPool = TransactionPoolAdapter< - service::LightBackend<Self>, - service::LightExecutor<Self>, - RemotePolkadotApiWrapper<service::LightBackend<Self>, service::LightExecutor<Self>> - >; - type Genesis = GenesisConfig; - type Configuration = CustomConfiguration; - - const NETWORK_PROTOCOL_ID: network::ProtocolId = ::polkadot_network::DOT_PROTOCOL_ID; - - fn build_full_extrinsic_pool(config: ExtrinsicPoolOptions, client: Arc<service::FullClient<Self>>) - -> Result<Self::FullExtrinsicPool, Error> - { - let api = client.clone(); - Ok(TransactionPoolAdapter { - pool: Arc::new(TransactionPool::new(config, api)), - client: client, - imports_external_transactions: true, - }) - } - - fn build_light_extrinsic_pool(config: ExtrinsicPoolOptions, client: Arc<service::LightClient<Self>>) - -> Result<Self::LightExtrinsicPool, Error> - { - let api = Arc::new(RemotePolkadotApiWrapper(client.clone())); - Ok(TransactionPoolAdapter { - pool: Arc::new(TransactionPool::new(config, api)), - client: client, - imports_external_transactions: false, - }) - } - - fn build_network_protocol(config: &Configuration) - -> Result<PolkadotProtocol, Error> - { - if let Some((_, ref para_id)) = config.custom.collating_for { - info!("Starting network in Collator mode for parachain {:?}", para_id); - } - Ok(PolkadotProtocol::new(config.custom.collating_for)) - } -} - -/// Polkadot service. -pub struct Service<C: Components> { - inner: service::Service<C>, - client: Arc<ComponentClient<C>>, - network: Arc<NetworkService>, - api: Arc<<C as Components>::Api>, - _consensus: Option<consensus::Service>, -} - -impl <C: Components> Service<C> { - pub fn client(&self) -> Arc<ComponentClient<C>> { - self.client.clone() - } - - pub fn network(&self) -> Arc<NetworkService> { - self.network.clone() - } - - pub fn api(&self) -> Arc<<C as Components>::Api> { - self.api.clone() - } -} - -/// Creates light client and register protocol with the network service -pub fn new_light(config: Configuration, executor: TaskExecutor) - -> Result<Service<LightComponents<Factory>>, Error> -{ - let service = service::Service::<LightComponents<Factory>>::new(config, executor)?; - let api = Arc::new(RemotePolkadotApiWrapper(service.client())); - Ok(Service { - client: service.client(), - network: service.network(), - api: api, - inner: service, - _consensus: None, - }) -} - -/// Creates full client and register protocol with the network service -pub fn new_full(config: Configuration, executor: TaskExecutor) - -> Result<Service<FullComponents<Factory>>, Error> -{ - // open availability store. - let av_store = { - use std::path::PathBuf; - - let mut path = PathBuf::from(config.database_path.clone()); - path.push("availability"); - - ::av_store::Store::new(::av_store::Config { - cache_size: None, - path, - })? - }; - - let is_validator = (config.roles & Roles::AUTHORITY) == Roles::AUTHORITY; - let service = service::Service::<FullComponents<Factory>>::new(config, executor.clone())?; - - // Spin consensus service if configured - let consensus = if is_validator { - // Load the first available key - let key = service.keystore().load(&service.keystore().contents()?[0], "")?; - info!("Using authority key {}", key.public()); - - let client = service.client(); - - let consensus_net = ConsensusNetwork::new(service.network(), client.clone()); - Some(consensus::Service::new( - client.clone(), - client.clone(), - consensus_net, - service.extrinsic_pool(), - executor, - ::std::time::Duration::from_secs(4), // TODO: dynamic - key, - av_store.clone(), - )) - } else { - None - }; - - service.network().with_spec(|spec, _| spec.register_availability_store(av_store)); - - Ok(Service { - client: service.client(), - network: service.network(), - api: service.client(), - inner: service, - _consensus: consensus, - }) -} - -/// Creates bare client without any networking. -pub fn new_client(config: Configuration) --> Result<Arc<service::ComponentClient<FullComponents<Factory>>>, Error> -{ - service::new_client::<Factory>(config) -} - -impl<C: Components> ::std::ops::Deref for Service<C> { - type Target = service::Service<C>; - - fn deref(&self) -> &Self::Target { - &self.inner - } -} - -/// Transaction pool adapter. -pub struct TransactionPoolAdapter<B, E, A> where A: Send + Sync, E: Send + Sync { - imports_external_transactions: bool, - pool: Arc<TransactionPool<A>>, - client: Arc<Client<B, E, Block>>, -} - -impl<B, E, A> TransactionPoolAdapter<B, E, A> - where - A: Send + Sync, - B: client::backend::Backend<Block> + Send + Sync, - E: client::CallExecutor<Block> + Send + Sync, -{ - fn best_block_id(&self) -> Option<BlockId> { - self.client.info() - .map(|info| BlockId::hash(info.chain.best_hash)) - .map_err(|e| { - debug!("Error getting best block: {:?}", e); - }) - .ok() - } -} - -impl<B, E, A> network::TransactionPool<Block> for TransactionPoolAdapter<B, E, A> - where - B: client::backend::Backend<Block> + Send + Sync, - E: client::CallExecutor<Block> + Send + Sync, - A: polkadot_api::PolkadotApi + Send + Sync, -{ - fn transactions(&self) -> Vec<(Hash, Vec<u8>)> { - let best_block_id = match self.best_block_id() { - Some(id) => id, - None => return vec![], - }; - self.pool.cull_and_get_pending(best_block_id, |pending| pending - .map(|t| { - let hash = t.hash().clone(); - (hash, t.primitive_extrinsic()) - }) - .collect() - ).unwrap_or_else(|e| { - warn!("Error retrieving pending set: {}", e); - vec![] - }) - } - - fn import(&self, transaction: &Vec<u8>) -> Option<Hash> { - if !self.imports_external_transactions { - return None; - } - - let encoded = transaction.encode(); - if let Some(uxt) = Decode::decode(&mut &encoded[..]) { - let best_block_id = self.best_block_id()?; - match self.pool.import_unchecked_extrinsic(best_block_id, uxt) { - Ok(xt) => Some(*xt.hash()), - Err(e) => match *e.kind() { - transaction_pool::ErrorKind::AlreadyImported(hash) => Some(hash[..].into()), - _ => { - debug!(target: "txpool", "Error adding transaction to the pool: {:?}", e); - None - }, - } - } - } else { - debug!(target: "txpool", "Error decoding transaction"); - None - } - } - - fn on_broadcasted(&self, propagations: HashMap<Hash, Vec<String>>) { - self.pool.on_broadcasted(propagations) - } -} - -impl<B, E, A> service::ExtrinsicPool<Block> for TransactionPoolAdapter<B, E, A> - where - B: client::backend::Backend<Block> + Send + Sync + 'static, - E: client::CallExecutor<Block> + Send + Sync + 'static, - A: polkadot_api::PolkadotApi + Send + Sync + 'static, -{ - type Api = TransactionPool<A>; - - fn prune_imported(&self, hash: &Hash) { - let block = BlockId::hash(*hash); - if let Err(e) = self.pool.cull(block) { - warn!("Culling error: {:?}", e); - } - - if let Err(e) = self.pool.retry_verification(block) { - warn!("Re-verifying error: {:?}", e); - } - } - - fn api(&self) -> Arc<Self::Api> { - self.pool.clone() - } -} - diff --git a/substrate/polkadot/src/README.adoc b/substrate/polkadot/src/README.adoc deleted file mode 100644 index fed228df0b6..00000000000 --- a/substrate/polkadot/src/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Src - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/src/main.rs b/substrate/polkadot/src/main.rs deleted file mode 100644 index d3e951596e2..00000000000 --- a/substrate/polkadot/src/main.rs +++ /dev/null @@ -1,77 +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 <http://www.gnu.org/licenses/>. - -//! Polkadot CLI - -#![warn(missing_docs)] - -extern crate polkadot_cli as cli; -extern crate ctrlc; -extern crate futures; - -#[macro_use] -extern crate error_chain; - -use cli::{ServiceComponents, Service, VersionInfo}; -use futures::sync::oneshot; -use futures::{future, Future}; - -use std::cell::RefCell; - -mod vergen { - #![allow(unused)] - include!(concat!(env!("OUT_DIR"), "/version.rs")); -} - -// the regular polkadot worker simply does nothing until ctrl-c -struct Worker; -impl cli::IntoExit for Worker { - type Exit = future::MapErr<oneshot::Receiver<()>, fn(oneshot::Canceled) -> ()>; - fn into_exit(self) -> Self::Exit { - // can't use signal directly here because CtrlC takes only `Fn`. - let (exit_send, exit) = oneshot::channel(); - - let exit_send_cell = RefCell::new(Some(exit_send)); - ctrlc::CtrlC::set_handler(move || { - if let Some(exit_send) = exit_send_cell.try_borrow_mut().expect("signal handler not reentrant; qed").take() { - exit_send.send(()).expect("Error sending exit notification"); - } - }); - - exit.map_err(drop) - } -} - -impl cli::Worker for Worker { - type Work = <Self as cli::IntoExit>::Exit; - fn work<C: ServiceComponents>(self, _service: &Service<C>) -> Self::Work { - use cli::IntoExit; - self.into_exit() - } -} - -quick_main!(run); - -fn run() -> cli::error::Result<()> { - let version = VersionInfo { - commit: vergen::short_sha(), - version: env!("CARGO_PKG_VERSION"), - executable_name: "polkadot", - author: "Parity Team <admin@parity.io>", - description: "Polkadot Node Rust Implementation", - }; - cli::run(::std::env::args(), Worker, version) -} diff --git a/substrate/polkadot/statement-table/Cargo.toml b/substrate/polkadot/statement-table/Cargo.toml deleted file mode 100644 index 97e35d1f5f0..00000000000 --- a/substrate/polkadot/statement-table/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "polkadot-statement-table" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] - -[dependencies] -substrate-codec = { path = "../../substrate/codec" } -substrate-codec-derive = { path = "../../substrate/codec/derive" } -substrate-primitives = { path = "../../substrate/primitives" } -polkadot-primitives = { path = "../primitives" } diff --git a/substrate/polkadot/statement-table/README.adoc b/substrate/polkadot/statement-table/README.adoc deleted file mode 100644 index 402f55108f4..00000000000 --- a/substrate/polkadot/statement-table/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Statement table - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/statement-table/src/generic.rs b/substrate/polkadot/statement-table/src/generic.rs deleted file mode 100644 index 2a6c828f5b3..00000000000 --- a/substrate/polkadot/statement-table/src/generic.rs +++ /dev/null @@ -1,1192 +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 <http://www.gnu.org/licenses/>. - -//! The statement table: generic implementation. -//! -//! This stores messages other authorities issue about candidates. -//! -//! These messages are used to create a proposal submitted to a BFT consensus process. -//! -//! Proposals are formed of sets of candidates which have the requisite number of -//! validity and availability votes. -//! -//! Each parachain is associated with two sets of authorities: those which can -//! propose and attest to validity of candidates, and those who can only attest -//! to availability. - -use std::collections::hash_map::{HashMap, Entry}; -use std::hash::Hash; -use std::fmt::Debug; - -/// Context for the statement table. -pub trait Context { - /// A authority ID - type AuthorityId: Debug + Hash + Eq + Clone; - /// The digest (hash or other unique attribute) of a candidate. - type Digest: Debug + Hash + Eq + Clone; - /// The group ID type - type GroupId: Debug + Hash + Ord + Eq + Clone; - /// A signature type. - type Signature: Debug + Eq + Clone; - /// Candidate type. In practice this will be a candidate receipt. - type Candidate: Debug + Ord + Eq + Clone; - - /// get the digest of a candidate. - fn candidate_digest(candidate: &Self::Candidate) -> Self::Digest; - - /// get the group of a candidate. - fn candidate_group(candidate: &Self::Candidate) -> Self::GroupId; - - /// Whether a authority is a member of a group. - /// Members are meant to submit candidates and vote on validity. - fn is_member_of(&self, authority: &Self::AuthorityId, group: &Self::GroupId) -> bool; - - /// Whether a authority is an availability guarantor of a group. - /// Guarantors are meant to vote on availability for candidates submitted - /// in a group. - fn is_availability_guarantor_of( - &self, - authority: &Self::AuthorityId, - group: &Self::GroupId, - ) -> bool; - - // requisite number of votes for validity and availability respectively from a group. - fn requisite_votes(&self, group: &Self::GroupId) -> (usize, usize); -} - -/// Statements circulated among peers. -#[derive(PartialEq, Eq, Debug, Clone, Encode, Decode)] -pub enum Statement<C, D> { - /// Broadcast by a authority to indicate that this is his candidate for - /// inclusion. - /// - /// Broadcasting two different candidate messages per round is not allowed. - #[codec(index = "1")] - Candidate(C), - /// Broadcast by a authority to attest that the candidate with given digest - /// is valid. - #[codec(index = "2")] - Valid(D), - /// Broadcast by a authority to attest that the candidate with given digest - /// is invalid. - #[codec(index = "3")] - Invalid(D), - /// Broadcast by a authority to attest that the auxiliary data for a candidate - /// with given digest is available. - #[codec(index = "4")] - Available(D), -} - -/// A signed statement. -#[derive(PartialEq, Eq, Debug, Clone, Encode, Decode)] -pub struct SignedStatement<C, D, V, S> { - /// The statement. - pub statement: Statement<C, D>, - /// The signature. - pub signature: S, - /// The sender. - pub sender: V, -} - -/// Misbehavior: voting more than one way on candidate validity. -/// -/// Since there are three possible ways to vote, a double vote is possible in -/// three possible combinations (unordered) -#[derive(PartialEq, Eq, Debug, Clone)] -pub enum ValidityDoubleVote<C, D, S> { - /// Implicit vote by issuing and explicity voting validity. - IssuedAndValidity((C, S), (D, S)), - /// Implicit vote by issuing and explicitly voting invalidity - IssuedAndInvalidity((C, S), (D, S)), - /// Direct votes for validity and invalidity - ValidityAndInvalidity(D, S, S), -} - -/// Misbehavior: multiple signatures on same statement. -#[derive(PartialEq, Eq, Debug, Clone)] -pub enum DoubleSign<C, D, S> { - /// On candidate. - Candidate(C, S, S), - /// On validity. - Validity(D, S, S), - /// On invalidity. - Invalidity(D, S, S), - /// On availability. - Availability(D, S, S), -} - -/// Misbehavior: declaring multiple candidates. -#[derive(PartialEq, Eq, Debug, Clone)] -pub struct MultipleCandidates<C, S> { - /// The first candidate seen. - pub first: (C, S), - /// The second candidate seen. - pub second: (C, S), -} - -/// Misbehavior: submitted statement for wrong group. -#[derive(PartialEq, Eq, Debug, Clone)] -pub struct UnauthorizedStatement<C, D, V, S> { - /// A signed statement which was submitted without proper authority. - pub statement: SignedStatement<C, D, V, S>, -} - -/// Different kinds of misbehavior. All of these kinds of malicious misbehavior -/// are easily provable and extremely disincentivized. -#[derive(PartialEq, Eq, Debug, Clone)] -pub enum Misbehavior<C, D, V, S> { - /// Voted invalid and valid on validity. - ValidityDoubleVote(ValidityDoubleVote<C, D, S>), - /// Submitted multiple candidates. - MultipleCandidates(MultipleCandidates<C, S>), - /// Submitted a message that was unauthorized. - UnauthorizedStatement(UnauthorizedStatement<C, D, V, S>), - /// Submitted two valid signatures for the same message. - DoubleSign(DoubleSign<C, D, S>), -} - -/// Type alias for misbehavior corresponding to context type. -pub type MisbehaviorFor<C> = Misbehavior<<C as Context>::Candidate, <C as Context>::Digest, <C as Context>::AuthorityId, <C as Context>::Signature>; - -// kinds of votes for validity -#[derive(Clone, PartialEq, Eq)] -enum ValidityVote<S: Eq + Clone> { - // implicit validity vote by issuing - Issued(S), - // direct validity vote - Valid(S), - // direct invalidity vote - Invalid(S), -} - -/// A summary of import of a statement. -#[derive(Clone, PartialEq, Eq)] -pub struct Summary<D, G> { - /// The digest of the candidate referenced. - pub candidate: D, - /// The group that candidate is in. - pub group_id: G, - /// How many validity votes are currently witnessed. - pub validity_votes: usize, - /// How many availability votes are currently witnessed. - pub availability_votes: usize, - /// Whether this has been signalled bad by at least one participant. - pub signalled_bad: bool, -} - -/// Stores votes and data about a candidate. -pub struct CandidateData<C: Context> { - group_id: C::GroupId, - candidate: C::Candidate, - validity_votes: HashMap<C::AuthorityId, ValidityVote<C::Signature>>, - availability_votes: HashMap<C::AuthorityId, C::Signature>, - indicated_bad_by: Vec<C::AuthorityId>, -} - -impl<C: Context> CandidateData<C> { - /// whether this has been indicated bad by anyone. - pub fn indicated_bad(&self) -> bool { - !self.indicated_bad_by.is_empty() - } - - // Candidate data can be included in a proposal - // if it has enough validity and availability votes - // and no authorities have called it bad. - fn can_be_included(&self, validity_threshold: usize, availability_threshold: usize) -> bool { - self.indicated_bad_by.is_empty() - && self.validity_votes.len() >= validity_threshold - && self.availability_votes.len() >= availability_threshold - } - - fn summary(&self, digest: C::Digest) -> Summary<C::Digest, C::GroupId> { - Summary { - candidate: digest, - group_id: self.group_id.clone(), - validity_votes: self.validity_votes.len() - self.indicated_bad_by.len(), - availability_votes: self.availability_votes.len(), - signalled_bad: self.indicated_bad(), - } - } -} - -// authority metadata -struct AuthorityData<C: Context> { - proposal: Option<(C::Digest, C::Signature)>, -} - -impl<C: Context> Default for AuthorityData<C> { - fn default() -> Self { - AuthorityData { - proposal: None, - } - } -} - -/// Type alias for the result of a statement import. -pub type ImportResult<C> = Result< - Option<Summary<<C as Context>::Digest, <C as Context>::GroupId>>, - MisbehaviorFor<C> ->; - -/// Stores votes -pub struct Table<C: Context> { - authority_data: HashMap<C::AuthorityId, AuthorityData<C>>, - detected_misbehavior: HashMap<C::AuthorityId, MisbehaviorFor<C>>, - candidate_votes: HashMap<C::Digest, CandidateData<C>>, - includable_count: HashMap<C::GroupId, usize>, -} - -impl<C: Context> Default for Table<C> { - fn default() -> Self { - Table { - authority_data: HashMap::new(), - detected_misbehavior: HashMap::new(), - candidate_votes: HashMap::new(), - includable_count: HashMap::new(), - } - } -} - -impl<C: Context> Table<C> { - /// Produce a set of proposed candidates. - /// - /// This will be at most one per group, consisting of the - /// best candidate for each group with requisite votes for inclusion. - /// - /// The vector is sorted in ascending order by group id. - pub fn proposed_candidates<'a>(&'a self, context: &C) -> Vec<&'a C::Candidate> { - use std::collections::BTreeMap; - use std::collections::btree_map::Entry as BTreeEntry; - - let mut best_candidates = BTreeMap::new(); - for candidate_data in self.candidate_votes.values() { - let group_id = &candidate_data.group_id; - - if !self.includable_count.contains_key(group_id) { - continue - } - - let (validity_t, availability_t) = context.requisite_votes(group_id); - - if !candidate_data.can_be_included(validity_t, availability_t) { continue } - let candidate = &candidate_data.candidate; - match best_candidates.entry(group_id.clone()) { - BTreeEntry::Occupied(mut occ) => { - let candidate_ref = occ.get_mut(); - if *candidate_ref > candidate { - *candidate_ref = candidate; - } - } - BTreeEntry::Vacant(vacant) => { vacant.insert(candidate); }, - } - } - - best_candidates.values().cloned().collect::<Vec<_>>() - } - - /// Whether a candidate can be included. - pub fn candidate_includable(&self, digest: &C::Digest, context: &C) -> bool { - self.candidate_votes.get(digest).map_or(false, |data| { - let (v_threshold, a_threshold) = context.requisite_votes(&data.group_id); - data.can_be_included(v_threshold, a_threshold) - }) - } - - /// Import a signed statement. Signatures should be checked for validity, and the - /// sender should be checked to actually be an authority. - /// - /// If this returns `None`, the statement was either duplicate or invalid. - pub fn import_statement( - &mut self, - context: &C, - statement: SignedStatement<C::Candidate, C::Digest, C::AuthorityId, C::Signature>, - ) -> Option<Summary<C::Digest, C::GroupId>> { - let SignedStatement { statement, signature, sender: signer } = statement; - - let res = match statement { - Statement::Candidate(candidate) => self.import_candidate( - context, - signer.clone(), - candidate, - signature - ), - Statement::Valid(digest) => self.validity_vote( - context, - signer.clone(), - digest, - ValidityVote::Valid(signature), - ), - Statement::Invalid(digest) => self.validity_vote( - context, - signer.clone(), - digest, - ValidityVote::Invalid(signature), - ), - Statement::Available(digest) => self.availability_vote( - context, - signer.clone(), - digest, - signature, - ), - }; - - match res { - Ok(maybe_summary) => maybe_summary, - Err(misbehavior) => { - // all misbehavior in agreement is provable and actively malicious. - // punishments are not cumulative. - self.detected_misbehavior.insert(signer, misbehavior); - None - } - } - } - - /// Get a candidate by digest. - pub fn get_candidate(&self, digest: &C::Digest) -> Option<&C::Candidate> { - self.candidate_votes.get(digest).map(|d| &d.candidate) - } - - /// Access all witnessed misbehavior. - pub fn get_misbehavior(&self) - -> &HashMap<C::AuthorityId, MisbehaviorFor<C>> - { - &self.detected_misbehavior - } - - /// Get the current number of parachains with includable candidates. - pub fn includable_count(&self) -> usize { - self.includable_count.len() - } - - fn import_candidate( - &mut self, - context: &C, - from: C::AuthorityId, - candidate: C::Candidate, - signature: C::Signature, - ) -> ImportResult<C> { - let group = C::candidate_group(&candidate); - if !context.is_member_of(&from, &group) { - return Err(Misbehavior::UnauthorizedStatement(UnauthorizedStatement { - statement: SignedStatement { - signature, - statement: Statement::Candidate(candidate), - sender: from, - }, - })); - } - - // check that authority hasn't already specified another candidate. - let digest = C::candidate_digest(&candidate); - - let new_proposal = match self.authority_data.entry(from.clone()) { - Entry::Occupied(mut occ) => { - // if digest is different, fetch candidate and - // note misbehavior. - let existing = occ.get_mut(); - - if let Some((ref old_digest, ref old_sig)) = existing.proposal { - if old_digest != &digest { - const EXISTENCE_PROOF: &str = - "when proposal first received from authority, candidate \ - votes entry is created. proposal here is `Some`, therefore \ - candidate votes entry exists; qed"; - - let old_candidate = self.candidate_votes.get(old_digest) - .expect(EXISTENCE_PROOF) - .candidate - .clone(); - - return Err(Misbehavior::MultipleCandidates(MultipleCandidates { - first: (old_candidate, old_sig.clone()), - second: (candidate, signature.clone()), - })); - } - - false - } else { - existing.proposal = Some((digest.clone(), signature.clone())); - true - } - } - Entry::Vacant(vacant) => { - vacant.insert(AuthorityData { - proposal: Some((digest.clone(), signature.clone())), - }); - true - } - }; - - // NOTE: altering this code may affect the existence proof above. ensure it remains - // valid. - if new_proposal { - self.candidate_votes.entry(digest.clone()).or_insert_with(move || CandidateData { - group_id: group, - candidate: candidate, - validity_votes: HashMap::new(), - availability_votes: HashMap::new(), - indicated_bad_by: Vec::new(), - }); - } - - self.validity_vote( - context, - from, - digest, - ValidityVote::Issued(signature), - ) - } - - fn validity_vote( - &mut self, - context: &C, - from: C::AuthorityId, - digest: C::Digest, - vote: ValidityVote<C::Signature>, - ) -> ImportResult<C> { - let votes = match self.candidate_votes.get_mut(&digest) { - None => return Ok(None), - Some(votes) => votes, - }; - - let (v_threshold, a_threshold) = context.requisite_votes(&votes.group_id); - let was_includable = votes.can_be_included(v_threshold, a_threshold); - - // check that this authority actually can vote in this group. - if !context.is_member_of(&from, &votes.group_id) { - let (sig, valid) = match vote { - ValidityVote::Valid(s) => (s, true), - ValidityVote::Invalid(s) => (s, false), - ValidityVote::Issued(_) => - panic!("implicit issuance vote only cast from `import_candidate` after \ - checking group membership of issuer; qed"), - }; - - return Err(Misbehavior::UnauthorizedStatement(UnauthorizedStatement { - statement: SignedStatement { - signature: sig, - sender: from, - statement: if valid { - Statement::Valid(digest) - } else { - Statement::Invalid(digest) - } - } - })); - } - - // check for double votes. - match votes.validity_votes.entry(from.clone()) { - Entry::Occupied(occ) => { - let make_vdv = |v| Misbehavior::ValidityDoubleVote(v); - let make_ds = |ds| Misbehavior::DoubleSign(ds); - return if occ.get() != &vote { - Err(match (occ.get().clone(), vote) { - // valid vote conflicting with candidate statement - (ValidityVote::Issued(iss), ValidityVote::Valid(good)) | - (ValidityVote::Valid(good), ValidityVote::Issued(iss)) => - make_vdv(ValidityDoubleVote::IssuedAndValidity((votes.candidate.clone(), iss), (digest, good))), - - // invalid vote conflicting with candidate statement - (ValidityVote::Issued(iss), ValidityVote::Invalid(bad)) | - (ValidityVote::Invalid(bad), ValidityVote::Issued(iss)) => - make_vdv(ValidityDoubleVote::IssuedAndInvalidity((votes.candidate.clone(), iss), (digest, bad))), - - // valid vote conflicting with invalid vote - (ValidityVote::Valid(good), ValidityVote::Invalid(bad)) | - (ValidityVote::Invalid(bad), ValidityVote::Valid(good)) => - make_vdv(ValidityDoubleVote::ValidityAndInvalidity(digest, good, bad)), - - // two signatures on same candidate - (ValidityVote::Issued(a), ValidityVote::Issued(b)) => - make_ds(DoubleSign::Candidate(votes.candidate.clone(), a, b)), - - // two signatures on same validity vote - (ValidityVote::Valid(a), ValidityVote::Valid(b)) => - make_ds(DoubleSign::Validity(digest, a, b)), - - // two signature on same invalidity vote - (ValidityVote::Invalid(a), ValidityVote::Invalid(b)) => - make_ds(DoubleSign::Invalidity(digest, a, b)), - }) - } else { - Ok(None) - } - } - Entry::Vacant(vacant) => { - if let ValidityVote::Invalid(_) = vote { - votes.indicated_bad_by.push(from); - } - - vacant.insert(vote); - } - } - - let is_includable = votes.can_be_included(v_threshold, a_threshold); - update_includable_count(&mut self.includable_count, &votes.group_id, was_includable, is_includable); - - Ok(Some(votes.summary(digest))) - } - - fn availability_vote( - &mut self, - context: &C, - from: C::AuthorityId, - digest: C::Digest, - signature: C::Signature, - ) -> ImportResult<C> { - let votes = match self.candidate_votes.get_mut(&digest) { - None => return Ok(None), - Some(votes) => votes, - }; - - let (v_threshold, a_threshold) = context.requisite_votes(&votes.group_id); - let was_includable = votes.can_be_included(v_threshold, a_threshold); - - // check that this authority actually can vote in this group. - if !context.is_availability_guarantor_of(&from, &votes.group_id) { - return Err(Misbehavior::UnauthorizedStatement(UnauthorizedStatement { - statement: SignedStatement { - signature: signature, - statement: Statement::Available(digest), - sender: from, - } - })); - } - - match votes.availability_votes.entry(from) { - Entry::Occupied(ref occ) if occ.get() != &signature => return Err( - Misbehavior::DoubleSign(DoubleSign::Availability(digest, signature, occ.get().clone())) - ), - entry => { let _ = entry.or_insert(signature); }, - } - - let is_includable = votes.can_be_included(v_threshold, a_threshold); - update_includable_count(&mut self.includable_count, &votes.group_id, was_includable, is_includable); - - Ok(Some(votes.summary(digest))) - } -} - -fn update_includable_count<G: Hash + Eq + Clone>(map: &mut HashMap<G, usize>, group_id: &G, was_includable: bool, is_includable: bool) { - if was_includable && !is_includable { - if let Entry::Occupied(mut entry) = map.entry(group_id.clone()) { - *entry.get_mut() -= 1; - if *entry.get() == 0 { - entry.remove(); - } - } - } - - if !was_includable && is_includable { - *map.entry(group_id.clone()).or_insert(0) += 1; - } -} - -#[cfg(test)] -mod tests { - use super::*; - use std::collections::HashMap; - - fn create<C: Context>() -> Table<C> { - Table::default() - } - - #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] - struct AuthorityId(usize); - - #[derive(Debug, Copy, Clone, Hash, PartialOrd, Ord, PartialEq, Eq)] - struct GroupId(usize); - - // group, body - #[derive(Debug, Copy, Clone, Hash, PartialOrd, Ord, PartialEq, Eq)] - struct Candidate(usize, usize); - - #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] - struct Signature(usize); - - #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] - struct Digest(usize); - - #[derive(Debug, PartialEq, Eq)] - struct TestContext { - // v -> (validity, availability) - authorities: HashMap<AuthorityId, (GroupId, GroupId)> - } - - impl Context for TestContext { - type AuthorityId = AuthorityId; - type Digest = Digest; - type Candidate = Candidate; - type GroupId = GroupId; - type Signature = Signature; - - fn candidate_digest(candidate: &Candidate) -> Digest { - Digest(candidate.1) - } - - fn candidate_group(candidate: &Candidate) -> GroupId { - GroupId(candidate.0) - } - - fn is_member_of( - &self, - authority: &AuthorityId, - group: &GroupId - ) -> bool { - self.authorities.get(authority).map(|v| &v.0 == group).unwrap_or(false) - } - - fn is_availability_guarantor_of( - &self, - authority: &AuthorityId, - group: &GroupId - ) -> bool { - self.authorities.get(authority).map(|v| &v.1 == group).unwrap_or(false) - } - - fn requisite_votes(&self, id: &GroupId) -> (usize, usize) { - let mut total_validity = 0; - let mut total_availability = 0; - - for &(ref validity, ref availability) in self.authorities.values() { - if validity == id { total_validity += 1 } - if availability == id { total_availability += 1 } - } - - (total_validity / 2 + 1, total_availability / 2 + 1) - } - } - - #[test] - fn submitting_two_candidates_is_misbehavior() { - let context = TestContext { - authorities: { - let mut map = HashMap::new(); - map.insert(AuthorityId(1), (GroupId(2), GroupId(455))); - map - } - }; - - let mut table = create(); - let statement_a = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }; - - let statement_b = SignedStatement { - statement: Statement::Candidate(Candidate(2, 999)), - signature: Signature(1), - sender: AuthorityId(1), - }; - - table.import_statement(&context, statement_a); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); - - table.import_statement(&context, statement_b); - assert_eq!( - table.detected_misbehavior.get(&AuthorityId(1)).unwrap(), - &Misbehavior::MultipleCandidates(MultipleCandidates { - first: (Candidate(2, 100), Signature(1)), - second: (Candidate(2, 999), Signature(1)), - }) - ); - } - - #[test] - fn submitting_candidate_from_wrong_group_is_misbehavior() { - let context = TestContext { - authorities: { - let mut map = HashMap::new(); - map.insert(AuthorityId(1), (GroupId(3), GroupId(455))); - map - } - }; - - let mut table = create(); - let statement = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }; - - table.import_statement(&context, statement); - - assert_eq!( - table.detected_misbehavior.get(&AuthorityId(1)).unwrap(), - &Misbehavior::UnauthorizedStatement(UnauthorizedStatement { - statement: SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }, - }) - ); - } - - #[test] - fn unauthorized_votes() { - let context = TestContext { - authorities: { - let mut map = HashMap::new(); - map.insert(AuthorityId(1), (GroupId(2), GroupId(455))); - map.insert(AuthorityId(2), (GroupId(3), GroupId(222))); - map - } - }; - - let mut table = create(); - - let candidate_a = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }; - let candidate_a_digest = Digest(100); - - let candidate_b = SignedStatement { - statement: Statement::Candidate(Candidate(3, 987)), - signature: Signature(2), - sender: AuthorityId(2), - }; - let candidate_b_digest = Digest(987); - - table.import_statement(&context, candidate_a); - table.import_statement(&context, candidate_b); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(2))); - - // authority 1 votes for availability on 2's candidate. - let bad_availability_vote = SignedStatement { - statement: Statement::Available(candidate_b_digest.clone()), - signature: Signature(1), - sender: AuthorityId(1), - }; - table.import_statement(&context, bad_availability_vote); - - assert_eq!( - table.detected_misbehavior.get(&AuthorityId(1)).unwrap(), - &Misbehavior::UnauthorizedStatement(UnauthorizedStatement { - statement: SignedStatement { - statement: Statement::Available(candidate_b_digest), - signature: Signature(1), - sender: AuthorityId(1), - }, - }) - ); - - // authority 2 votes for validity on 1's candidate. - let bad_validity_vote = SignedStatement { - statement: Statement::Valid(candidate_a_digest.clone()), - signature: Signature(2), - sender: AuthorityId(2), - }; - table.import_statement(&context, bad_validity_vote); - - assert_eq!( - table.detected_misbehavior.get(&AuthorityId(2)).unwrap(), - &Misbehavior::UnauthorizedStatement(UnauthorizedStatement { - statement: SignedStatement { - statement: Statement::Valid(candidate_a_digest), - signature: Signature(2), - sender: AuthorityId(2), - }, - }) - ); - } - - #[test] - fn validity_double_vote_is_misbehavior() { - let context = TestContext { - authorities: { - let mut map = HashMap::new(); - map.insert(AuthorityId(1), (GroupId(2), GroupId(455))); - map.insert(AuthorityId(2), (GroupId(2), GroupId(246))); - map - } - }; - - let mut table = create(); - let statement = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }; - let candidate_digest = Digest(100); - - table.import_statement(&context, statement); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); - - let valid_statement = SignedStatement { - statement: Statement::Valid(candidate_digest.clone()), - signature: Signature(2), - sender: AuthorityId(2), - }; - - let invalid_statement = SignedStatement { - statement: Statement::Invalid(candidate_digest.clone()), - signature: Signature(2), - sender: AuthorityId(2), - }; - - table.import_statement(&context, valid_statement); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(2))); - - table.import_statement(&context, invalid_statement); - - assert_eq!( - table.detected_misbehavior.get(&AuthorityId(2)).unwrap(), - &Misbehavior::ValidityDoubleVote(ValidityDoubleVote::ValidityAndInvalidity( - candidate_digest, - Signature(2), - Signature(2), - )) - ); - } - - #[test] - fn candidate_double_signature_is_misbehavior() { - let context = TestContext { - authorities: { - let mut map = HashMap::new(); - map.insert(AuthorityId(1), (GroupId(2), GroupId(455))); - map.insert(AuthorityId(2), (GroupId(2), GroupId(246))); - map - } - }; - - let mut table = create(); - let statement = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }; - - table.import_statement(&context, statement); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); - - let invalid_statement = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(999), - sender: AuthorityId(1), - }; - - table.import_statement(&context, invalid_statement); - assert!(table.detected_misbehavior.contains_key(&AuthorityId(1))); - } - - #[test] - fn validity_invalidity_double_signature_is_misbehavior() { - let context = TestContext { - authorities: { - let mut map = HashMap::new(); - map.insert(AuthorityId(1), (GroupId(2), GroupId(455))); - map.insert(AuthorityId(2), (GroupId(2), GroupId(246))); - map.insert(AuthorityId(3), (GroupId(2), GroupId(222))); - map - } - }; - - let mut table = create(); - let statement = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }; - - table.import_statement(&context, statement); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); - - // insert two validity votes from authority 2 with different signatures - { - let statement = SignedStatement { - statement: Statement::Valid(Digest(100)), - signature: Signature(2), - sender: AuthorityId(2), - }; - - table.import_statement(&context, statement); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(2))); - - let invalid_statement = SignedStatement { - statement: Statement::Valid(Digest(100)), - signature: Signature(222), - sender: AuthorityId(2), - }; - - table.import_statement(&context, invalid_statement); - assert!(table.detected_misbehavior.contains_key(&AuthorityId(2))); - } - - // insert two invalidity votes from authority 2 with different signatures - { - let statement = SignedStatement { - statement: Statement::Invalid(Digest(100)), - signature: Signature(3), - sender: AuthorityId(3), - }; - - table.import_statement(&context, statement); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(3))); - - let invalid_statement = SignedStatement { - statement: Statement::Invalid(Digest(100)), - signature: Signature(333), - sender: AuthorityId(3), - }; - - table.import_statement(&context, invalid_statement); - assert!(table.detected_misbehavior.contains_key(&AuthorityId(3))); - } - } - - #[test] - fn issue_and_vote_is_misbehavior() { - let context = TestContext { - authorities: { - let mut map = HashMap::new(); - map.insert(AuthorityId(1), (GroupId(2), GroupId(455))); - map - } - }; - - let mut table = create(); - let statement = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }; - let candidate_digest = Digest(100); - - table.import_statement(&context, statement); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); - - let extra_vote = SignedStatement { - statement: Statement::Valid(candidate_digest.clone()), - signature: Signature(1), - sender: AuthorityId(1), - }; - - table.import_statement(&context, extra_vote); - assert_eq!( - table.detected_misbehavior.get(&AuthorityId(1)).unwrap(), - &Misbehavior::ValidityDoubleVote(ValidityDoubleVote::IssuedAndValidity( - (Candidate(2, 100), Signature(1)), - (Digest(100), Signature(1)), - )) - ); - } - - #[test] - fn candidate_can_be_included() { - let validity_threshold = 6; - let availability_threshold = 34; - - let mut candidate = CandidateData::<TestContext> { - group_id: GroupId(4), - candidate: Candidate(4, 12345), - validity_votes: HashMap::new(), - availability_votes: HashMap::new(), - indicated_bad_by: Vec::new(), - }; - - assert!(!candidate.can_be_included(validity_threshold, availability_threshold)); - - for i in 0..validity_threshold { - candidate.validity_votes.insert(AuthorityId(i + 100), ValidityVote::Valid(Signature(i + 100))); - } - - assert!(!candidate.can_be_included(validity_threshold, availability_threshold)); - - for i in 0..availability_threshold { - candidate.availability_votes.insert(AuthorityId(i + 255), Signature(i + 255)); - } - - assert!(candidate.can_be_included(validity_threshold, availability_threshold)); - - candidate.indicated_bad_by.push(AuthorityId(1024)); - - assert!(!candidate.can_be_included(validity_threshold, availability_threshold)); - } - - #[test] - fn includability_counter() { - let context = TestContext { - authorities: { - let mut map = HashMap::new(); - map.insert(AuthorityId(1), (GroupId(2), GroupId(455))); - map.insert(AuthorityId(2), (GroupId(2), GroupId(455))); - map.insert(AuthorityId(3), (GroupId(2), GroupId(455))); - map.insert(AuthorityId(4), (GroupId(455), GroupId(2))); - map - } - }; - - // have 2/3 validity guarantors note validity. - let mut table = create(); - let statement = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }; - let candidate_digest = Digest(100); - - table.import_statement(&context, statement); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); - assert!(!table.candidate_includable(&candidate_digest, &context)); - assert!(table.includable_count.is_empty()); - - let vote = SignedStatement { - statement: Statement::Valid(candidate_digest.clone()), - signature: Signature(2), - sender: AuthorityId(2), - }; - - table.import_statement(&context, vote); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(2))); - assert!(!table.candidate_includable(&candidate_digest, &context)); - assert!(table.includable_count.is_empty()); - - // have the availability guarantor note validity. - let vote = SignedStatement { - statement: Statement::Available(candidate_digest.clone()), - signature: Signature(4), - sender: AuthorityId(4), - }; - - table.import_statement(&context, vote); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(4))); - assert!(table.candidate_includable(&candidate_digest, &context)); - assert!(table.includable_count.get(&GroupId(2)).is_some()); - - // have the last validity guarantor note invalidity. now it is unincludable. - let vote = SignedStatement { - statement: Statement::Invalid(candidate_digest.clone()), - signature: Signature(3), - sender: AuthorityId(3), - }; - - table.import_statement(&context, vote); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(2))); - assert!(!table.candidate_includable(&candidate_digest, &context)); - assert!(table.includable_count.is_empty()); - } - - #[test] - fn candidate_import_gives_summary() { - let context = TestContext { - authorities: { - let mut map = HashMap::new(); - map.insert(AuthorityId(1), (GroupId(2), GroupId(455))); - map - } - }; - - let mut table = create(); - let statement = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }; - - let summary = table.import_statement(&context, statement) - .expect("candidate import to give summary"); - - assert_eq!(summary.candidate, Digest(100)); - assert_eq!(summary.group_id, GroupId(2)); - assert_eq!(summary.validity_votes, 1); - assert_eq!(summary.availability_votes, 0); - } - - #[test] - fn candidate_vote_gives_summary() { - let context = TestContext { - authorities: { - let mut map = HashMap::new(); - map.insert(AuthorityId(1), (GroupId(2), GroupId(455))); - map.insert(AuthorityId(2), (GroupId(2), GroupId(455))); - map - } - }; - - let mut table = create(); - let statement = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }; - let candidate_digest = Digest(100); - - table.import_statement(&context, statement); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); - - let vote = SignedStatement { - statement: Statement::Valid(candidate_digest.clone()), - signature: Signature(2), - sender: AuthorityId(2), - }; - - let summary = table.import_statement(&context, vote) - .expect("candidate vote to give summary"); - - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(2))); - - assert_eq!(summary.candidate, Digest(100)); - assert_eq!(summary.group_id, GroupId(2)); - assert_eq!(summary.validity_votes, 2); - assert_eq!(summary.availability_votes, 0); - } - - #[test] - fn availability_vote_gives_summary() { - let context = TestContext { - authorities: { - let mut map = HashMap::new(); - map.insert(AuthorityId(1), (GroupId(2), GroupId(455))); - map.insert(AuthorityId(2), (GroupId(5), GroupId(2))); - map - } - }; - - let mut table = create(); - let statement = SignedStatement { - statement: Statement::Candidate(Candidate(2, 100)), - signature: Signature(1), - sender: AuthorityId(1), - }; - let candidate_digest = Digest(100); - - table.import_statement(&context, statement); - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); - - let vote = SignedStatement { - statement: Statement::Available(candidate_digest.clone()), - signature: Signature(2), - sender: AuthorityId(2), - }; - - let summary = table.import_statement(&context, vote) - .expect("candidate vote to give summary"); - - assert!(!table.detected_misbehavior.contains_key(&AuthorityId(2))); - - assert_eq!(summary.candidate, Digest(100)); - assert_eq!(summary.group_id, GroupId(2)); - assert_eq!(summary.validity_votes, 1); - assert_eq!(summary.availability_votes, 1); - } -} diff --git a/substrate/polkadot/statement-table/src/lib.rs b/substrate/polkadot/statement-table/src/lib.rs deleted file mode 100644 index 02457ac4ae4..00000000000 --- a/substrate/polkadot/statement-table/src/lib.rs +++ /dev/null @@ -1,88 +0,0 @@ -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see <http://www.gnu.org/licenses/>. - -//! The statement table. -//! -//! This stores messages other authorities issue about candidates. -//! -//! These messages are used to create a proposal submitted to a BFT consensus process. -//! -//! Proposals are formed of sets of candidates which have the requisite number of -//! validity and availability votes. -//! -//! Each parachain is associated with two sets of authorities: those which can -//! propose and attest to validity of candidates, and those who can only attest -//! to availability. - -extern crate substrate_codec as codec; -extern crate substrate_primitives; -extern crate polkadot_primitives as primitives; - -#[macro_use] -extern crate substrate_codec_derive; - -pub mod generic; - -pub use generic::Table; - -use primitives::parachain::{Id, CandidateReceipt, CandidateSignature as Signature}; -use primitives::{SessionKey, Hash}; - -/// Statements about candidates on the network. -pub type Statement = generic::Statement<CandidateReceipt, Hash>; - -/// Signed statements about candidates. -pub type SignedStatement = generic::SignedStatement<CandidateReceipt, Hash, SessionKey, Signature>; - -/// Kinds of misbehavior, along with proof. -pub type Misbehavior = generic::Misbehavior<CandidateReceipt, Hash, SessionKey, Signature>; - -/// A summary of import of a statement. -pub type Summary = generic::Summary<Hash, Id>; - -/// Context necessary to construct a table. -pub trait Context { - /// Whether a authority is a member of a group. - /// Members are meant to submit candidates and vote on validity. - fn is_member_of(&self, authority: &SessionKey, group: &Id) -> bool; - - /// Whether a authority is an availability guarantor of a group. - /// Guarantors are meant to vote on availability for candidates submitted - /// in a group. - fn is_availability_guarantor_of( - &self, - authority: &SessionKey, - group: &Id, - ) -> bool; - - // requisite number of votes for validity and availability respectively from a group. - fn requisite_votes(&self, group: &Id) -> (usize, usize); -} - -impl<C: Context> generic::Context for C { - type AuthorityId = SessionKey; - type Digest = Hash; - type GroupId = Id; - type Signature = Signature; - type Candidate = CandidateReceipt; - - fn candidate_digest(candidate: &CandidateReceipt) -> Hash { - candidate.hash() - } - - fn candidate_group(candidate: &CandidateReceipt) -> Id { - candidate.parachain_index.clone() - } - - fn is_member_of(&self, authority: &SessionKey, group: &Id) -> bool { - Context::is_member_of(self, authority, group) - } - - fn is_availability_guarantor_of(&self, authority: &SessionKey, group: &Id) -> bool { - Context::is_availability_guarantor_of(self, authority, group) - } - - fn requisite_votes(&self, group: &Id) -> (usize, usize) { - Context::requisite_votes(self, group) - } -} diff --git a/substrate/polkadot/test-parachains/.gitignore b/substrate/polkadot/test-parachains/.gitignore deleted file mode 100644 index 2c96eb1b651..00000000000 --- a/substrate/polkadot/test-parachains/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target/ -Cargo.lock diff --git a/substrate/polkadot/test-parachains/README.md b/substrate/polkadot/test-parachains/README.md deleted file mode 100644 index 4661007f763..00000000000 --- a/substrate/polkadot/test-parachains/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Test Parachains - -Each parachain consists of three parts: a `#![no_std]` library with the main execution logic, a WASM crate which wraps this logic, and a collator node. - -Run `build.sh` in this directory to build all registered test parachains and copy the generated WASM to the `parachain/tests/res` folder. diff --git a/substrate/polkadot/test-parachains/adder/Cargo.toml b/substrate/polkadot/test-parachains/adder/Cargo.toml deleted file mode 100644 index 2b41ba9bfa9..00000000000 --- a/substrate/polkadot/test-parachains/adder/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "adder" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] -description = "Test parachain which adds to a number as its state transition" - -[dependencies] -polkadot-parachain = { path = "../../parachain/", default-features = false } -substrate-codec-derive = { path = "../../../substrate/codec/derive", default-features = false } -tiny-keccak = "1.4" diff --git a/substrate/polkadot/test-parachains/adder/collator/Cargo.toml b/substrate/polkadot/test-parachains/adder/collator/Cargo.toml deleted file mode 100644 index 97ae48cd25c..00000000000 --- a/substrate/polkadot/test-parachains/adder/collator/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "adder-collator" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] - -[dependencies] -adder = { path = ".." } -polkadot-parachain = { path = "../../../parachain" } -polkadot-collator = { path = "../../../collator" } -polkadot-primitives = { path = "../../../primitives" } -ed25519 = { path = "../../../../substrate/ed25519" } -parking_lot = "0.4" -ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" } -futures = "0.1" -exit-future = "0.1.2" diff --git a/substrate/polkadot/test-parachains/adder/collator/src/main.rs b/substrate/polkadot/test-parachains/adder/collator/src/main.rs deleted file mode 100644 index a20e64b2304..00000000000 --- a/substrate/polkadot/test-parachains/adder/collator/src/main.rs +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2018 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 <http://www.gnu.org/licenses/>. - -//! Collator for polkadot - -extern crate adder; -extern crate polkadot_parachain as parachain; -extern crate polkadot_primitives as primitives; -extern crate polkadot_collator as collator; -extern crate ed25519; -extern crate parking_lot; -extern crate ctrlc; -extern crate futures; -extern crate exit_future; - -use std::cell::RefCell; -use std::collections::HashMap; -use std::sync::Arc; - -use adder::{HeadData as AdderHead, BlockData as AdderBody}; -use ed25519::Pair; -use parachain::codec::{Encode, Decode}; -use primitives::parachain::{HeadData, BlockData, Id as ParaId, Message}; -use collator::{InvalidHead, ParachainContext, VersionInfo}; -use parking_lot::Mutex; - -const GENESIS: AdderHead = AdderHead { - number: 0, - parent_hash: [0; 32], - post_state: [1, 27, 77, 3, 221, 140, 1, 241, 4, 145, 67, 207, 156, 76, 129, 126, 75, 22, 127, 29, 27, 131, 229, 198, 240, 241, 13, 137, 186, 30, 123, 206], -}; - -const GENESIS_BODY: AdderBody = AdderBody { - state: 0, - add: 0, -}; - -#[derive(Clone)] -struct AdderContext { - db: Arc<Mutex<HashMap<AdderHead, AdderBody>>>, -} - -/// The parachain context. -impl ParachainContext for AdderContext { - fn produce_candidate<I: IntoIterator<Item=(ParaId, Message)>>( - &self, - last_head: HeadData, - _ingress: I, - ) -> Result<(BlockData, HeadData), InvalidHead> - { - let adder_head = AdderHead::decode(&mut &last_head.0[..]) - .ok_or(InvalidHead)?; - - let mut db = self.db.lock(); - - let last_body = if adder_head == GENESIS { - GENESIS_BODY - } else { - db.get(&adder_head) - .expect("All past bodies stored since this is the only collator") - .clone() - }; - - let next_body = AdderBody { - state: last_body.state.overflowing_add(last_body.add).0, - add: adder_head.number % 100, - }; - - let next_head = ::adder::execute(adder_head.hash(), adder_head, &next_body) - .expect("good execution params; qed"); - - let encoded_head = HeadData(next_head.encode()); - let encoded_body = BlockData(next_body.encode()); - - println!("Created collation for #{}, post-state={}", - next_head.number, next_body.state.overflowing_add(next_body.add).0); - - db.insert(next_head.clone(), next_body); - Ok((encoded_body, encoded_head)) - } -} - -fn main() { - let key = Arc::new(Pair::from_seed(&[1; 32])); - let id: ParaId = 100.into(); - - println!("Starting adder collator with genesis: "); - - { - let encoded = GENESIS.encode(); - println!("Dec: {:?}", encoded); - print!("Hex: 0x"); - for byte in encoded { - print!("{:02x}", byte); - } - - println!(); - } - - // can't use signal directly here because CtrlC takes only `Fn`. - let (exit_send, exit) = exit_future::signal(); - - let exit_send_cell = RefCell::new(Some(exit_send)); - ctrlc::CtrlC::set_handler(move || { - if let Some(exit_send) = exit_send_cell.try_borrow_mut().expect("signal handler not reentrant; qed").take() { - exit_send.fire(); - } - }); - - let context = AdderContext { - db: Arc::new(Mutex::new(HashMap::new())), - }; - - let res = ::collator::run_collator( - context, - id, - exit, - key, - ::std::env::args(), - VersionInfo { - version: "<unknown>", - commit: "<unknown>", - executable_name: "adder-collator", - description: "collator for adder parachain", - author: "parity technologies", - } - ); - - if let Err(e) = res { - println!("{}", e); - } -} diff --git a/substrate/polkadot/test-parachains/adder/src/lib.rs b/substrate/polkadot/test-parachains/adder/src/lib.rs deleted file mode 100644 index a0491ec23b7..00000000000 --- a/substrate/polkadot/test-parachains/adder/src/lib.rs +++ /dev/null @@ -1,79 +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 <http://www.gnu.org/licenses/>. - -//! Basic parachain that adds a number as part of its state. - -#![no_std] - -#[macro_use] -extern crate substrate_codec_derive; - -extern crate polkadot_parachain as parachain; -extern crate tiny_keccak; - -use parachain::codec::{self, Encode}; - -/// Head data for this parachain. -#[derive(Default, Clone, Hash, Eq, PartialEq, Encode, Decode)] -pub struct HeadData { - /// Block number - pub number: u64, - /// parent block keccak256 - pub parent_hash: [u8; 32], - /// hash of post-execution state. - pub post_state: [u8; 32], -} - -impl HeadData { - pub fn hash(&self) -> [u8; 32] { - ::tiny_keccak::keccak256(&self.encode()) - } -} - -/// Block data for this parachain. -#[derive(Default, Clone, Encode, Decode)] -pub struct BlockData { - /// State to begin from. - pub state: u64, - /// Amount to add (overflowing) - pub add: u64, -} - -pub fn hash_state(state: u64) -> [u8; 32] { - ::tiny_keccak::keccak256(state.encode().as_slice()) -} - -/// Start state mismatched with parent header's state hash. -#[derive(Debug)] -pub struct StateMismatch; - -/// Execute a block body on top of given parent head, producing new parent head -/// if valid. -pub fn execute(parent_hash: [u8; 32], parent_head: HeadData, block_data: &BlockData) -> Result<HeadData, StateMismatch> { - debug_assert_eq!(parent_hash, parent_head.hash()); - - if hash_state(block_data.state) != parent_head.post_state { - return Err(StateMismatch); - } - - let new_state = block_data.state.overflowing_add(block_data.add).0; - - Ok(HeadData { - number: parent_head.number + 1, - parent_hash, - post_state: hash_state(new_state), - }) -} diff --git a/substrate/polkadot/test-parachains/adder/src/src b/substrate/polkadot/test-parachains/adder/src/src deleted file mode 120000 index e8310385c56..00000000000 --- a/substrate/polkadot/test-parachains/adder/src/src +++ /dev/null @@ -1 +0,0 @@ -src \ No newline at end of file diff --git a/substrate/polkadot/test-parachains/adder/wasm/Cargo.toml b/substrate/polkadot/test-parachains/adder/wasm/Cargo.toml deleted file mode 100644 index 087b937b646..00000000000 --- a/substrate/polkadot/test-parachains/adder/wasm/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "adder-wasm" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] - -[dependencies] -adder = { path = ".." } -polkadot-parachain = { path = "../../../parachain", default-features = false } -wee_alloc = { version = "0.4.1" } -pwasm-libc = { version = "0.2" } -tiny-keccak = "1.4" - -[lib] -crate-type = ["cdylib"] - -[target.release] -panic = "abort" -lto = true - -[workspace] diff --git a/substrate/polkadot/test-parachains/adder/wasm/src/lib.rs b/substrate/polkadot/test-parachains/adder/wasm/src/lib.rs deleted file mode 100644 index 0e16142647e..00000000000 --- a/substrate/polkadot/test-parachains/adder/wasm/src/lib.rs +++ /dev/null @@ -1,73 +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 <http://www.gnu.org/licenses/>. - -//! WASM validation for adder parachain. - -#![no_std] - -#![feature( - alloc, core_intrinsics, lang_items, panic_implementation, core_panic_info, - alloc_error_handler -)] - -extern crate alloc; -extern crate wee_alloc; -extern crate pwasm_libc; -extern crate adder; -extern crate polkadot_parachain as parachain; -extern crate tiny_keccak; - -// Define global allocator. -#[global_allocator] -static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; - -use core::{intrinsics, panic}; -use parachain::ValidationResult; -use parachain::codec::{Encode, Decode}; -use adder::{HeadData, BlockData}; - -#[panic_implementation] -#[no_mangle] -pub fn panic(_info: &panic::PanicInfo) -> ! { - unsafe { - intrinsics::abort() - } -} - -#[alloc_error_handler] -#[no_mangle] -pub fn oom(_: ::core::alloc::Layout) -> ! { - unsafe { - intrinsics::abort(); - } -} - -#[no_mangle] -pub extern fn validate(offset: usize, len: usize) -> usize { - let params = unsafe { ::parachain::load_params(offset, len) }; - let parent_head = HeadData::decode(&mut ¶ms.parent_head[..]) - .expect("invalid parent head format."); - - let block_data = BlockData::decode(&mut ¶ms.block_data[..]) - .expect("invalid block data format."); - - let parent_hash = ::tiny_keccak::keccak256(¶ms.parent_head[..]); - - match ::adder::execute(parent_hash, parent_head, &block_data) { - Ok(new_head) => parachain::write_result(ValidationResult { head_data: new_head.encode() }), - Err(_) => panic!("execution failure"), - } -} diff --git a/substrate/polkadot/test-parachains/build.sh b/substrate/polkadot/test-parachains/build.sh deleted file mode 100755 index d53869f2d47..00000000000 --- a/substrate/polkadot/test-parachains/build.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -set -e - -# Make LLD produce a binary that imports memory from the outside environment. -export RUSTFLAGS="-C link-arg=--import-memory -C lto=fat -C panic=abort" - -for i in adder -do - cd $i/wasm - cargo +nightly build --target=wasm32-unknown-unknown --release --no-default-features --target-dir target - wasm-gc target/wasm32-unknown-unknown/release/$i'_'wasm.wasm target/wasm32-unknown-unknown/release/$i.wasm - cp target/wasm32-unknown-unknown/release/$i.wasm ../../../parachain/tests/res/ - rm -rf target - cd ../.. -done diff --git a/substrate/polkadot/transaction-pool/Cargo.toml b/substrate/polkadot/transaction-pool/Cargo.toml deleted file mode 100644 index 588db7ef0b1..00000000000 --- a/substrate/polkadot/transaction-pool/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "polkadot-transaction-pool" -version = "0.1.0" -authors = ["Parity Technologies <admin@parity.io>"] - -[dependencies] -log = "0.3.0" -error-chain = "0.12" -parking_lot = "0.4" -polkadot-api = { path = "../api" } -polkadot-primitives = { path = "../primitives" } -polkadot-runtime = { path = "../runtime" } -substrate-client = { path = "../../substrate/client" } -substrate-codec = { path = "../../substrate/codec" } -substrate-keyring = { path = "../../substrate/keyring" } -substrate-extrinsic-pool = { path = "../../substrate/extrinsic-pool" } -substrate-primitives = { path = "../../substrate/primitives" } -substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } -ed25519 = { path = "../../substrate/ed25519" } diff --git a/substrate/polkadot/transaction-pool/README.adoc b/substrate/polkadot/transaction-pool/README.adoc deleted file mode 100644 index 868a3434b3e..00000000000 --- a/substrate/polkadot/transaction-pool/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Polkadot Transactin pool - -placeholder -//TODO Write content :) diff --git a/substrate/polkadot/transaction-pool/src/error.rs b/substrate/polkadot/transaction-pool/src/error.rs deleted file mode 100644 index 99281e8d786..00000000000 --- a/substrate/polkadot/transaction-pool/src/error.rs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2018 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 <http://www.gnu.org/licenses/>. - -use extrinsic_pool::{self, txpool}; -use polkadot_api; -use primitives::Hash; -use runtime::{Address, UncheckedExtrinsic}; - -error_chain! { - links { - Pool(txpool::Error, txpool::ErrorKind); - Api(polkadot_api::Error, polkadot_api::ErrorKind); - } - errors { - /// Unexpected extrinsic format submitted - InvalidExtrinsicFormat { - description("Invalid extrinsic format."), - display("Invalid extrinsic format."), - } - /// Attempted to queue an inherent transaction. - IsInherent(xt: UncheckedExtrinsic) { - description("Inherent transactions cannot be queued."), - display("Inehrent transactions cannot be queued."), - } - /// Attempted to queue a transaction with bad signature. - BadSignature(e: &'static str) { - description("Transaction had bad signature."), - display("Transaction had bad signature: {}", e), - } - /// Attempted to queue a transaction that is already in the pool. - AlreadyImported(hash: Hash) { - description("Transaction is already in the pool."), - display("Transaction {:?} is already in the pool.", hash), - } - /// Import error. - Import(err: Box<::std::error::Error + Send>) { - description("Error importing transaction"), - display("Error importing transaction: {}", err.description()), - } - /// Runtime failure. - UnrecognisedAddress(who: Address) { - description("Unrecognised address in extrinsic"), - display("Unrecognised address in extrinsic: {}", who), - } - /// Extrinsic too large - TooLarge(got: usize, max: usize) { - description("Extrinsic too large"), - display("Extrinsic is too large ({} > {})", got, max), - } - } -} - -impl extrinsic_pool::api::Error for Error { - fn into_pool_error(self) -> ::std::result::Result<txpool::Error, Self> { - match self { - Error(ErrorKind::Pool(e), c) => Ok(txpool::Error(e, c)), - e => Err(e), - } - } -} diff --git a/substrate/polkadot/transaction-pool/src/lib.rs b/substrate/polkadot/transaction-pool/src/lib.rs deleted file mode 100644 index 676b0d9773b..00000000000 --- a/substrate/polkadot/transaction-pool/src/lib.rs +++ /dev/null @@ -1,742 +0,0 @@ -// Copyright 2018 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 <http://www.gnu.org/licenses/>. - -extern crate ed25519; -extern crate substrate_client as client; -extern crate substrate_codec as codec; -extern crate substrate_extrinsic_pool as extrinsic_pool; -extern crate substrate_primitives; -extern crate substrate_runtime_primitives; -extern crate polkadot_runtime as runtime; -extern crate polkadot_primitives as primitives; -extern crate polkadot_api; -extern crate parking_lot; - -#[cfg(test)] -extern crate substrate_keyring; - -#[macro_use] -extern crate error_chain; - -#[macro_use] -extern crate log; - -mod error; - -use std::{ - cmp::Ordering, - collections::HashMap, - ops::Deref, - sync::Arc, -}; - -use codec::{Decode, Encode}; -use extrinsic_pool::{ - api::{ExtrinsicPool, EventStream}, - txpool::{self, Readiness, scoring::{Change, Choice}}, - watcher::Watcher, - Pool, - Listener, -}; -use polkadot_api::PolkadotApi; -use primitives::{AccountId, BlockId, Hash, Index, UncheckedExtrinsic as FutureProofUncheckedExtrinsic}; -use runtime::{Address, UncheckedExtrinsic}; -use substrate_runtime_primitives::traits::{Bounded, Checkable, Hash as HashT, BlakeTwo256}; - -pub use extrinsic_pool::txpool::{Options, Status, LightStatus, VerifiedTransaction as VerifiedTransactionOps}; -pub use error::{Error, ErrorKind, Result}; - -/// Maximal size of a single encoded extrinsic. -/// -/// See also polkadot-consensus::MAX_TRANSACTIONS_SIZE -const MAX_TRANSACTION_SIZE: usize = 4 * 1024 * 1024; - -/// Type alias for convenience. -pub type CheckedExtrinsic = <UncheckedExtrinsic as Checkable<fn(Address) -> std::result::Result<AccountId, &'static str>>>::Checked; - -/// A verified transaction which should be includable and non-inherent. -#[derive(Clone, Debug)] -pub struct VerifiedTransaction { - original: UncheckedExtrinsic, - inner: Option<CheckedExtrinsic>, - sender: Option<AccountId>, - hash: Hash, - encoded_size: usize, -} - -impl VerifiedTransaction { - /// Access the underlying transaction. - pub fn as_transaction(&self) -> &UncheckedExtrinsic { - &self.original - } - - /// Convert to primitive unchecked extrinsic. - pub fn primitive_extrinsic(&self) -> ::primitives::UncheckedExtrinsic { - Decode::decode(&mut self.as_transaction().encode().as_slice()) - .expect("UncheckedExtrinsic shares repr with Vec<u8>; qed") - } - - /// Consume the verified transaction, yielding the checked counterpart. - pub fn into_inner(self) -> Option<CheckedExtrinsic> { - self.inner - } - - /// Get the 256-bit hash of this transaction. - pub fn hash(&self) -> &Hash { - &self.hash - } - - /// Get the account ID of the sender of this transaction. - pub fn sender(&self) -> Option<AccountId> { - self.sender - } - - /// Get the account ID of the sender of this transaction. - pub fn index(&self) -> Index { - self.original.extrinsic.index - } - - /// Get encoded size of the transaction. - pub fn encoded_size(&self) -> usize { - self.encoded_size - } - - /// Returns `true` if the transaction is not yet fully verified. - pub fn is_fully_verified(&self) -> bool { - self.inner.is_some() - } -} - -impl txpool::VerifiedTransaction for VerifiedTransaction { - type Hash = Hash; - type Sender = Option<AccountId>; - - fn hash(&self) -> &Self::Hash { - &self.hash - } - - fn sender(&self) -> &Self::Sender { - &self.sender - } - - fn mem_usage(&self) -> usize { - self.encoded_size // TODO - } -} - -/// Scoring implementation for polkadot transactions. -#[derive(Debug)] -pub struct Scoring; - -impl txpool::Scoring<VerifiedTransaction> for Scoring { - type Score = u64; - type Event = (); - - fn compare(&self, old: &VerifiedTransaction, other: &VerifiedTransaction) -> Ordering { - old.index().cmp(&other.index()) - } - - fn choose(&self, old: &VerifiedTransaction, new: &VerifiedTransaction) -> Choice { - if old.is_fully_verified() { - assert!(new.is_fully_verified(), "Scoring::choose called with transactions from different senders"); - if old.index() == new.index() { - // TODO [ToDr] Do we allow replacement? If yes then it should be Choice::ReplaceOld - return Choice::RejectNew; - } - } - - // This will keep both transactions, even though they have the same indices. - // It's fine for not fully verified transactions, we might also allow it for - // verified transactions but it would mean that only one of the two is actually valid - // (most likely the first to be included in the block). - Choice::InsertNew - } - - fn update_scores( - &self, - xts: &[txpool::Transaction<VerifiedTransaction>], - scores: &mut [Self::Score], - _change: Change<()> - ) { - for i in 0..xts.len() { - if !xts[i].is_fully_verified() { - scores[i] = 0; - } else { - // all the same score since there are no fees. - // TODO: prioritize things like misbehavior or fishermen reports - scores[i] = 1; - } - } - } - - fn should_replace(&self, old: &VerifiedTransaction, _new: &VerifiedTransaction) -> bool { - // Always replace not fully verified transactions. - !old.is_fully_verified() - } -} - -/// Readiness evaluator for polkadot transactions. -pub struct Ready<'a, A: 'a + PolkadotApi> { - at_block: BlockId, - api: &'a A, - known_nonces: HashMap<AccountId, ::primitives::Index>, -} - -impl<'a, A: 'a + PolkadotApi> Ready<'a, A> { - /// Create a new readiness evaluator at the given block. Requires that - /// the ID has already been checked for local corresponding and available state. - fn create(at: BlockId, api: &'a A) -> Self { - Ready { - at_block: at, - api, - known_nonces: HashMap::new(), - } - } -} - -impl<'a, T: 'a + PolkadotApi> Clone for Ready<'a, T> { - fn clone(&self) -> Self { - Ready { - at_block: self.at_block.clone(), - api: self.api, - known_nonces: self.known_nonces.clone(), - } - } -} - -impl<'a, A: 'a + PolkadotApi> txpool::Ready<VerifiedTransaction> for Ready<'a, A> -{ - fn is_ready(&mut self, xt: &VerifiedTransaction) -> Readiness { - let sender = match xt.sender() { - Some(sender) => sender, - None => return Readiness::Future - }; - - trace!(target: "transaction-pool", "Checking readiness of {} (from {})", xt.hash, Hash::from(sender)); - - // TODO: find a way to handle index error properly -- will need changes to - // transaction-pool trait. - let (api, at_block) = (&self.api, &self.at_block); - let next_index = self.known_nonces.entry(sender) - .or_insert_with(|| api.index(at_block, sender).ok().unwrap_or_else(Bounded::max_value)); - - trace!(target: "transaction-pool", "Next index for sender is {}; xt index is {}", next_index, xt.original.extrinsic.index); - - let result = match xt.original.extrinsic.index.cmp(&next_index) { - // TODO: this won't work perfectly since accounts can now be killed, returning the nonce - // to zero. - // We should detect if the index was reset and mark all transactions as `Stale` for cull to work correctly. - // Otherwise those transactions will keep occupying the queue. - // Perhaps we could mark as stale if `index - state_index` > X? - Ordering::Greater => Readiness::Future, - Ordering::Equal => Readiness::Ready, - // TODO [ToDr] Should mark transactions referrencing too old blockhash as `Stale` as well. - Ordering::Less => Readiness::Stale, - }; - - // remember to increment `next_index` - *next_index = next_index.saturating_add(1); - - result - } -} - -pub struct Verifier<'a, A: 'a> { - api: &'a A, - at_block: BlockId, -} - -impl<'a, A> Verifier<'a, A> where - A: 'a + PolkadotApi, -{ - const NO_ACCOUNT: &'static str = "Account not found."; - - fn lookup(&self, address: Address) -> ::std::result::Result<AccountId, &'static str> { - // TODO [ToDr] Consider introducing a cache for this. - match self.api.lookup(&self.at_block, address.clone()) { - Ok(Some(address)) => Ok(address), - Ok(None) => Err(Self::NO_ACCOUNT.into()), - Err(e) => { - error!("Error looking up address: {:?}: {:?}", address, e); - Err("API error.") - }, - } - } -} - -impl<'a, A> txpool::Verifier<UncheckedExtrinsic> for Verifier<'a, A> where - A: 'a + PolkadotApi, -{ - type VerifiedTransaction = VerifiedTransaction; - type Error = Error; - - fn verify_transaction(&self, uxt: UncheckedExtrinsic) -> Result<Self::VerifiedTransaction> { - if !uxt.is_signed() { - bail!(ErrorKind::IsInherent(uxt)) - } - - let encoded = uxt.encode(); - let encoded_size = encoded.len(); - - if encoded_size > MAX_TRANSACTION_SIZE { - bail!(ErrorKind::TooLarge(encoded_size, MAX_TRANSACTION_SIZE)); - } - - let hash = BlakeTwo256::hash(&encoded); - debug!(target: "transaction-pool", "Transaction submitted: {}", ::substrate_primitives::hexdisplay::HexDisplay::from(&encoded)); - - let inner = match uxt.clone().check_with(|a| self.lookup(a)) { - Ok(xt) => Some(xt), - // keep the transaction around in the future pool and attempt to promote it later. - Err(Self::NO_ACCOUNT) => None, - Err(e) => bail!(e), - }; - let sender = inner.as_ref().map(|x| x.signed.clone()); - - if encoded_size < 1024 { - debug!(target: "transaction-pool", "Transaction verified: {} => {:?}", hash, uxt); - } else { - debug!(target: "transaction-pool", "Transaction verified: {} ({} bytes is too large to display)", hash, encoded_size); - } - - Ok(VerifiedTransaction { - original: uxt, - inner, - sender, - hash, - encoded_size - }) - } -} - -/// The polkadot transaction pool. -/// -/// Wraps a `extrinsic_pool::Pool`. -pub struct TransactionPool<A> { - inner: Pool<Hash, VerifiedTransaction, Scoring, Error>, - api: Arc<A>, -} - -impl<A> TransactionPool<A> where - A: PolkadotApi, -{ - /// Create a new transaction pool. - pub fn new(options: Options, api: Arc<A>) -> Self { - TransactionPool { - inner: Pool::new(options, Scoring), - api, - } - } - - /// Attempt to directly import `UncheckedExtrinsic` without going through serialization. - pub fn import_unchecked_extrinsic(&self, block: BlockId, uxt: UncheckedExtrinsic) -> Result<Arc<VerifiedTransaction>> { - let verifier = Verifier { - api: &*self.api, - at_block: block, - }; - self.inner.submit(verifier, vec![uxt]).map(|mut v| v.swap_remove(0)) - } - - /// Retry to import all semi-verified transactions (unknown account indices) - pub fn retry_verification(&self, block: BlockId) -> Result<()> { - let to_reverify = self.inner.remove_sender(None); - let verifier = Verifier { - api: &*self.api, - at_block: block, - }; - - self.inner.submit(verifier, to_reverify.into_iter().map(|tx| tx.original.clone()))?; - Ok(()) - } - - /// Reverify transaction that has been reported incorrect. - /// - /// Returns `Ok(None)` in case the hash is missing, `Err(e)` in case of verification error and new transaction - /// reference otherwise. - /// - /// TODO [ToDr] That method is currently unused, should be used together with BlockBuilder - /// when we detect that particular transaction has failed. - /// In such case we will attempt to remove or re-verify it. - pub fn reverify_transaction(&self, block: BlockId, hash: Hash) -> Result<Option<Arc<VerifiedTransaction>>> { - let result = self.inner.remove(&[hash], false).pop().expect("One hash passed; one result received; qed"); - if let Some(tx) = result { - self.import_unchecked_extrinsic(block, tx.original.clone()).map(Some) - } else { - Ok(None) - } - } - - /// Cull old transactions from the queue. - pub fn cull(&self, block: BlockId) -> Result<usize> { - let ready = Ready::create(block, &*self.api); - Ok(self.inner.cull(None, ready)) - } - - /// Cull transactions from the queue and then compute the pending set. - pub fn cull_and_get_pending<F, T>(&self, block: BlockId, f: F) -> Result<T> where - F: FnOnce(txpool::PendingIterator<VerifiedTransaction, Ready<A>, Scoring, Listener<Hash>>) -> T, - { - let ready = Ready::create(block, &*self.api); - self.inner.cull(None, ready.clone()); - Ok(self.inner.pending(ready, f)) - } - - /// Remove a set of transactions idenitified by hashes. - pub fn remove(&self, hashes: &[Hash], is_valid: bool) -> Vec<Option<Arc<VerifiedTransaction>>> { - self.inner.remove(hashes, is_valid) - } -} - -impl<A> Deref for TransactionPool<A> { - type Target = Pool<Hash, VerifiedTransaction, Scoring, Error>; - - fn deref(&self) -> &Self::Target { - &self.inner - } -} - -// TODO: more general transaction pool, which can handle more kinds of vec-encoded transactions, -// even when runtime is out of date. -impl<A> ExtrinsicPool<FutureProofUncheckedExtrinsic, BlockId, Hash> for TransactionPool<A> where - A: Send + Sync + 'static, - A: PolkadotApi, -{ - type Error = Error; - - fn submit(&self, block: BlockId, xts: Vec<FutureProofUncheckedExtrinsic>) -> Result<Vec<Hash>> { - xts.into_iter() - .map(|xt| xt.encode()) - .map(|encoded| { - let decoded = UncheckedExtrinsic::decode(&mut &encoded[..]).ok_or(ErrorKind::InvalidExtrinsicFormat)?; - let tx = self.import_unchecked_extrinsic(block, decoded)?; - Ok(*tx.hash()) - }) - .collect() - } - - fn submit_and_watch(&self, block: BlockId, xt: FutureProofUncheckedExtrinsic) -> Result<Watcher<Hash>> { - let encoded = xt.encode(); - let decoded = UncheckedExtrinsic::decode(&mut &encoded[..]).ok_or(ErrorKind::InvalidExtrinsicFormat)?; - - let verifier = Verifier { - api: &*self.api, - at_block: block, - }; - - self.inner.submit_and_watch(verifier, decoded) - } - - fn light_status(&self) -> LightStatus { - self.inner.light_status() - } - - fn import_notification_stream(&self) -> EventStream { - self.inner.import_notification_stream() - } -} - -#[cfg(test)] -mod tests { - use std::sync::{atomic::{self, AtomicBool}, Arc}; - use super::TransactionPool; - use substrate_keyring::Keyring::{self, *}; - use codec::{Decode, Encode}; - use polkadot_api::{PolkadotApi, BlockBuilder, Result}; - use primitives::{AccountId, AccountIndex, Block, BlockId, Hash, Index, SessionKey, - UncheckedExtrinsic as FutureProofUncheckedExtrinsic}; - use runtime::{RawAddress, Call, TimestampCall, BareExtrinsic, Extrinsic, UncheckedExtrinsic}; - use primitives::parachain::{DutyRoster, Id as ParaId}; - use substrate_runtime_primitives::{MaybeUnsigned, generic}; - - struct TestBlockBuilder; - impl BlockBuilder for TestBlockBuilder { - fn push_extrinsic(&mut self, _extrinsic: FutureProofUncheckedExtrinsic) -> Result<()> { unimplemented!() } - fn bake(self) -> Result<Block> { unimplemented!() } - } - - fn number_of(at: &BlockId) -> u32 { - match at { - generic::BlockId::Number(n) => *n as u32, - _ => 0, - } - } - - #[derive(Default, Clone)] - struct TestPolkadotApi { - no_lookup: Arc<AtomicBool>, - } - - impl TestPolkadotApi { - fn without_lookup() -> Self { - TestPolkadotApi { - no_lookup: Arc::new(AtomicBool::new(true)), - } - } - - pub fn enable_lookup(&self) { - self.no_lookup.store(false, atomic::Ordering::SeqCst); - } - } - - impl PolkadotApi for TestPolkadotApi { - type BlockBuilder = TestBlockBuilder; - - fn session_keys(&self, _at: &BlockId) -> Result<Vec<SessionKey>> { unimplemented!() } - fn validators(&self, _at: &BlockId) -> Result<Vec<AccountId>> { unimplemented!() } - fn random_seed(&self, _at: &BlockId) -> Result<Hash> { unimplemented!() } - fn duty_roster(&self, _at: &BlockId) -> Result<DutyRoster> { unimplemented!() } - fn timestamp(&self, _at: &BlockId) -> Result<u64> { unimplemented!() } - fn evaluate_block(&self, _at: &BlockId, _block: Block) -> Result<bool> { unimplemented!() } - fn active_parachains(&self, _at: &BlockId) -> Result<Vec<ParaId>> { unimplemented!() } - fn parachain_code(&self, _at: &BlockId, _parachain: ParaId) -> Result<Option<Vec<u8>>> { unimplemented!() } - fn parachain_head(&self, _at: &BlockId, _parachain: ParaId) -> Result<Option<Vec<u8>>> { unimplemented!() } - fn build_block(&self, _at: &BlockId, _inherent: ::primitives::InherentData) -> Result<Self::BlockBuilder> { unimplemented!() } - fn inherent_extrinsics(&self, _at: &BlockId, _inherent: ::primitives::InherentData) -> Result<Vec<Vec<u8>>> { unimplemented!() } - - fn index(&self, _at: &BlockId, _account: AccountId) -> Result<Index> { - Ok((_account[0] as u32) + number_of(_at)) - } - fn lookup(&self, _at: &BlockId, _address: RawAddress<AccountId, AccountIndex>) -> Result<Option<AccountId>> { - match _address { - RawAddress::Id(i) => Ok(Some(i)), - RawAddress::Index(_) if self.no_lookup.load(atomic::Ordering::SeqCst) => Ok(None), - RawAddress::Index(i) => Ok(match (i < 8, i + (number_of(_at) as u64) % 8) { - (false, _) => None, - (_, 0) => Some(Alice.to_raw_public().into()), - (_, 1) => Some(Bob.to_raw_public().into()), - (_, 2) => Some(Charlie.to_raw_public().into()), - (_, 3) => Some(Dave.to_raw_public().into()), - (_, 4) => Some(Eve.to_raw_public().into()), - (_, 5) => Some(Ferdie.to_raw_public().into()), - (_, 6) => Some(One.to_raw_public().into()), - (_, 7) => Some(Two.to_raw_public().into()), - _ => None, - }), - } - } - } - - fn uxt(who: Keyring, nonce: Index, use_id: bool) -> UncheckedExtrinsic { - let sxt = BareExtrinsic { - signed: who.to_raw_public().into(), - index: nonce, - function: Call::Timestamp(TimestampCall::set(0)), - }; - let sig = sxt.using_encoded(|e| who.sign(e)); - UncheckedExtrinsic::new(Extrinsic { - signed: if use_id { RawAddress::Id(sxt.signed) } else { RawAddress::Index( - match who { - Alice => 0, - Bob => 1, - Charlie => 2, - Dave => 3, - Eve => 4, - Ferdie => 5, - One => 6, - Two => 7, - } - )}, - index: sxt.index, - function: sxt.function, - }, MaybeUnsigned(sig.into())).using_encoded(|e| UncheckedExtrinsic::decode(&mut &e[..])).unwrap() - } - - fn pool(api: &TestPolkadotApi) -> TransactionPool<TestPolkadotApi> { - TransactionPool::new(Default::default(), Arc::new(api.clone())) - } - - #[test] - fn id_submission_should_work() { - let api = TestPolkadotApi::default(); - let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, true)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209)]); - } - - #[test] - fn index_submission_should_work() { - let api = TestPolkadotApi::default(); - let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, false)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209)]); - } - - #[test] - fn multiple_id_submission_should_work() { - let api = TestPolkadotApi::default(); - let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, true)).unwrap(); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, true)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209), (Some(Alice.to_raw_public().into()), 210)]); - } - - #[test] - fn multiple_index_submission_should_work() { - let api = TestPolkadotApi::default(); - let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, false)).unwrap(); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, false)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209), (Some(Alice.to_raw_public().into()), 210)]); - } - - #[test] - fn id_based_early_nonce_should_be_culled() { - let api = TestPolkadotApi::default(); - let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 208, true)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![]); - } - - #[test] - fn index_based_early_nonce_should_be_culled() { - let api = TestPolkadotApi::default(); - let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 208, false)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![]); - } - - #[test] - fn id_based_late_nonce_should_be_queued() { - let api = TestPolkadotApi::default(); - let pool = pool(&api); - - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, true)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![]); - - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, true)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209), (Some(Alice.to_raw_public().into()), 210)]); - } - - #[test] - fn index_based_late_nonce_should_be_queued() { - let api = TestPolkadotApi::default(); - let pool = pool(&api); - - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, false)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![]); - - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, false)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209), (Some(Alice.to_raw_public().into()), 210)]); - } - - #[test] - fn index_then_id_submission_should_make_progress() { - let api = TestPolkadotApi::without_lookup(); - let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, false)).unwrap(); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, true)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![]); - - api.enable_lookup(); - pool.retry_verification(BlockId::number(0)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![ - (Some(Alice.to_raw_public().into()), 209), - (Some(Alice.to_raw_public().into()), 210) - ]); - } - - #[test] - fn retrying_verification_might_not_change_anything() { - let api = TestPolkadotApi::without_lookup(); - let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, false)).unwrap(); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, true)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![]); - - pool.retry_verification(BlockId::number(1)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![]); - } - - #[test] - fn id_then_index_submission_should_make_progress() { - let api = TestPolkadotApi::without_lookup(); - let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, true)).unwrap(); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, false)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![ - (Some(Alice.to_raw_public().into()), 209) - ]); - - // when - api.enable_lookup(); - pool.retry_verification(BlockId::number(0)).unwrap(); - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![ - (Some(Alice.to_raw_public().into()), 209), - (Some(Alice.to_raw_public().into()), 210) - ]); - } - - #[test] - fn index_change_should_result_in_second_tx_culled_or_future() { - let api = TestPolkadotApi::default(); - let pool = pool(&api); - let block = BlockId::number(0); - pool.import_unchecked_extrinsic(block, uxt(Alice, 209, false)).unwrap(); - let hash = *pool.import_unchecked_extrinsic(block, uxt(Alice, 210, false)).unwrap().hash(); - - let pending: Vec<_> = pool.cull_and_get_pending(block, |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![ - (Some(Alice.to_raw_public().into()), 209), - (Some(Alice.to_raw_public().into()), 210) - ]); - - // first xt is mined, but that has a side-effect of switching index 0 from Alice to Bob. - // second xt now invalid signature, so it fails. - - // there is no way of reporting this back to the queue right now (TODO). this should cause - // the queue to flush all information regarding the sender index/account. - - // after this, a re-evaluation of the second's readiness should result in it being thrown - // out (or maybe placed in future queue). - let err = pool.reverify_transaction(BlockId::number(1), hash).unwrap_err(); - match *err.kind() { - ::error::ErrorKind::Msg(ref m) if m == "bad signature in extrinsic" => {}, - ref e => assert!(false, "The transaction should be rejected with BadSignature error, got: {:?}", e), - } - - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(1), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); - assert_eq!(pending, vec![]); - - } -} -- GitLab